From bf5fba7b6a59df740f916cba2532786a8b6bf4f8 Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Thu, 7 Dec 2023 16:46:39 -0700 Subject: [PATCH 01/18] feat(contracts): adding barebones staking contracts --- contracts/GitcoinIdentityStaking.sol | 30 + contracts/GitcoinIdentityStakingIcebox.sol | 30 + hardhat.config.ts | 55 +- yarn.lock | 9681 ++++++++++---------- 4 files changed, 4904 insertions(+), 4892 deletions(-) create mode 100644 contracts/GitcoinIdentityStaking.sol create mode 100644 contracts/GitcoinIdentityStakingIcebox.sol diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol new file mode 100644 index 0000000..ee48d54 --- /dev/null +++ b/contracts/GitcoinIdentityStaking.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL +pragma solidity ^0.8.23; + +import {Initializable, AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; + +/** + * @title GitcoinIdentityStaking + * @notice This contract is used to stake GTC on self/community identity + */ + +contract GitcoinIdentityStaking is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + constructor() { + // Grant the minter role to a specified account + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + } + + function _authorizeUpgrade(address) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} diff --git a/contracts/GitcoinIdentityStakingIcebox.sol b/contracts/GitcoinIdentityStakingIcebox.sol new file mode 100644 index 0000000..d0eb207 --- /dev/null +++ b/contracts/GitcoinIdentityStakingIcebox.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL +pragma solidity ^0.8.23; + +import {Initializable, AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; + +/** + * @title GitcoinIdentityStakingIcebox + * @notice This contract is used to temporarily store slashed stake + */ + +contract GitcoinIdentityStakingIcebox is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE"); + + error OnlyManager(); + error OnlyAdmin(); + + constructor() { + // Grant the minter role to a specified account + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + } + + function _authorizeUpgrade(address) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} diff --git a/hardhat.config.ts b/hardhat.config.ts index a4eface..bf493bb 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -14,9 +14,9 @@ let config: HardhatUserConfig = { networks: { hardhat: { forking: { - url: process.env.PROVIDER_URL as string, - }, - }, + url: process.env.PROVIDER_URL as string + } + } }, etherscan: { apiKey: process.env.ETHERSCAN_API_KEY as string, @@ -26,55 +26,58 @@ let config: HardhatUserConfig = { chainId: 59144, urls: { apiURL: "https://api.lineascan.build/api", - browserURL: "https://lineascan.build/", - }, + browserURL: "https://lineascan.build/" + } }, { network: "baseGoerli", chainId: 84531, urls: { apiURL: "https://api-goerli.basescan.org/api", - browserURL: "https://goerli.basescan.org/", - }, + browserURL: "https://goerli.basescan.org/" + } }, { network: "linea-goerli", chainId: 59140, urls: { apiURL: "https://api.lineascan.build/api", - browserURL: "https://goerli.lineascan.build/", - }, - }, - ], + browserURL: "https://goerli.lineascan.build/" + } + } + ] }, gasReporter: { enabled: process.env.REPORT_GAS ? true : false, - coinmarketcap: process.env.COINMARKETCAP_API_KEY, + coinmarketcap: process.env.COINMARKETCAP_API_KEY }, solidity: { settings: { optimizer: { enabled: true, - runs: 200, + runs: 200 }, - viaIR: true, + viaIR: true }, compilers: [ { - version: "0.8.0", + version: "0.8.0" }, { - version: "0.8.9", + version: "0.8.9" }, { - version: "0.8.18", + version: "0.8.18" }, { - version: "0.8.19", + version: "0.8.19" }, - ], - }, + { + version: "0.8.23" + } + ] + } }; if (process.env.DEPLOYER_PRIVATE_KEY && process.env.DEPLOYER_ADDRESS) { @@ -84,7 +87,7 @@ if (process.env.DEPLOYER_PRIVATE_KEY && process.env.DEPLOYER_ADDRESS) { url: process.env.PROVIDER_URL as string, accounts: [process.env.DEPLOYER_PRIVATE_KEY as string], chainId: 11155111, - from: process.env.DEPLOYER_ADDRESS as string, + from: process.env.DEPLOYER_ADDRESS as string }; } if (process.env.OP_PROVIDER_URL) { @@ -92,7 +95,7 @@ if (process.env.DEPLOYER_PRIVATE_KEY && process.env.DEPLOYER_ADDRESS) { url: process.env.OP_PROVIDER_URL as string, accounts: [process.env.DEPLOYER_PRIVATE_KEY as string], chainId: 10, - from: process.env.DEPLOYER_ADDRESS as string, + from: process.env.DEPLOYER_ADDRESS as string }; } if (process.env.OP_GOERLI_PROVIDER_URL) { @@ -100,7 +103,7 @@ if (process.env.DEPLOYER_PRIVATE_KEY && process.env.DEPLOYER_ADDRESS) { url: process.env.OP_GOERLI_PROVIDER_URL as string, accounts: [process.env.DEPLOYER_PRIVATE_KEY as string], chainId: 420, - from: process.env.DEPLOYER_ADDRESS as string, + from: process.env.DEPLOYER_ADDRESS as string }; } } @@ -115,12 +118,12 @@ if ( chainId: 59140, gasPrice: 582000007, url: `https://linea-goerli.infura.io/v3/${process.env.INFURA_KEY ?? ""}`, - accounts: [process.env.DEPLOYER_PRIVATE_KEY ?? ""], + accounts: [process.env.DEPLOYER_PRIVATE_KEY ?? ""] }; config.networks["linea"] = { chainId: 59144, url: `https://linea-mainnet.infura.io/v3/${process.env.INFURA_KEY ?? ""}`, - accounts: [process.env.DEPLOYER_PRIVATE_KEY ?? ""], + accounts: [process.env.DEPLOYER_PRIVATE_KEY ?? ""] }; } @@ -135,7 +138,7 @@ if ( url: process.env.CB_PROVIDER_URL as string, accounts: [process.env.CB_PRIVATE_KEY as string], chainId: 84531, - from: process.env.CB_ADDRESS as string, + from: process.env.CB_ADDRESS as string }; } } diff --git a/yarn.lock b/yarn.lock index 7f7b9ca..a8fe8ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,144 +3,144 @@ "@adraffy/ens-normalize@1.9.2": - "integrity" "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" - "resolved" "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz" - "version" "1.9.2" + version "1.9.2" + resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz" + integrity sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg== "@aws-crypto/sha256-js@1.2.2": - "integrity" "sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==" - "resolved" "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz" - "version" "1.2.2" + version "1.2.2" + resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-1.2.2.tgz" + integrity sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g== dependencies: "@aws-crypto/util" "^1.2.2" "@aws-sdk/types" "^3.1.0" - "tslib" "^1.11.1" + tslib "^1.11.1" "@aws-crypto/util@^1.2.2": - "integrity" "sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==" - "resolved" "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz" - "version" "1.2.2" + version "1.2.2" + resolved "https://registry.npmjs.org/@aws-crypto/util/-/util-1.2.2.tgz" + integrity sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg== dependencies: "@aws-sdk/types" "^3.1.0" "@aws-sdk/util-utf8-browser" "^3.0.0" - "tslib" "^1.11.1" + tslib "^1.11.1" "@aws-sdk/types@^3.1.0": - "integrity" "sha512-8PGMKklSkRKjunFhzM2y5Jm0H2TBu7YRNISdYzXLUHKSP9zlMEYagseKVdmox0zKHf1LXVNuSlUV2b6SRrieCQ==" - "resolved" "https://registry.npmjs.org/@aws-sdk/types/-/types-3.370.0.tgz" - "version" "3.370.0" + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.370.0.tgz" + integrity sha512-8PGMKklSkRKjunFhzM2y5Jm0H2TBu7YRNISdYzXLUHKSP9zlMEYagseKVdmox0zKHf1LXVNuSlUV2b6SRrieCQ== dependencies: "@smithy/types" "^1.1.0" - "tslib" "^2.5.0" + tslib "^2.5.0" "@aws-sdk/util-utf8-browser@^3.0.0": - "integrity" "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==" - "resolved" "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz" - "version" "3.259.0" + version "3.259.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz" + integrity sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw== dependencies: - "tslib" "^2.3.1" + tslib "^2.3.1" "@babel/code-frame@^7.0.0": - "integrity" "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==" - "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== dependencies: "@babel/highlight" "^7.22.5" "@babel/helper-validator-identifier@^7.22.5": - "integrity" "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" - "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== "@babel/highlight@^7.22.5": - "integrity" "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==" - "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz" - "version" "7.22.5" + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== dependencies: "@babel/helper-validator-identifier" "^7.22.5" - "chalk" "^2.0.0" - "js-tokens" "^4.0.0" + chalk "^2.0.0" + js-tokens "^4.0.0" "@chainsafe/as-sha256@^0.3.1": - "integrity" "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" - "resolved" "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz" - "version" "0.3.1" + version "0.3.1" + resolved "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== "@chainsafe/persistent-merkle-tree@^0.4.2": - "integrity" "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==" - "resolved" "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz" - "version" "0.4.2" + version "0.4.2" + resolved "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== dependencies: "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/persistent-merkle-tree@^0.5.0": - "integrity" "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==" - "resolved" "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz" - "version" "0.5.0" + version "0.5.0" + resolved "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== dependencies: "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/ssz@^0.10.0": - "integrity" "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==" - "resolved" "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz" - "version" "0.10.2" + version "0.10.2" + resolved "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== dependencies: "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/persistent-merkle-tree" "^0.5.0" "@chainsafe/ssz@^0.9.2": - "integrity" "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==" - "resolved" "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz" - "version" "0.9.4" + version "0.9.4" + resolved "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== dependencies: "@chainsafe/as-sha256" "^0.3.1" "@chainsafe/persistent-merkle-tree" "^0.4.2" - "case" "^1.6.3" + case "^1.6.3" "@colors/colors@1.5.0": - "integrity" "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" - "resolved" "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" - "version" "1.5.0" + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== "@cspotcode/source-map-support@^0.8.0": - "integrity" "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==" - "resolved" "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" - "version" "0.8.1" + 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== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@ethereum-attestation-service/eas-contracts@^0.27.1": - "integrity" "sha512-ly1N/jLbXJjACDL7dnMSkzViBxxuVc+aMZ3EB1kpFxeMWrXkb7nN6w9gxGTH+m3gJztaKvyMsyr/13pA0OYq6Q==" - "resolved" "https://registry.npmjs.org/@ethereum-attestation-service/eas-contracts/-/eas-contracts-0.27.1.tgz" - "version" "0.27.1" + version "0.27.1" + resolved "https://registry.npmjs.org/@ethereum-attestation-service/eas-contracts/-/eas-contracts-0.27.1.tgz" + integrity sha512-ly1N/jLbXJjACDL7dnMSkzViBxxuVc+aMZ3EB1kpFxeMWrXkb7nN6w9gxGTH+m3gJztaKvyMsyr/13pA0OYq6Q== dependencies: "@typechain/ethers-v5" "^10.2.0" "@typechain/hardhat" "^6.1.5" - "hardhat" "2.13.1" - "typechain" "^8.1.1" + hardhat "2.13.1" + typechain "^8.1.1" "@ethereum-attestation-service/eas-contracts@^1.3.1": - "integrity" "sha512-ervutypAycGbjFnSeNk824DnzK5xf3Jkff9ls24WIQ6iNNiK2jSOeteg3WpXXNooBCsd9Z/E9MTNbEjEaMO1Ng==" - "resolved" "https://registry.npmjs.org/@ethereum-attestation-service/eas-contracts/-/eas-contracts-1.3.1.tgz" - "version" "1.3.1" + version "1.3.1" + resolved "https://registry.npmjs.org/@ethereum-attestation-service/eas-contracts/-/eas-contracts-1.3.1.tgz" + integrity sha512-ervutypAycGbjFnSeNk824DnzK5xf3Jkff9ls24WIQ6iNNiK2jSOeteg3WpXXNooBCsd9Z/E9MTNbEjEaMO1Ng== dependencies: - "hardhat" "2.18.2" + hardhat "2.18.2" "@ethereum-attestation-service/eas-sdk@^0.29.1": - "integrity" "sha512-UjCpRHOCq+KqMQxCei2+kEa4df8Xnemx12d29kvwzxbVJQ2jPBKyvf+vH2DNbk9CVQ6iIabIqc3OvGcom5751g==" - "resolved" "https://registry.npmjs.org/@ethereum-attestation-service/eas-sdk/-/eas-sdk-0.29.1.tgz" - "version" "0.29.1" + version "0.29.1" + resolved "https://registry.npmjs.org/@ethereum-attestation-service/eas-sdk/-/eas-sdk-0.29.1.tgz" + integrity sha512-UjCpRHOCq+KqMQxCei2+kEa4df8Xnemx12d29kvwzxbVJQ2jPBKyvf+vH2DNbk9CVQ6iIabIqc3OvGcom5751g== dependencies: "@ethereum-attestation-service/eas-contracts" "^0.27.1" - "ethers" "^5.7.2" - "js-base64" "^3.7.5" - "multiformats" "9.9.0" - "pako" "^2.1.0" + ethers "^5.7.2" + js-base64 "^3.7.5" + multiformats "9.9.0" + pako "^2.1.0" -"@ethersproject/abi@^5.0.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.7", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0", "@ethersproject/abi@5.7.0": - "integrity" "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==" - "resolved" "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== dependencies: "@ethersproject/address" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" @@ -152,10 +152,10 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/abstract-provider@^5.7.0", "@ethersproject/abstract-provider@5.7.0": - "integrity" "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==" - "resolved" "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/bytes" "^5.7.0" @@ -165,10 +165,10 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" -"@ethersproject/abstract-signer@^5.7.0", "@ethersproject/abstract-signer@5.7.0": - "integrity" "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==" - "resolved" "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + 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== dependencies: "@ethersproject/abstract-provider" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" @@ -176,10 +176,10 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0", "@ethersproject/address@5.7.0": - "integrity" "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==" - "resolved" "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/bytes" "^5.7.0" @@ -187,48 +187,48 @@ "@ethersproject/logger" "^5.7.0" "@ethersproject/rlp" "^5.7.0" -"@ethersproject/base64@^5.7.0", "@ethersproject/base64@5.7.0": - "integrity" "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==" - "resolved" "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: "@ethersproject/bytes" "^5.7.0" -"@ethersproject/basex@^5.7.0", "@ethersproject/basex@5.7.0": - "integrity" "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==" - "resolved" "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/properties" "^5.7.0" -"@ethersproject/bignumber@^5.7.0", "@ethersproject/bignumber@5.7.0": - "integrity" "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==" - "resolved" "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" - "bn.js" "^5.2.1" + bn.js "^5.2.1" -"@ethersproject/bytes@^5.7.0", "@ethersproject/bytes@5.7.0": - "integrity" "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==" - "resolved" "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/constants@^5.7.0", "@ethersproject/constants@5.7.0": - "integrity" "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==" - "resolved" "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/contracts@5.7.0": - "integrity" "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==" - "resolved" "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz" - "version" "5.7.0" + 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== dependencies: "@ethersproject/abi" "^5.7.0" "@ethersproject/abstract-provider" "^5.7.0" @@ -241,10 +241,10 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/transactions" "^5.7.0" -"@ethersproject/hash@^5.7.0", "@ethersproject/hash@5.7.0": - "integrity" "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==" - "resolved" "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== dependencies: "@ethersproject/abstract-signer" "^5.7.0" "@ethersproject/address" "^5.7.0" @@ -256,10 +256,10 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/hdnode@^5.7.0", "@ethersproject/hdnode@5.7.0": - "integrity" "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==" - "resolved" "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== dependencies: "@ethersproject/abstract-signer" "^5.7.0" "@ethersproject/basex" "^5.7.0" @@ -274,10 +274,10 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/json-wallets@^5.7.0", "@ethersproject/json-wallets@5.7.0": - "integrity" "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==" - "resolved" "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + 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== dependencies: "@ethersproject/abstract-signer" "^5.7.0" "@ethersproject/address" "^5.7.0" @@ -290,48 +290,48 @@ "@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" + aes-js "3.0.0" + scrypt-js "3.0.1" -"@ethersproject/keccak256@^5.7.0", "@ethersproject/keccak256@5.7.0": - "integrity" "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==" - "resolved" "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== dependencies: "@ethersproject/bytes" "^5.7.0" - "js-sha3" "0.8.0" + js-sha3 "0.8.0" -"@ethersproject/logger@^5.7.0", "@ethersproject/logger@5.7.0": - "integrity" "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" - "resolved" "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@^5.7.0", "@ethersproject/networks@5.7.1": - "integrity" "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==" - "resolved" "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" - "version" "5.7.1" +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@^5.7.0", "@ethersproject/pbkdf2@5.7.0": - "integrity" "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==" - "resolved" "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@^5.7.0", "@ethersproject/properties@5.7.0": - "integrity" "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==" - "resolved" "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@^5.0.0", "@ethersproject/providers@^5.4.7", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2", "@ethersproject/providers@5.7.2": - "integrity" "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==" - "resolved" "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" - "version" "5.7.2" +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": + version "5.7.2" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== dependencies: "@ethersproject/abstract-provider" "^5.7.0" "@ethersproject/abstract-signer" "^5.7.0" @@ -351,50 +351,50 @@ "@ethersproject/strings" "^5.7.0" "@ethersproject/transactions" "^5.7.0" "@ethersproject/web" "^5.7.0" - "bech32" "1.1.4" - "ws" "7.4.6" + bech32 "1.1.4" + ws "7.4.6" -"@ethersproject/random@^5.7.0", "@ethersproject/random@5.7.0": - "integrity" "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==" - "resolved" "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@^5.7.0", "@ethersproject/rlp@5.7.0": - "integrity" "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==" - "resolved" "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@^5.7.0", "@ethersproject/sha2@5.7.0": - "integrity" "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==" - "resolved" "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/logger" "^5.7.0" - "hash.js" "1.1.7" + hash.js "1.1.7" -"@ethersproject/signing-key@^5.7.0", "@ethersproject/signing-key@5.7.0": - "integrity" "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==" - "resolved" "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + 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== 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" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" "@ethersproject/solidity@5.7.0": - "integrity" "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==" - "resolved" "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" - "version" "5.7.0" + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/bytes" "^5.7.0" @@ -403,19 +403,19 @@ "@ethersproject/sha2" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/strings@^5.7.0", "@ethersproject/strings@5.7.0": - "integrity" "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==" - "resolved" "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" -"@ethersproject/transactions@^5.7.0", "@ethersproject/transactions@5.7.0": - "integrity" "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==" - "resolved" "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== dependencies: "@ethersproject/address" "^5.7.0" "@ethersproject/bignumber" "^5.7.0" @@ -428,18 +428,18 @@ "@ethersproject/signing-key" "^5.7.0" "@ethersproject/units@5.7.0": - "integrity" "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==" - "resolved" "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" - "version" "5.7.0" + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== dependencies: "@ethersproject/bignumber" "^5.7.0" "@ethersproject/constants" "^5.7.0" "@ethersproject/logger" "^5.7.0" "@ethersproject/wallet@5.7.0": - "integrity" "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==" - "resolved" "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" - "version" "5.7.0" + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== dependencies: "@ethersproject/abstract-provider" "^5.7.0" "@ethersproject/abstract-signer" "^5.7.0" @@ -457,10 +457,10 @@ "@ethersproject/transactions" "^5.7.0" "@ethersproject/wordlists" "^5.7.0" -"@ethersproject/web@^5.7.0", "@ethersproject/web@5.7.1": - "integrity" "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==" - "resolved" "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" - "version" "5.7.1" +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== dependencies: "@ethersproject/base64" "^5.7.0" "@ethersproject/bytes" "^5.7.0" @@ -468,10 +468,10 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" -"@ethersproject/wordlists@^5.7.0", "@ethersproject/wordlists@5.7.0": - "integrity" "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==" - "resolved" "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" - "version" "5.7.0" +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== dependencies: "@ethersproject/bytes" "^5.7.0" "@ethersproject/hash" "^5.7.0" @@ -480,105 +480,100 @@ "@ethersproject/strings" "^5.7.0" "@jridgewell/resolve-uri@^3.0.3": - "integrity" "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" - "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" - "version" "3.1.1" + version "3.1.1" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/sourcemap-codec@^1.4.10": - "integrity" "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - "version" "1.4.15" + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@0.3.9": - "integrity" "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==" - "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - "version" "0.3.9" + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" "@metamask/eth-sig-util@^4.0.0": - "integrity" "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==" - "resolved" "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz" - "version" "4.0.1" + 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== 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" - -"@noble/hashes@~1.2.0": - "integrity" "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==" - "resolved" "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" - "version" "1.2.0" + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" "@noble/hashes@1.1.2": - "integrity" "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==" - "resolved" "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz" - "version" "1.1.2" + version "1.1.2" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== -"@noble/hashes@1.2.0": - "integrity" "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==" - "resolved" "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" - "version" "1.2.0" +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== -"@noble/secp256k1@~1.7.0", "@noble/secp256k1@1.7.1": - "integrity" "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==" - "resolved" "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" - "version" "1.7.1" +"@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": + version "1.7.1" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== "@nodelib/fs.scandir@2.1.5": - "integrity" "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - "version" "2.1.5" + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" - "run-parallel" "^1.1.9" + run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - "integrity" "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - "version" "2.0.5" +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - "integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==" - "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - "version" "1.2.8" + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" - "fastq" "^1.6.0" + fastq "^1.6.0" "@nomicfoundation/ethereumjs-block@5.0.0": - "integrity" "sha512-DfhVbqM5DjriguuSv6r3TgOpyXC76oX8D/VEODsSwJQ1bZGqu4xLLfYPPTacpCAYOnewzJsZli+Ao9TBTAo2uw==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.0.tgz" - "version" "5.0.0" + version "5.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.0.tgz" + integrity sha512-DfhVbqM5DjriguuSv6r3TgOpyXC76oX8D/VEODsSwJQ1bZGqu4xLLfYPPTacpCAYOnewzJsZli+Ao9TBTAo2uw== dependencies: "@nomicfoundation/ethereumjs-common" "4.0.0" "@nomicfoundation/ethereumjs-rlp" "5.0.0" "@nomicfoundation/ethereumjs-trie" "6.0.0" "@nomicfoundation/ethereumjs-tx" "5.0.0" "@nomicfoundation/ethereumjs-util" "9.0.0" - "ethereum-cryptography" "0.1.3" - "ethers" "^5.7.1" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" "@nomicfoundation/ethereumjs-block@5.0.2": - "integrity" "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz" - "version" "5.0.2" + version "5.0.2" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== 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" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" "@nomicfoundation/ethereumjs-blockchain@7.0.0": - "integrity" "sha512-cVRCrXZminZr0Mbx2hm0/109GZLn1v5bf0/k+SIbGn50yZm6YCdQt9CgGT0Gk56N2vy8NhXD4apo167m4LWk6Q==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.0.tgz" - "version" "7.0.0" + version "7.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.0.tgz" + integrity sha512-cVRCrXZminZr0Mbx2hm0/109GZLn1v5bf0/k+SIbGn50yZm6YCdQt9CgGT0Gk56N2vy8NhXD4apo167m4LWk6Q== dependencies: "@nomicfoundation/ethereumjs-block" "5.0.0" "@nomicfoundation/ethereumjs-common" "4.0.0" @@ -587,17 +582,17 @@ "@nomicfoundation/ethereumjs-trie" "6.0.0" "@nomicfoundation/ethereumjs-tx" "5.0.0" "@nomicfoundation/ethereumjs-util" "9.0.0" - "abstract-level" "^1.0.3" - "debug" "^4.3.3" - "ethereum-cryptography" "0.1.3" - "level" "^8.0.0" - "lru-cache" "^5.1.1" - "memory-level" "^1.0.0" + 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-blockchain@7.0.2": - "integrity" "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz" - "version" "7.0.2" + 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== dependencies: "@nomicfoundation/ethereumjs-block" "5.0.2" "@nomicfoundation/ethereumjs-common" "4.0.2" @@ -606,183 +601,183 @@ "@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" + 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@4.0.0": - "integrity" "sha512-UPpm5FAGAf2B6hQ8aVgO44Rdo0k73oMMCViqNJcKMlk1s9l3rxwuPTp1l20NiGvNO2Pzqk3chFL+BzmLL2g4wQ==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.0.tgz" - "version" "4.0.0" + version "4.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.0.tgz" + integrity sha512-UPpm5FAGAf2B6hQ8aVgO44Rdo0k73oMMCViqNJcKMlk1s9l3rxwuPTp1l20NiGvNO2Pzqk3chFL+BzmLL2g4wQ== dependencies: "@nomicfoundation/ethereumjs-util" "9.0.0" - "crc-32" "^1.2.0" + crc-32 "^1.2.0" "@nomicfoundation/ethereumjs-common@4.0.2": - "integrity" "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz" - "version" "4.0.2" + version "4.0.2" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== dependencies: "@nomicfoundation/ethereumjs-util" "9.0.2" - "crc-32" "^1.2.0" + crc-32 "^1.2.0" "@nomicfoundation/ethereumjs-ethash@3.0.0": - "integrity" "sha512-6zNv5Y3vNIsxjrsbKjMInVpo8cmR0c7yjZbBpy7NYuIMtm0JKhQoXsiFN56t/1sfn9V3v0wgrkAixo5v6bahpA==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.0.tgz" - "version" "3.0.0" + version "3.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.0.tgz" + integrity sha512-6zNv5Y3vNIsxjrsbKjMInVpo8cmR0c7yjZbBpy7NYuIMtm0JKhQoXsiFN56t/1sfn9V3v0wgrkAixo5v6bahpA== dependencies: "@nomicfoundation/ethereumjs-block" "5.0.0" "@nomicfoundation/ethereumjs-rlp" "5.0.0" "@nomicfoundation/ethereumjs-util" "9.0.0" - "abstract-level" "^1.0.3" - "bigint-crypto-utils" "^3.0.23" - "ethereum-cryptography" "0.1.3" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" "@nomicfoundation/ethereumjs-ethash@3.0.2": - "integrity" "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz" - "version" "3.0.2" + version "3.0.2" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== 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" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" "@nomicfoundation/ethereumjs-evm@2.0.0": - "integrity" "sha512-D+tr3M9sictopr3E20OVgme7YF/d0fU566WKh+ofXwmxapz/Dd8RSLSaVeKgfCI2BkzVA+XqXY08NNCV8w8fWA==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.0.tgz" - "version" "2.0.0" + version "2.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.0.tgz" + integrity sha512-D+tr3M9sictopr3E20OVgme7YF/d0fU566WKh+ofXwmxapz/Dd8RSLSaVeKgfCI2BkzVA+XqXY08NNCV8w8fWA== dependencies: "@ethersproject/providers" "^5.7.1" "@nomicfoundation/ethereumjs-common" "4.0.0" "@nomicfoundation/ethereumjs-tx" "5.0.0" "@nomicfoundation/ethereumjs-util" "9.0.0" - "debug" "^4.3.3" - "ethereum-cryptography" "0.1.3" - "mcl-wasm" "^0.7.1" - "rustbn.js" "~0.2.0" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" "@nomicfoundation/ethereumjs-evm@2.0.2": - "integrity" "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz" - "version" "2.0.2" + 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== 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" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" "@nomicfoundation/ethereumjs-rlp@5.0.0": - "integrity" "sha512-U1A0y330PtGb8Wft4yPVv0myWYJTesi89ItGoB0ICdqz7793KmUhpfQb2vJUXBi98wSdnxkIABO/GmsQvGKVDw==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.0.tgz" - "version" "5.0.0" + version "5.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.0.tgz" + integrity sha512-U1A0y330PtGb8Wft4yPVv0myWYJTesi89ItGoB0ICdqz7793KmUhpfQb2vJUXBi98wSdnxkIABO/GmsQvGKVDw== "@nomicfoundation/ethereumjs-rlp@5.0.2": - "integrity" "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz" - "version" "5.0.2" + version "5.0.2" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== "@nomicfoundation/ethereumjs-statemanager@2.0.0": - "integrity" "sha512-tgXtsx8yIDlxWMN+ThqPtGK0ITAuITrDy+GYIgGrnT6ZtelvXWM7SUYR0Mcv578lmGCoIwyHFtSBqOkOBYHLjw==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.0.tgz" - "version" "2.0.0" + version "2.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.0.tgz" + integrity sha512-tgXtsx8yIDlxWMN+ThqPtGK0ITAuITrDy+GYIgGrnT6ZtelvXWM7SUYR0Mcv578lmGCoIwyHFtSBqOkOBYHLjw== dependencies: "@nomicfoundation/ethereumjs-common" "4.0.0" "@nomicfoundation/ethereumjs-rlp" "5.0.0" - "debug" "^4.3.3" - "ethereum-cryptography" "0.1.3" - "ethers" "^5.7.1" - "js-sdsl" "^4.1.4" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + js-sdsl "^4.1.4" "@nomicfoundation/ethereumjs-statemanager@2.0.2": - "integrity" "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz" - "version" "2.0.2" + version "2.0.2" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== 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" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + ethers "^5.7.1" + js-sdsl "^4.1.4" "@nomicfoundation/ethereumjs-trie@6.0.0": - "integrity" "sha512-YqPWiNxrZvL+Ef7KHqgru1IlaIGXhu78wd2fxNFOvi/NAQBF845dVfTKKXs1L9x0QBRRQRephgxHCKMuISGppw==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.0.tgz" - "version" "6.0.0" + version "6.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.0.tgz" + integrity sha512-YqPWiNxrZvL+Ef7KHqgru1IlaIGXhu78wd2fxNFOvi/NAQBF845dVfTKKXs1L9x0QBRRQRephgxHCKMuISGppw== dependencies: "@nomicfoundation/ethereumjs-rlp" "5.0.0" "@nomicfoundation/ethereumjs-util" "9.0.0" "@types/readable-stream" "^2.3.13" - "ethereum-cryptography" "0.1.3" - "readable-stream" "^3.6.0" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" "@nomicfoundation/ethereumjs-trie@6.0.2": - "integrity" "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz" - "version" "6.0.2" + version "6.0.2" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== 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" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" "@nomicfoundation/ethereumjs-tx@5.0.0": - "integrity" "sha512-LTyxI+zBJ+HuEBblUGbxvfKl1hg1uJlz2XhnszNagiBWQSgLb1vQCa1QaXV5Q8cUDYkr/Xe4NXWiUGEvH4e6lA==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.0.tgz" - "version" "5.0.0" + version "5.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.0.tgz" + integrity sha512-LTyxI+zBJ+HuEBblUGbxvfKl1hg1uJlz2XhnszNagiBWQSgLb1vQCa1QaXV5Q8cUDYkr/Xe4NXWiUGEvH4e6lA== dependencies: "@chainsafe/ssz" "^0.9.2" "@ethersproject/providers" "^5.7.2" "@nomicfoundation/ethereumjs-common" "4.0.0" "@nomicfoundation/ethereumjs-rlp" "5.0.0" "@nomicfoundation/ethereumjs-util" "9.0.0" - "ethereum-cryptography" "0.1.3" + ethereum-cryptography "0.1.3" "@nomicfoundation/ethereumjs-tx@5.0.2": - "integrity" "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz" - "version" "5.0.2" + 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== 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" + ethereum-cryptography "0.1.3" "@nomicfoundation/ethereumjs-util@9.0.0": - "integrity" "sha512-9EG98CsEC9BnI7AY27F4QXZ8Vf0re8R9XoxQ0//KWF+B7quu6GQvgTq1RlNUjGh/XNCCJNf8E3LOY9ULR85wFQ==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.0.tgz" - "version" "9.0.0" + version "9.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.0.tgz" + integrity sha512-9EG98CsEC9BnI7AY27F4QXZ8Vf0re8R9XoxQ0//KWF+B7quu6GQvgTq1RlNUjGh/XNCCJNf8E3LOY9ULR85wFQ== dependencies: "@chainsafe/ssz" "^0.10.0" "@nomicfoundation/ethereumjs-rlp" "5.0.0" - "ethereum-cryptography" "0.1.3" + ethereum-cryptography "0.1.3" "@nomicfoundation/ethereumjs-util@9.0.2": - "integrity" "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz" - "version" "9.0.2" + version "9.0.2" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== dependencies: "@chainsafe/ssz" "^0.10.0" "@nomicfoundation/ethereumjs-rlp" "5.0.2" - "ethereum-cryptography" "0.1.3" + ethereum-cryptography "0.1.3" "@nomicfoundation/ethereumjs-vm@7.0.0": - "integrity" "sha512-eHkEoe/4r4+g+fZyIIlQjBHEjCPFs8CHiIEEMvMfvFrV4hyHnuTg4LH7l92ok7TGZqpWxgMG2JOEUFkNsXrKuQ==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.0.tgz" - "version" "7.0.0" + version "7.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.0.tgz" + integrity sha512-eHkEoe/4r4+g+fZyIIlQjBHEjCPFs8CHiIEEMvMfvFrV4hyHnuTg4LH7l92ok7TGZqpWxgMG2JOEUFkNsXrKuQ== dependencies: "@nomicfoundation/ethereumjs-block" "5.0.0" "@nomicfoundation/ethereumjs-blockchain" "7.0.0" @@ -793,15 +788,15 @@ "@nomicfoundation/ethereumjs-trie" "6.0.0" "@nomicfoundation/ethereumjs-tx" "5.0.0" "@nomicfoundation/ethereumjs-util" "9.0.0" - "debug" "^4.3.3" - "ethereum-cryptography" "0.1.3" - "mcl-wasm" "^0.7.1" - "rustbn.js" "~0.2.0" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" "@nomicfoundation/ethereumjs-vm@7.0.2": - "integrity" "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz" - "version" "7.0.2" + version "7.0.2" + resolved "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== dependencies: "@nomicfoundation/ethereumjs-block" "5.0.2" "@nomicfoundation/ethereumjs-blockchain" "7.0.2" @@ -812,65 +807,110 @@ "@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" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" -"@nomicfoundation/hardhat-chai-matchers@^2.0.0", "@nomicfoundation/hardhat-chai-matchers@^2.0.1": - "integrity" "sha512-qWKndseO8IPt8HiVamgEAutcBOYtX7/O6NPfe7uMNWxY2ywWaiWjDcRFuYYqxrZOMyQZl6ZuiHxbaRNctTUgLw==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.1.tgz" - "version" "2.0.1" +"@nomicfoundation/hardhat-chai-matchers@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.1.tgz" + integrity sha512-qWKndseO8IPt8HiVamgEAutcBOYtX7/O6NPfe7uMNWxY2ywWaiWjDcRFuYYqxrZOMyQZl6ZuiHxbaRNctTUgLw== dependencies: "@types/chai-as-promised" "^7.1.3" - "chai-as-promised" "^7.1.1" - "deep-eql" "^4.0.1" - "ordinal" "^1.0.3" + chai-as-promised "^7.1.1" + deep-eql "^4.0.1" + ordinal "^1.0.3" -"@nomicfoundation/hardhat-ethers@^3.0.0", "@nomicfoundation/hardhat-ethers@^3.0.4": - "integrity" "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz" - "version" "3.0.4" +"@nomicfoundation/hardhat-ethers@^3.0.4": + version "3.0.4" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz" + integrity sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA== dependencies: - "debug" "^4.1.1" - "lodash.isequal" "^4.5.0" + debug "^4.1.1" + lodash.isequal "^4.5.0" "@nomicfoundation/hardhat-network-helpers@^1.0.0": - "integrity" "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz" - "version" "1.0.8" + version "1.0.8" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz" + integrity sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q== dependencies: - "ethereumjs-util" "^7.1.4" + ethereumjs-util "^7.1.4" "@nomicfoundation/hardhat-toolbox@^3.0.0": - "integrity" "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz" - "version" "3.0.0" + version "3.0.0" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz" + integrity sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA== -"@nomicfoundation/hardhat-verify@^1.0.0", "@nomicfoundation/hardhat-verify@^1.0.4": - "integrity" "sha512-zKH7lCgesD9MQbrMsV9DH9NS5Qhkv9K1W9LvbkZWvUQdpyS6zzDyIuJwmfxRKfUGXVlpA2X8nSL3MtxSj3s5aw==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.0.4.tgz" - "version" "1.0.4" +"@nomicfoundation/hardhat-verify@^1.0.4": + version "1.0.4" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.0.4.tgz" + integrity sha512-zKH7lCgesD9MQbrMsV9DH9NS5Qhkv9K1W9LvbkZWvUQdpyS6zzDyIuJwmfxRKfUGXVlpA2X8nSL3MtxSj3s5aw== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" - "cbor" "^8.1.0" - "chalk" "^2.4.2" - "debug" "^4.1.1" - "lodash.clonedeep" "^4.5.0" - "semver" "^6.3.0" - "table" "^6.8.0" - "undici" "^5.14.0" + cbor "^8.1.0" + chalk "^2.4.2" + debug "^4.1.1" + lodash.clonedeep "^4.5.0" + semver "^6.3.0" + table "^6.8.0" + undici "^5.14.0" "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1": - "integrity" "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz" - "version" "0.1.1" + version "0.1.1" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz" + integrity sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz#6e25ccdf6e2d22389c35553b64fe6f3fdaec432c" + integrity sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz#0a224ea50317139caeebcdedd435c28a039d169c" + integrity sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz#dfa085d9ffab9efb2e7b383aed3f557f7687ac2b" + integrity sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz#c9e06b5d513dd3ab02a7ac069c160051675889a4" + integrity sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz#8d328d16839e52571f72f2998c81e46bf320f893" + integrity sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz#9b49d0634b5976bb5ed1604a1e1b736f390959bb" + integrity sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz#e2867af7264ebbcc3131ef837878955dd6a3676f" + integrity sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz#0685f78608dd516c8cdfb4896ed451317e559585" + integrity sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz#c9a44f7108646f083b82e851486e0f6aeb785836" + integrity sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw== "@nomicfoundation/solidity-analyzer@^0.1.0": - "integrity" "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==" - "resolved" "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz" - "version" "0.1.1" + version "0.1.1" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz" + integrity sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg== optionalDependencies: "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.1" "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.1" @@ -884,1600 +924,1554 @@ "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" "@nomiclabs/hardhat-etherscan@^3.0.0": - "integrity" "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==" - "resolved" "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz" - "version" "3.1.7" + version "3.1.7" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz" + integrity sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ== dependencies: "@ethersproject/abi" "^5.1.2" "@ethersproject/address" "^5.0.2" - "cbor" "^8.1.0" - "chalk" "^2.4.2" - "debug" "^4.1.1" - "fs-extra" "^7.0.1" - "lodash" "^4.17.11" - "semver" "^6.3.0" - "table" "^6.8.0" - "undici" "^5.14.0" + cbor "^8.1.0" + chalk "^2.4.2" + debug "^4.1.1" + fs-extra "^7.0.1" + lodash "^4.17.11" + semver "^6.3.0" + table "^6.8.0" + undici "^5.14.0" "@openzeppelin/contracts-upgradeable@^4.9.2": - "integrity" "sha512-siviV3PZV/fHfPaoIC51rf1Jb6iElkYWnNYZ0leO23/ukXuvOyoC/ahy8jqiV7g+++9Nuo3n/rk5ajSN/+d/Sg==" - "resolved" "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.2.tgz" - "version" "4.9.2" + version "4.9.2" + resolved "https://registry.npmjs.org/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.2.tgz" + integrity sha512-siviV3PZV/fHfPaoIC51rf1Jb6iElkYWnNYZ0leO23/ukXuvOyoC/ahy8jqiV7g+++9Nuo3n/rk5ajSN/+d/Sg== "@openzeppelin/contracts@^4.8.2": - "integrity" "sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg==" - "resolved" "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.2.tgz" - "version" "4.9.2" + version "4.9.2" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.2.tgz" + integrity sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg== "@openzeppelin/defender-base-client@^1.47.0": - "integrity" "sha512-y9dDm+gX0MHHEn17W7f7oO3X083JAVMk3YcuXHavSE7kjiCLoFOaZ23joYqoHeaccL10nGt7KOOzZ0sh9iJHTQ==" - "resolved" "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.47.0.tgz" - "version" "1.47.0" + version "1.47.0" + resolved "https://registry.npmjs.org/@openzeppelin/defender-base-client/-/defender-base-client-1.47.0.tgz" + integrity sha512-y9dDm+gX0MHHEn17W7f7oO3X083JAVMk3YcuXHavSE7kjiCLoFOaZ23joYqoHeaccL10nGt7KOOzZ0sh9iJHTQ== dependencies: - "amazon-cognito-identity-js" "^6.0.1" - "async-retry" "^1.3.3" - "axios" "^1.4.0" - "lodash" "^4.17.19" - "node-fetch" "^2.6.0" + amazon-cognito-identity-js "^6.0.1" + async-retry "^1.3.3" + axios "^1.4.0" + lodash "^4.17.19" + node-fetch "^2.6.0" "@openzeppelin/hardhat-upgrades@^2.0.1": - "integrity" "sha512-8yreWaXKyQ+A6w9D1URCCojt2o10DEox2kZkVIpacpF1inauAvc0sLKLJnqPmbYqrid7m6sRZmH9QByJH2H2nQ==" - "resolved" "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-2.0.1.tgz" - "version" "2.0.1" + version "2.0.1" + resolved "https://registry.npmjs.org/@openzeppelin/hardhat-upgrades/-/hardhat-upgrades-2.0.1.tgz" + integrity sha512-8yreWaXKyQ+A6w9D1URCCojt2o10DEox2kZkVIpacpF1inauAvc0sLKLJnqPmbYqrid7m6sRZmH9QByJH2H2nQ== dependencies: "@openzeppelin/defender-base-client" "^1.47.0" "@openzeppelin/platform-deploy-client" "^0.9.0" "@openzeppelin/upgrades-core" "^1.27.0" - "chalk" "^4.1.0" - "debug" "^4.1.1" - "proper-lockfile" "^4.1.1" - "undici" "^5.14.0" + chalk "^4.1.0" + debug "^4.1.1" + proper-lockfile "^4.1.1" + undici "^5.14.0" "@openzeppelin/platform-deploy-client@^0.9.0": - "integrity" "sha512-VepsNJu5B5xhrKMg//hROFljlxlNhlkcgLSKl8rqapKiRFN/dxXtSVmmpNmySrCFnbbV/6twfhuhYGAZiG7oAw==" - "resolved" "https://registry.npmjs.org/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.9.0.tgz" - "version" "0.9.0" + version "0.9.0" + resolved "https://registry.npmjs.org/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.9.0.tgz" + integrity sha512-VepsNJu5B5xhrKMg//hROFljlxlNhlkcgLSKl8rqapKiRFN/dxXtSVmmpNmySrCFnbbV/6twfhuhYGAZiG7oAw== dependencies: "@ethersproject/abi" "^5.6.3" "@openzeppelin/defender-base-client" "^1.47.0" - "axios" "^1.4.0" - "lodash" "^4.17.19" - "node-fetch" "^2.6.0" + axios "^1.4.0" + lodash "^4.17.19" + node-fetch "^2.6.0" "@openzeppelin/upgrades-core@^1.27.0", "@openzeppelin/upgrades-core@^1.27.3": - "integrity" "sha512-IqlSMUkno1XKF4L46aUqZ4BqHxj4dF0BRGrFcKeG2Q0vrsKoazhY67JG9bO+wMYG4zxl6jgmG0bd5ef9HLcLmw==" - "resolved" "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.27.3.tgz" - "version" "1.27.3" - dependencies: - "cbor" "^8.0.0" - "chalk" "^4.1.0" - "compare-versions" "^6.0.0" - "debug" "^4.1.1" - "ethereumjs-util" "^7.0.3" - "minimist" "^1.2.7" - "proper-lockfile" "^4.1.1" - "solidity-ast" "^0.4.15" + version "1.27.3" + resolved "https://registry.npmjs.org/@openzeppelin/upgrades-core/-/upgrades-core-1.27.3.tgz" + integrity sha512-IqlSMUkno1XKF4L46aUqZ4BqHxj4dF0BRGrFcKeG2Q0vrsKoazhY67JG9bO+wMYG4zxl6jgmG0bd5ef9HLcLmw== + dependencies: + cbor "^8.0.0" + chalk "^4.1.0" + compare-versions "^6.0.0" + debug "^4.1.1" + ethereumjs-util "^7.0.3" + minimist "^1.2.7" + proper-lockfile "^4.1.1" + solidity-ast "^0.4.15" "@scure/base@~1.1.0": - "integrity" "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==" - "resolved" "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz" - "version" "1.1.1" + version "1.1.1" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== "@scure/bip32@1.1.5": - "integrity" "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==" - "resolved" "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz" - "version" "1.1.5" + version "1.1.5" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== dependencies: "@noble/hashes" "~1.2.0" "@noble/secp256k1" "~1.7.0" "@scure/base" "~1.1.0" "@scure/bip39@1.1.1": - "integrity" "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==" - "resolved" "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz" - "version" "1.1.1" + version "1.1.1" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== dependencies: "@noble/hashes" "~1.2.0" "@scure/base" "~1.1.0" "@sentry/core@5.30.0": - "integrity" "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==" - "resolved" "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" - "version" "5.30.0" + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== 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" + tslib "^1.9.3" "@sentry/hub@5.30.0": - "integrity" "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==" - "resolved" "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" - "version" "5.30.0" + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: "@sentry/types" "5.30.0" "@sentry/utils" "5.30.0" - "tslib" "^1.9.3" + tslib "^1.9.3" "@sentry/minimal@5.30.0": - "integrity" "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==" - "resolved" "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" - "version" "5.30.0" + 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== dependencies: "@sentry/hub" "5.30.0" "@sentry/types" "5.30.0" - "tslib" "^1.9.3" + tslib "^1.9.3" "@sentry/node@^5.18.1": - "integrity" "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==" - "resolved" "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" - "version" "5.30.0" + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== dependencies: "@sentry/core" "5.30.0" "@sentry/hub" "5.30.0" "@sentry/tracing" "5.30.0" "@sentry/types" "5.30.0" "@sentry/utils" "5.30.0" - "cookie" "^0.4.1" - "https-proxy-agent" "^5.0.0" - "lru_map" "^0.3.3" - "tslib" "^1.9.3" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" "@sentry/tracing@5.30.0": - "integrity" "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==" - "resolved" "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" - "version" "5.30.0" + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== 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" + tslib "^1.9.3" "@sentry/types@5.30.0": - "integrity" "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==" - "resolved" "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" - "version" "5.30.0" + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== "@sentry/utils@5.30.0": - "integrity" "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==" - "resolved" "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" - "version" "5.30.0" + version "5.30.0" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: "@sentry/types" "5.30.0" - "tslib" "^1.9.3" + tslib "^1.9.3" "@smithy/types@^1.1.0": - "integrity" "sha512-tMpkreknl2gRrniHeBtdgQwaOlo39df8RxSrwsHVNIGXULy5XP6KqgScUw2m12D15wnJCKWxVhCX+wbrBW/y7g==" - "resolved" "https://registry.npmjs.org/@smithy/types/-/types-1.1.1.tgz" - "version" "1.1.1" + version "1.1.1" + resolved "https://registry.npmjs.org/@smithy/types/-/types-1.1.1.tgz" + integrity sha512-tMpkreknl2gRrniHeBtdgQwaOlo39df8RxSrwsHVNIGXULy5XP6KqgScUw2m12D15wnJCKWxVhCX+wbrBW/y7g== dependencies: - "tslib" "^2.5.0" + tslib "^2.5.0" "@solidity-parser/parser@^0.14.0": - "integrity" "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==" - "resolved" "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz" - "version" "0.14.5" + version "0.14.5" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz" + integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== dependencies: - "antlr4ts" "^0.5.0-alpha.4" + antlr4ts "^0.5.0-alpha.4" "@solidity-parser/parser@^0.16.0": - "integrity" "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==" - "resolved" "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz" - "version" "0.16.1" + version "0.16.1" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz" + integrity sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw== dependencies: - "antlr4ts" "^0.5.0-alpha.4" + antlr4ts "^0.5.0-alpha.4" "@tsconfig/node10@^1.0.7": - "integrity" "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" - "resolved" "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" - "version" "1.0.9" + version "1.0.9" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": - "integrity" "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" - "resolved" "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" - "version" "1.0.11" + version "1.0.11" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": - "integrity" "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" - "resolved" "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" - "version" "1.0.3" + version "1.0.3" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": - "integrity" "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" - "resolved" "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" - "version" "1.0.4" + version "1.0.4" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== -"@typechain/ethers-v5@^10.2.0", "@typechain/ethers-v5@^10.2.1": - "integrity" "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==" - "resolved" "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz" - "version" "10.2.1" +"@typechain/ethers-v5@^10.2.0": + version "10.2.1" + resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz" + integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== dependencies: - "lodash" "^4.17.15" - "ts-essentials" "^7.0.1" + lodash "^4.17.15" + ts-essentials "^7.0.1" -"@typechain/ethers-v6@^0.4.0", "@typechain/ethers-v6@^0.4.3": - "integrity" "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==" - "resolved" "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz" - "version" "0.4.3" +"@typechain/ethers-v6@^0.4.0": + version "0.4.3" + resolved "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz" + integrity sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA== dependencies: - "lodash" "^4.17.15" - "ts-essentials" "^7.0.1" + lodash "^4.17.15" + ts-essentials "^7.0.1" "@typechain/hardhat@^6.1.5": - "integrity" "sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==" - "resolved" "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.6.tgz" - "version" "6.1.6" + version "6.1.6" + resolved "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.6.tgz" + integrity sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA== dependencies: - "fs-extra" "^9.1.0" + fs-extra "^9.1.0" -"@typechain/hardhat@^8.0.0", "@typechain/hardhat@^8.0.3": - "integrity" "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==" - "resolved" "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz" - "version" "8.0.3" +"@typechain/hardhat@^8.0.3": + version "8.0.3" + resolved "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz" + integrity sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng== dependencies: - "fs-extra" "^9.1.0" + fs-extra "^9.1.0" "@types/bn.js@^4.11.3": - "integrity" "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==" - "resolved" "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" - "version" "4.11.6" + 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== dependencies: "@types/node" "*" "@types/bn.js@^5.1.0": - "integrity" "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==" - "resolved" "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz" - "version" "5.1.1" + version "5.1.1" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== dependencies: "@types/node" "*" "@types/chai-as-promised@^7.1.3": - "integrity" "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==" - "resolved" "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz" - "version" "7.1.5" + 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== dependencies: "@types/chai" "*" -"@types/chai@*", "@types/chai@^4.2.0": - "integrity" "sha512-of+ICnbqjmFCiixUnqRulbylyXQrPqIGf/B3Jax1wIF3DvSheysQxAWvqHhZiW3IQrycvokcLcFQlveGp+vyNg==" - "resolved" "https://registry.npmjs.org/@types/chai/-/chai-4.3.10.tgz" - "version" "4.3.10" +"@types/chai@*": + version "4.3.10" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.10.tgz" + integrity sha512-of+ICnbqjmFCiixUnqRulbylyXQrPqIGf/B3Jax1wIF3DvSheysQxAWvqHhZiW3IQrycvokcLcFQlveGp+vyNg== "@types/concat-stream@^1.6.0": - "integrity" "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==" - "resolved" "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz" - "version" "1.6.1" + version "1.6.1" + resolved "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz" + integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== dependencies: "@types/node" "*" "@types/form-data@0.0.33": - "integrity" "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==" - "resolved" "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz" - "version" "0.0.33" + version "0.0.33" + resolved "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz" + integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== dependencies: "@types/node" "*" "@types/glob@^7.1.1": - "integrity" "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==" - "resolved" "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" - "version" "7.2.0" + version "7.2.0" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" "@types/node" "*" "@types/lru-cache@^5.1.0": - "integrity" "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" - "resolved" "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" - "version" "5.1.1" + version "5.1.1" + resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/minimatch@*": - "integrity" "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" - "resolved" "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" - "version" "5.1.2" + version "5.1.2" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/mocha@>=9.1.0": - "integrity" "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==" - "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz" - "version" "10.0.1" + version "10.0.1" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz" + integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== + +"@types/node@*": + version "20.4.4" + resolved "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz" + integrity sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew== -"@types/node@*", "@types/node@>=12.0.0": - "integrity" "sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz" - "version" "20.4.4" +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== "@types/node@^10.0.3": - "integrity" "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" - "version" "10.17.60" + version "10.17.60" + resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/node@^8.0.0": - "integrity" "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" - "version" "8.10.66" - -"@types/node@18.15.13": - "integrity" "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - "resolved" "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz" - "version" "18.15.13" + version "8.10.66" + resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" + integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== "@types/pbkdf2@^3.0.0": - "integrity" "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==" - "resolved" "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" - "version" "3.1.0" + version "3.1.0" + resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== dependencies: "@types/node" "*" "@types/prettier@^2.1.1": - "integrity" "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" - "resolved" "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" - "version" "2.7.3" + version "2.7.3" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/qs@^6.2.31": - "integrity" "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - "resolved" "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" - "version" "6.9.7" + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/readable-stream@^2.3.13": - "integrity" "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==" - "resolved" "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz" - "version" "2.3.15" + version "2.3.15" + resolved "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== dependencies: "@types/node" "*" - "safe-buffer" "~5.1.1" + safe-buffer "~5.1.1" "@types/secp256k1@^4.0.1": - "integrity" "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==" - "resolved" "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" - "version" "4.0.3" + version "4.0.3" + resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== dependencies: "@types/node" "*" -"abbrev@1", "abbrev@1.0.x": - "integrity" "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==" - "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" - "version" "1.0.9" - -"abort-controller@^3.0.0": - "integrity" "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==" - "resolved" "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "event-target-shim" "^5.0.0" - -"abstract-level@^1.0.0", "abstract-level@^1.0.2", "abstract-level@^1.0.3": - "integrity" "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==" - "resolved" "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz" - "version" "1.0.3" - 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" - -"acorn-walk@^8.1.1": - "integrity" "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" - "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - "version" "8.2.0" - -"acorn@^8.4.1": - "integrity" "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" - "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" - "version" "8.10.0" - -"address@^1.0.1": - "integrity" "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==" - "resolved" "https://registry.npmjs.org/address/-/address-1.2.2.tgz" - "version" "1.2.2" - -"adm-zip@^0.4.16": - "integrity" "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" - "resolved" "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" - "version" "0.4.16" - -"aes-js@3.0.0": - "integrity" "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - "resolved" "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" - "version" "3.0.0" - -"aes-js@4.0.0-beta.5": - "integrity" "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - "resolved" "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz" - "version" "4.0.0-beta.5" - -"agent-base@6": - "integrity" "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==" - "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - "version" "6.0.2" - dependencies: - "debug" "4" - -"aggregate-error@^3.0.0": - "integrity" "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==" - "resolved" "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "clean-stack" "^2.0.0" - "indent-string" "^4.0.0" - -"ajv@^6.12.3", "ajv@^6.12.6": - "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" - "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - "version" "6.12.6" - 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" - -"ajv@^8.0.1": - "integrity" "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==" - "resolved" "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - "version" "8.12.0" - dependencies: - "fast-deep-equal" "^3.1.1" - "json-schema-traverse" "^1.0.0" - "require-from-string" "^2.0.2" - "uri-js" "^4.2.2" - -"amazon-cognito-identity-js@^6.0.1": - "integrity" "sha512-PxBdufgS8uZShrcIFAsRjmqNXsh/4fXOWUGQOUhKLHWWK1pcp/y+VeFF48avXIWefM8XwsT3JlN6m9J2eHt4LA==" - "resolved" "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.1.tgz" - "version" "6.3.1" +abbrev@1, abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== + 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" + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +address@^1.0.1: + version "1.2.2" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.12.3, ajv@^6.12.6: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ajv@^8.0.1: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +amazon-cognito-identity-js@^6.0.1: + version "6.3.1" + resolved "https://registry.npmjs.org/amazon-cognito-identity-js/-/amazon-cognito-identity-js-6.3.1.tgz" + integrity sha512-PxBdufgS8uZShrcIFAsRjmqNXsh/4fXOWUGQOUhKLHWWK1pcp/y+VeFF48avXIWefM8XwsT3JlN6m9J2eHt4LA== dependencies: "@aws-crypto/sha256-js" "1.2.2" - "buffer" "4.9.2" - "fast-base64-decode" "^1.0.0" - "isomorphic-unfetch" "^3.0.0" - "js-cookie" "^2.2.1" - -"amdefine@>=0.0.4": - "integrity" "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==" - "resolved" "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" - "version" "1.0.1" - -"ansi-colors@^4.1.1": - "integrity" "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" - "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" - "version" "4.1.3" - -"ansi-colors@3.2.3": - "integrity" "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" - "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz" - "version" "3.2.3" - -"ansi-colors@4.1.1": - "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" - "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" - "version" "4.1.1" - -"ansi-escapes@^4.3.0": - "integrity" "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==" - "resolved" "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - "version" "4.3.2" - dependencies: - "type-fest" "^0.21.3" - -"ansi-regex@^3.0.0": - "integrity" "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" - "version" "3.0.1" - -"ansi-regex@^4.1.0": - "integrity" "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" - "version" "4.1.1" - -"ansi-regex@^5.0.1": - "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - "version" "5.0.1" - -"ansi-styles@^3.2.0", "ansi-styles@^3.2.1": - "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - "version" "3.2.1" - dependencies: - "color-convert" "^1.9.0" - -"ansi-styles@^4.0.0": - "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "color-convert" "^2.0.1" - -"ansi-styles@^4.1.0": - "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" - "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - "version" "4.3.0" - dependencies: - "color-convert" "^2.0.1" - -"antlr4@^4.11.0": - "integrity" "sha512-zooUbt+UscjnWyOrsuY/tVFL4rwrAGwOivpQmvmUDE22hy/lUA467Rc1rcixyRwcRUIXFYBwv7+dClDSHdmmew==" - "resolved" "https://registry.npmjs.org/antlr4/-/antlr4-4.13.0.tgz" - "version" "4.13.0" - -"antlr4ts@^0.5.0-alpha.4": - "integrity" "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==" - "resolved" "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz" - "version" "0.5.0-alpha.4" - -"anymatch@~3.1.1", "anymatch@~3.1.2": - "integrity" "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==" - "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - "version" "3.1.3" - dependencies: - "normalize-path" "^3.0.0" - "picomatch" "^2.0.4" - -"arg@^4.1.0": - "integrity" "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - "resolved" "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" - "version" "4.1.3" - -"argparse@^1.0.7": - "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - "version" "1.0.10" - dependencies: - "sprintf-js" "~1.0.2" - -"argparse@^2.0.1": - "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - "version" "2.0.1" - -"array-back@^3.0.1", "array-back@^3.1.0": - "integrity" "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==" - "resolved" "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" - "version" "3.1.0" - -"array-back@^4.0.1": - "integrity" "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" - "resolved" "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" - "version" "4.0.2" - -"array-back@^4.0.2": - "integrity" "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" - "resolved" "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" - "version" "4.0.2" - -"array-buffer-byte-length@^1.0.0": - "integrity" "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==" - "resolved" "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "call-bind" "^1.0.2" - "is-array-buffer" "^3.0.1" - -"array-union@^2.1.0": - "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - "version" "2.1.0" - -"array-uniq@1.0.3": - "integrity" "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==" - "resolved" "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" - "version" "1.0.3" - -"array.prototype.reduce@^1.0.5": - "integrity" "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==" - "resolved" "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz" - "version" "1.0.5" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" - "es-array-method-boxes-properly" "^1.0.0" - "is-string" "^1.0.7" - -"asap@~2.0.6": - "integrity" "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" - "version" "2.0.6" - -"asn1@~0.2.3": - "integrity" "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==" - "resolved" "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" - "version" "0.2.6" - dependencies: - "safer-buffer" "~2.1.0" - -"assert-plus@^1.0.0", "assert-plus@1.0.0": - "integrity" "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - "resolved" "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" - "version" "1.0.0" - -"assertion-error@^1.1.0": - "integrity" "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" - "resolved" "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" - "version" "1.1.0" - -"ast-parents@^0.0.1": - "integrity" "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==" - "resolved" "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz" - "version" "0.0.1" - -"astral-regex@^2.0.0": - "integrity" "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" - "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" - "version" "2.0.0" - -"async-retry@^1.3.3": - "integrity" "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==" - "resolved" "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz" - "version" "1.3.3" - dependencies: - "retry" "0.13.1" - -"async@1.x": - "integrity" "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" - "resolved" "https://registry.npmjs.org/async/-/async-1.5.2.tgz" - "version" "1.5.2" - -"asynckit@^0.4.0": - "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - "version" "0.4.0" - -"at-least-node@^1.0.0": - "integrity" "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" - "resolved" "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" - "version" "1.0.0" - -"available-typed-arrays@^1.0.5": - "integrity" "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - "resolved" "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" - "version" "1.0.5" - -"aws-sign2@~0.7.0": - "integrity" "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - "resolved" "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" - "version" "0.7.0" - -"aws4@^1.8.0": - "integrity" "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - "resolved" "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" - "version" "1.12.0" - -"axios@^1.4.0": - "integrity" "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==" - "resolved" "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "follow-redirects" "^1.15.0" - "form-data" "^4.0.0" - "proxy-from-env" "^1.1.0" - -"balanced-match@^1.0.0": - "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - "version" "1.0.2" - -"base-x@^3.0.2": - "integrity" "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==" - "resolved" "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" - "version" "3.0.9" - dependencies: - "safe-buffer" "^5.0.1" - -"base64-js@^1.0.2", "base64-js@^1.3.1": - "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - "version" "1.5.1" - -"bcrypt-pbkdf@^1.0.0": - "integrity" "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==" - "resolved" "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "tweetnacl" "^0.14.3" - -"bech32@1.1.4": - "integrity" "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - "resolved" "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" - "version" "1.1.4" - -"bigint-crypto-utils@^3.0.23": - "integrity" "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==" - "resolved" "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz" - "version" "3.3.0" - -"binary-extensions@^2.0.0": - "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - "version" "2.2.0" - -"blakejs@^1.1.0": - "integrity" "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" - "resolved" "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" - "version" "1.2.1" - -"bn.js@^4.11.0", "bn.js@^4.11.8": - "integrity" "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - "version" "4.12.0" - -"bn.js@^4.11.9": - "integrity" "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" - "version" "4.12.0" - -"bn.js@^5.1.2", "bn.js@^5.2.0", "bn.js@^5.2.1": - "integrity" "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" - "version" "5.2.1" - -"bn.js@4.11.6": - "integrity" "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" - "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" - "version" "4.11.6" - -"brace-expansion@^1.1.7": - "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - "version" "1.1.11" - dependencies: - "balanced-match" "^1.0.0" - "concat-map" "0.0.1" - -"brace-expansion@^2.0.1": - "integrity" "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==" - "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "balanced-match" "^1.0.0" - -"braces@^3.0.2", "braces@~3.0.2": - "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" - "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "fill-range" "^7.0.1" - -"brorand@^1.1.0": - "integrity" "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - "resolved" "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" - "version" "1.1.0" - -"browser-level@^1.0.1": - "integrity" "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==" - "resolved" "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "abstract-level" "^1.0.2" - "catering" "^2.1.1" - "module-error" "^1.0.2" - "run-parallel-limit" "^1.1.0" - -"browser-stdout@1.3.1": - "integrity" "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - "resolved" "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" - "version" "1.3.1" - -"browserify-aes@^1.2.0": - "integrity" "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==" - "resolved" "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" - "version" "1.2.0" - 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" - -"bs58@^4.0.0": - "integrity" "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==" - "resolved" "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "base-x" "^3.0.2" - -"bs58check@^2.1.2": - "integrity" "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==" - "resolved" "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" - "version" "2.1.2" - dependencies: - "bs58" "^4.0.0" - "create-hash" "^1.1.0" - "safe-buffer" "^5.1.2" - -"buffer-from@^1.0.0": - "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - "version" "1.1.2" - -"buffer-xor@^1.0.3": - "integrity" "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - "resolved" "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" - "version" "1.0.3" - -"buffer@^6.0.3": - "integrity" "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==" - "resolved" "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" - "version" "6.0.3" - dependencies: - "base64-js" "^1.3.1" - "ieee754" "^1.2.1" - -"buffer@4.9.2": - "integrity" "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==" - "resolved" "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" - "version" "4.9.2" - dependencies: - "base64-js" "^1.0.2" - "ieee754" "^1.1.4" - "isarray" "^1.0.0" - -"busboy@^1.6.0": - "integrity" "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==" - "resolved" "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" - "version" "1.6.0" - dependencies: - "streamsearch" "^1.1.0" - -"bytes@3.1.2": - "integrity" "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" - "version" "3.1.2" - -"call-bind@^1.0.0", "call-bind@^1.0.2": - "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" - "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "function-bind" "^1.1.1" - "get-intrinsic" "^1.0.2" - -"callsites@^3.0.0": - "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - "version" "3.1.0" - -"camelcase@^5.0.0": - "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - "version" "5.3.1" - -"camelcase@^6.0.0": - "integrity" "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" - "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - "version" "6.3.0" - -"case@^1.6.3": - "integrity" "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==" - "resolved" "https://registry.npmjs.org/case/-/case-1.6.3.tgz" - "version" "1.6.3" - -"caseless@^0.12.0", "caseless@~0.12.0": - "integrity" "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" - "version" "0.12.0" - -"catering@^2.1.0", "catering@^2.1.1": - "integrity" "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==" - "resolved" "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz" - "version" "2.1.1" - -"cbor@^8.0.0", "cbor@^8.1.0": - "integrity" "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==" - "resolved" "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz" - "version" "8.1.0" - dependencies: - "nofilter" "^3.1.0" - -"chai-as-promised@^7.1.1": - "integrity" "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==" - "resolved" "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz" - "version" "7.1.1" - dependencies: - "check-error" "^1.0.2" - -"chai@^4.2.0", "chai@^4.3.7", "chai@>= 2.1.2 < 5": - "integrity" "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==" - "resolved" "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz" - "version" "4.3.7" - dependencies: - "assertion-error" "^1.1.0" - "check-error" "^1.0.2" - "deep-eql" "^4.1.2" - "get-func-name" "^2.0.0" - "loupe" "^2.3.1" - "pathval" "^1.1.1" - "type-detect" "^4.0.5" - -"chalk@^2.0.0", "chalk@^2.4.2": - "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - "version" "2.4.2" - dependencies: - "ansi-styles" "^3.2.1" - "escape-string-regexp" "^1.0.5" - "supports-color" "^5.3.0" - -"chalk@^4.0.0": - "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - "version" "4.1.2" - dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" - -"chalk@^4.1.0": - "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - "version" "4.1.2" - dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" - -"chalk@^4.1.2": - "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" - "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - "version" "4.1.2" - dependencies: - "ansi-styles" "^4.1.0" - "supports-color" "^7.1.0" + buffer "4.9.2" + fast-base64-decode "^1.0.0" + isomorphic-unfetch "^3.0.0" + js-cookie "^2.2.1" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-colors@^4.1.1: + 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== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + 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== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +antlr4@^4.11.0: + version "4.13.0" + resolved "https://registry.npmjs.org/antlr4/-/antlr4-4.13.0.tgz" + integrity sha512-zooUbt+UscjnWyOrsuY/tVFL4rwrAGwOivpQmvmUDE22hy/lUA467Rc1rcixyRwcRUIXFYBwv7+dClDSHdmmew== + +antlr4ts@^0.5.0-alpha.4: + 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== + +anymatch@~3.1.1, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +ast-parents@^0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz" + integrity sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-retry@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz" + integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw== + dependencies: + retry "0.13.1" + +async@1.x: + version "1.5.2" + resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sign2@~0.7.0: + 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== + +aws4@^1.8.0: + version "1.12.0" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" + integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + +axios@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + 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== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.0.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +bigint-crypto-utils@^3.0.23: + 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== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + 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@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + 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" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +case@^1.6.3: + version "1.6.3" + resolved "https://registry.npmjs.org/case/-/case-1.6.3.tgz" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== + +caseless@^0.12.0, caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + +cbor@^8.0.0, cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + +chai-as-promised@^7.1.1: + 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== + dependencies: + check-error "^1.0.2" + +chai@^4.3.7: + version "4.3.7" + resolved "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^4.1.2" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^2.0.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" "charenc@>= 0.0.1": - "integrity" "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" - "resolved" "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" - "version" "0.0.2" - -"check-error@^1.0.2": - "integrity" "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==" - "resolved" "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" - "version" "1.0.2" - -"chokidar@^3.4.0", "chokidar@3.5.3": - "integrity" "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==" - "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - "version" "3.5.3" - 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" + version "0.0.2" + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + +chokidar@3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== + 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" optionalDependencies: - "fsevents" "~2.3.2" - -"chokidar@3.3.0": - "integrity" "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==" - "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz" - "version" "3.3.0" - 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" + fsevents "~2.1.1" + +chokidar@3.5.3, chokidar@^3.4.0: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" optionalDependencies: - "fsevents" "~2.1.1" - -"ci-info@^2.0.0": - "integrity" "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - "resolved" "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" - "version" "2.0.0" - -"cipher-base@^1.0.0", "cipher-base@^1.0.1", "cipher-base@^1.0.3": - "integrity" "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==" - "resolved" "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "inherits" "^2.0.1" - "safe-buffer" "^5.0.1" - -"classic-level@^1.2.0": - "integrity" "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==" - "resolved" "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz" - "version" "1.3.0" - 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" - -"clean-stack@^2.0.0": - "integrity" "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - "resolved" "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" - "version" "2.2.0" - -"cli-table3@^0.5.0": - "integrity" "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==" - "resolved" "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz" - "version" "0.5.1" - dependencies: - "object-assign" "^4.1.0" - "string-width" "^2.1.1" + fsevents "~2.3.2" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +classic-level@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz" + integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== + 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" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-table3@^0.5.0: + version "0.5.1" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" optionalDependencies: - "colors" "^1.1.2" + colors "^1.1.2" -"cli-table3@^0.6.0": - "integrity" "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==" - "resolved" "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" - "version" "0.6.3" +cli-table3@^0.6.0: + version "0.6.3" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" + integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== dependencies: - "string-width" "^4.2.0" + string-width "^4.2.0" optionalDependencies: "@colors/colors" "1.5.0" -"cliui@^5.0.0": - "integrity" "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==" - "resolved" "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "string-width" "^3.1.0" - "strip-ansi" "^5.2.0" - "wrap-ansi" "^5.1.0" - -"cliui@^7.0.2": - "integrity" "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==" - "resolved" "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - "version" "7.0.4" - dependencies: - "string-width" "^4.2.0" - "strip-ansi" "^6.0.0" - "wrap-ansi" "^7.0.0" - -"color-convert@^1.9.0": - "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - "version" "1.9.3" - dependencies: - "color-name" "1.1.3" - -"color-convert@^2.0.1": - "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" - "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "color-name" "~1.1.4" - -"color-name@~1.1.4": - "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - "version" "1.1.4" - -"color-name@1.1.3": - "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - "version" "1.1.3" - -"colors@^1.1.2", "colors@1.4.0": - "integrity" "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" - "resolved" "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" - "version" "1.4.0" - -"combined-stream@^1.0.6", "combined-stream@^1.0.8", "combined-stream@~1.0.6": - "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" - "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - "version" "1.0.8" - dependencies: - "delayed-stream" "~1.0.0" - -"command-exists@^1.2.8": - "integrity" "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" - "resolved" "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" - "version" "1.2.9" - -"command-line-args@^5.1.1": - "integrity" "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==" - "resolved" "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" - "version" "5.2.1" - dependencies: - "array-back" "^3.1.0" - "find-replace" "^3.0.0" - "lodash.camelcase" "^4.3.0" - "typical" "^4.0.0" - -"command-line-usage@^6.1.0": - "integrity" "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==" - "resolved" "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" - "version" "6.1.3" - dependencies: - "array-back" "^4.0.2" - "chalk" "^2.4.2" - "table-layout" "^1.0.2" - "typical" "^5.2.0" - -"commander@^10.0.0": - "integrity" "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==" - "resolved" "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" - "version" "10.0.1" - -"commander@3.0.2": - "integrity" "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - "resolved" "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" - "version" "3.0.2" - -"compare-versions@^6.0.0": - "integrity" "sha512-s2MzYxfRsE9f/ow8hjn7ysa7pod1xhHdQMsgiJtKx6XSNf4x2N1KG4fjrkUmXcP/e9Y2ZX4zB6sHIso0Lm6evQ==" - "resolved" "https://registry.npmjs.org/compare-versions/-/compare-versions-6.0.0.tgz" - "version" "6.0.0" - -"concat-map@0.0.1": - "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - "version" "0.0.1" - -"concat-stream@^1.6.0", "concat-stream@^1.6.2": - "integrity" "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==" - "resolved" "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" - "version" "1.6.2" - dependencies: - "buffer-from" "^1.0.0" - "inherits" "^2.0.3" - "readable-stream" "^2.2.2" - "typedarray" "^0.0.6" - -"cookie@^0.4.1": - "integrity" "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" - "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" - "version" "0.4.2" - -"core-util-is@~1.0.0", "core-util-is@1.0.2": - "integrity" "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" - "version" "1.0.2" - -"cosmiconfig@^8.0.0": - "integrity" "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==" - "resolved" "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz" - "version" "8.2.0" - dependencies: - "import-fresh" "^3.2.1" - "js-yaml" "^4.1.0" - "parse-json" "^5.0.0" - "path-type" "^4.0.0" - -"crc-32@^1.2.0": - "integrity" "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" - "resolved" "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" - "version" "1.2.2" - -"create-hash@^1.1.0", "create-hash@^1.1.2", "create-hash@^1.2.0": - "integrity" "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==" - "resolved" "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "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@^1.1.4", "create-hmac@^1.1.7": - "integrity" "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==" - "resolved" "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" - "version" "1.1.7" - 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" - -"create-require@^1.1.0": - "integrity" "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - "resolved" "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" - "version" "1.1.1" +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colors@1.4.0, colors@^1.1.2: + version "1.4.0" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + 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== + +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + 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== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + +commander@3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +compare-versions@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/compare-versions/-/compare-versions-6.0.0.tgz" + integrity sha512-s2MzYxfRsE9f/ow8hjn7ysa7pod1xhHdQMsgiJtKx6XSNf4x2N1KG4fjrkUmXcP/e9Y2ZX4zB6sHIso0Lm6evQ== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.6.0, concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cosmiconfig@^8.0.0: + version "8.2.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + 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@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + 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" + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== "crypt@>= 0.0.1": - "integrity" "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==" - "resolved" "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" - "version" "0.0.2" - -"dashdash@^1.12.0": - "integrity" "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==" - "resolved" "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" - "version" "1.14.1" - dependencies: - "assert-plus" "^1.0.0" - -"death@^1.1.0": - "integrity" "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==" - "resolved" "https://registry.npmjs.org/death/-/death-1.1.0.tgz" - "version" "1.1.0" - -"debug@^4.1.1", "debug@^4.3.1", "debug@^4.3.3", "debug@4", "debug@4.3.4": - "integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - "version" "4.3.4" - dependencies: - "ms" "2.1.2" - -"debug@3.2.6": - "integrity" "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==" - "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" - "version" "3.2.6" - dependencies: - "ms" "^2.1.1" - -"decamelize@^1.2.0": - "integrity" "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" - "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - "version" "1.2.0" - -"decamelize@^4.0.0": - "integrity" "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" - "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" - "version" "4.0.0" - -"deep-eql@^4.0.1", "deep-eql@^4.1.2": - "integrity" "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==" - "resolved" "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" - "version" "4.1.3" - dependencies: - "type-detect" "^4.0.0" - -"deep-extend@~0.6.0": - "integrity" "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - "resolved" "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" - "version" "0.6.0" - -"deep-is@~0.1.3": - "integrity" "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - "version" "0.1.4" - -"define-properties@^1.1.2", "define-properties@^1.1.3", "define-properties@^1.1.4", "define-properties@^1.2.0": - "integrity" "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==" - "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "has-property-descriptors" "^1.0.0" - "object-keys" "^1.1.1" - -"delayed-stream@~1.0.0": - "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - "version" "1.0.0" - -"depd@2.0.0": - "integrity" "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - "resolved" "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - "version" "2.0.0" - -"detect-port@^1.3.0": - "integrity" "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==" - "resolved" "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" - "version" "1.5.1" - dependencies: - "address" "^1.0.1" - "debug" "4" - -"diff@^4.0.1": - "integrity" "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" - "resolved" "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" - "version" "4.0.2" - -"diff@3.5.0": - "integrity" "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - "resolved" "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" - "version" "3.5.0" - -"diff@5.0.0": - "integrity" "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" - "resolved" "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" - "version" "5.0.0" - -"difflib@^0.2.4": - "integrity" "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==" - "resolved" "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz" - "version" "0.2.4" - dependencies: - "heap" ">= 0.2.0" - -"dir-glob@^3.0.1": - "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" - "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - "version" "3.0.1" - dependencies: - "path-type" "^4.0.0" - -"dotenv@^16.0.3": - "integrity" "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" - "resolved" "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz" - "version" "16.3.1" - -"ecc-jsbn@~0.1.1": - "integrity" "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==" - "resolved" "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" - "version" "0.1.2" - dependencies: - "jsbn" "~0.1.0" - "safer-buffer" "^2.1.0" - -"elliptic@^6.5.2", "elliptic@^6.5.4", "elliptic@6.5.4": - "integrity" "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==" - "resolved" "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" - "version" "6.5.4" - dependencies: - "bn.js" "^4.11.9" - "brorand" "^1.1.0" - "hash.js" "^1.0.0" - "hmac-drbg" "^1.0.1" - "inherits" "^2.0.4" - "minimalistic-assert" "^1.0.1" - "minimalistic-crypto-utils" "^1.0.1" - -"emoji-regex@^7.0.1": - "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" - "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" - "version" "7.0.3" - -"emoji-regex@^8.0.0": - "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - "version" "8.0.0" - -"enquirer@^2.3.0": - "integrity" "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" - "resolved" "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" - "version" "2.3.6" - dependencies: - "ansi-colors" "^4.1.1" - -"env-paths@^2.2.0": - "integrity" "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" - "resolved" "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" - "version" "2.2.1" - -"error-ex@^1.3.1": - "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" - "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - "version" "1.3.2" - dependencies: - "is-arrayish" "^0.2.1" - -"es-abstract@^1.19.0", "es-abstract@^1.20.4", "es-abstract@^1.21.2": - "integrity" "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==" - "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz" - "version" "1.21.3" - dependencies: - "array-buffer-byte-length" "^1.0.0" - "available-typed-arrays" "^1.0.5" - "call-bind" "^1.0.2" - "es-set-tostringtag" "^2.0.1" - "es-to-primitive" "^1.2.1" - "function.prototype.name" "^1.1.5" - "get-intrinsic" "^1.2.1" - "get-symbol-description" "^1.0.0" - "globalthis" "^1.0.3" - "gopd" "^1.0.1" - "has" "^1.0.3" - "has-property-descriptors" "^1.0.0" - "has-proto" "^1.0.1" - "has-symbols" "^1.0.3" - "internal-slot" "^1.0.5" - "is-array-buffer" "^3.0.2" - "is-callable" "^1.2.7" - "is-negative-zero" "^2.0.2" - "is-regex" "^1.1.4" - "is-shared-array-buffer" "^1.0.2" - "is-string" "^1.0.7" - "is-typed-array" "^1.1.10" - "is-weakref" "^1.0.2" - "object-inspect" "^1.12.3" - "object-keys" "^1.1.1" - "object.assign" "^4.1.4" - "regexp.prototype.flags" "^1.5.0" - "safe-regex-test" "^1.0.0" - "string.prototype.trim" "^1.2.7" - "string.prototype.trimend" "^1.0.6" - "string.prototype.trimstart" "^1.0.6" - "typed-array-byte-offset" "^1.0.0" - "typed-array-length" "^1.0.4" - "unbox-primitive" "^1.0.2" - "which-typed-array" "^1.1.10" - -"es-array-method-boxes-properly@^1.0.0": - "integrity" "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" - "resolved" "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" - "version" "1.0.0" - -"es-set-tostringtag@^2.0.1": - "integrity" "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==" - "resolved" "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" - "version" "2.0.1" - dependencies: - "get-intrinsic" "^1.1.3" - "has" "^1.0.3" - "has-tostringtag" "^1.0.0" - -"es-to-primitive@^1.2.1": - "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==" - "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" - "version" "1.2.1" - dependencies: - "is-callable" "^1.1.4" - "is-date-object" "^1.0.1" - "is-symbol" "^1.0.2" - -"escalade@^3.1.1": - "integrity" "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - "resolved" "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - "version" "3.1.1" - -"escape-string-regexp@^1.0.5", "escape-string-regexp@1.0.5": - "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - "version" "1.0.5" - -"escape-string-regexp@4.0.0": - "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - "version" "4.0.0" - -"escodegen@1.8.x": - "integrity" "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==" - "resolved" "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz" - "version" "1.8.1" - dependencies: - "esprima" "^2.7.1" - "estraverse" "^1.9.1" - "esutils" "^2.0.2" - "optionator" "^0.8.1" + version "0.0.2" + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +death@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/death/-/death-1.1.0.tgz" + integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== + +debug@3.2.6: + version "3.2.6" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@4, debug@4.3.4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^4.0.1, deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + 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== + +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +detect-port@^1.3.0: + version "1.5.1" + resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +diff@3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dotenv@^16.0.3: + version "16.3.1" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enquirer@^2.3.0: + version "2.3.6" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: + version "1.21.3" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz" + integrity sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.1" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" + +es-array-method-boxes-properly@^1.0.0: + 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== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz" + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" optionalDependencies: - "source-map" "~0.2.0" + source-map "~0.2.0" -"esprima@^2.7.1", "esprima@2.7.x": - "integrity" "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==" - "resolved" "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" - "version" "2.7.3" +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== -"esprima@^4.0.0": - "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" - "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - "version" "4.0.1" +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -"estraverse@^1.9.1": - "integrity" "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==" - "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz" - "version" "1.9.3" +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz" + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== -"esutils@^2.0.2": - "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - "version" "2.0.3" +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -"eth-gas-reporter@^0.2.25": - "integrity" "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==" - "resolved" "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz" - "version" "0.2.25" +eth-gas-reporter@^0.2.25: + version "0.2.25" + resolved "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz" + integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== 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" - -"ethereum-bloom-filters@^1.0.6": - "integrity" "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==" - "resolved" "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz" - "version" "1.0.10" - dependencies: - "js-sha3" "^0.8.0" - -"ethereum-cryptography@^0.1.3", "ethereum-cryptography@0.1.3": - "integrity" "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==" - "resolved" "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" - "version" "0.1.3" + 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" + +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== 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" - -"ethereum-cryptography@^1.0.3": - "integrity" "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==" - "resolved" "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz" - "version" "1.2.0" + 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" + +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== dependencies: "@noble/hashes" "1.2.0" "@noble/secp256k1" "1.7.1" "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" -"ethereumjs-abi@^0.6.8": - "integrity" "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==" - "resolved" "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" - "version" "0.6.8" +ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== dependencies: - "bn.js" "^4.11.8" - "ethereumjs-util" "^6.0.0" + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" -"ethereumjs-util@^6.0.0": - "integrity" "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==" - "resolved" "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" - "version" "6.2.1" - 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" - -"ethereumjs-util@^6.2.1": - "integrity" "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==" - "resolved" "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" - "version" "6.2.1" +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== 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" - -"ethereumjs-util@^7.0.3", "ethereumjs-util@^7.1.0", "ethereumjs-util@^7.1.4": - "integrity" "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==" - "resolved" "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" - "version" "7.1.5" + 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@^7.0.3, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4: + version "7.1.5" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== 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" - -"ethers@^4.0.40": - "integrity" "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==" - "resolved" "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" - "version" "4.0.49" - 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" - -"ethers@^5.1.3", "ethers@^5.4.7", "ethers@^5.7.1", "ethers@^5.7.2": - "integrity" "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==" - "resolved" "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" - "version" "5.7.2" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethers@^4.0.40: + version "4.0.49" + resolved "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz" + integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== + 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" + +ethers@^5.7.1, ethers@^5.7.2: + version "5.7.2" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== dependencies: "@ethersproject/abi" "5.7.0" "@ethersproject/abstract-provider" "5.7.0" @@ -2510,550 +2504,496 @@ "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -"ethers@^6.1.0", "ethers@^6.4.0", "ethers@^6.6.0", "ethers@^6.6.3", "ethers@6.x": - "integrity" "sha512-g8wLXeRWSGDD0T+wsL3pvyc3aYnmxEEAwH8LSoDTDRhRsmJeNs9YMXlNU7ax2caO+zHkeI9MkHiz6rwxEjN4Mw==" - "resolved" "https://registry.npmjs.org/ethers/-/ethers-6.6.3.tgz" - "version" "6.6.3" +ethers@^6.6.3: + version "6.6.3" + resolved "https://registry.npmjs.org/ethers/-/ethers-6.6.3.tgz" + integrity sha512-g8wLXeRWSGDD0T+wsL3pvyc3aYnmxEEAwH8LSoDTDRhRsmJeNs9YMXlNU7ax2caO+zHkeI9MkHiz6rwxEjN4Mw== dependencies: "@adraffy/ens-normalize" "1.9.2" "@noble/hashes" "1.1.2" "@noble/secp256k1" "1.7.1" "@types/node" "18.15.13" - "aes-js" "4.0.0-beta.5" - "tslib" "2.4.0" - "ws" "8.5.0" - -"ethjs-unit@0.1.6": - "integrity" "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==" - "resolved" "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" - "version" "0.1.6" - dependencies: - "bn.js" "4.11.6" - "number-to-bn" "1.7.0" - -"ethjs-util@^0.1.6", "ethjs-util@0.1.6": - "integrity" "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==" - "resolved" "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" - "version" "0.1.6" - dependencies: - "is-hex-prefixed" "1.0.0" - "strip-hex-prefix" "1.0.0" - -"event-target-shim@^5.0.0": - "integrity" "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" - "resolved" "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" - "version" "5.0.1" - -"evp_bytestokey@^1.0.3": - "integrity" "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==" - "resolved" "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "md5.js" "^1.3.4" - "safe-buffer" "^5.1.1" - -"extend@~3.0.2": - "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" - "version" "3.0.2" - -"extsprintf@^1.2.0", "extsprintf@1.3.0": - "integrity" "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - "resolved" "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" - "version" "1.3.0" - -"fast-base64-decode@^1.0.0": - "integrity" "sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q==" - "resolved" "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz" - "version" "1.0.0" - -"fast-deep-equal@^3.1.1": - "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - "version" "3.1.3" - -"fast-diff@^1.2.0": - "integrity" "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" - "resolved" "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" - "version" "1.3.0" - -"fast-glob@^3.0.3": - "integrity" "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==" - "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz" - "version" "3.3.0" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +ethjs-util@0.1.6, ethjs-util@^0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0, extsprintf@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +fast-base64-decode@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fast-base64-decode/-/fast-base64-decode-1.0.0.tgz" + integrity sha512-qwaScUgUGBYeDNRnbc/KyllVU88Jk1pRHPStuF/lO7B0/RTRLj7U0lkdTAutlBblY08rwZDff6tNU9cjv6j//Q== + +fast-deep-equal@^3.1.1: + 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== + +fast-diff@^1.2.0: + version "1.3.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.0.3: + version "3.3.0" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== 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" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" -"fast-json-stable-stringify@^2.0.0": - "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - "version" "2.1.0" +fast-json-stable-stringify@^2.0.0: + 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== -"fast-levenshtein@~2.0.6": - "integrity" "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - "version" "2.0.6" +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -"fastq@^1.6.0": - "integrity" "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==" - "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" - "version" "1.15.0" +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: - "reusify" "^1.0.4" - -"fill-range@^7.0.1": - "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" - "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - "version" "7.0.1" - dependencies: - "to-regex-range" "^5.0.1" - -"find-replace@^3.0.0": - "integrity" "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==" - "resolved" "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "array-back" "^3.0.1" - -"find-up@^2.1.0": - "integrity" "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "locate-path" "^2.0.0" - -"find-up@^3.0.0", "find-up@3.0.0": - "integrity" "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "locate-path" "^3.0.0" - -"find-up@5.0.0": - "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" - "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "locate-path" "^6.0.0" - "path-exists" "^4.0.0" - -"flat@^4.1.0": - "integrity" "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==" - "resolved" "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz" - "version" "4.1.1" - dependencies: - "is-buffer" "~2.0.3" - -"flat@^5.0.2": - "integrity" "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" - "resolved" "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - "version" "5.0.2" - -"follow-redirects@^1.12.1", "follow-redirects@^1.15.0": - "integrity" "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - "resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" - "version" "1.15.2" - -"for-each@^0.3.3": - "integrity" "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==" - "resolved" "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" - "version" "0.3.3" - dependencies: - "is-callable" "^1.1.3" - -"forever-agent@~0.6.1": - "integrity" "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" - "resolved" "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" - "version" "0.6.1" - -"form-data@^2.2.0": - "integrity" "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==" - "resolved" "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz" - "version" "2.5.1" - dependencies: - "asynckit" "^0.4.0" - "combined-stream" "^1.0.6" - "mime-types" "^2.1.12" - -"form-data@^4.0.0": - "integrity" "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==" - "resolved" "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "asynckit" "^0.4.0" - "combined-stream" "^1.0.8" - "mime-types" "^2.1.12" - -"form-data@~2.3.2": - "integrity" "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==" - "resolved" "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" - "version" "2.3.3" - dependencies: - "asynckit" "^0.4.0" - "combined-stream" "^1.0.6" - "mime-types" "^2.1.12" - -"fp-ts@^1.0.0", "fp-ts@1.19.3": - "integrity" "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" - "resolved" "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" - "version" "1.19.3" - -"fs-extra@^0.30.0": - "integrity" "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==" - "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" - "version" "0.30.0" - dependencies: - "graceful-fs" "^4.1.2" - "jsonfile" "^2.1.0" - "klaw" "^1.0.0" - "path-is-absolute" "^1.0.0" - "rimraf" "^2.2.8" - -"fs-extra@^7.0.0", "fs-extra@^7.0.1": - "integrity" "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==" - "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" - "version" "7.0.1" - dependencies: - "graceful-fs" "^4.1.2" - "jsonfile" "^4.0.0" - "universalify" "^0.1.0" - -"fs-extra@^8.1.0": - "integrity" "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==" - "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" - "version" "8.1.0" - dependencies: - "graceful-fs" "^4.2.0" - "jsonfile" "^4.0.0" - "universalify" "^0.1.0" - -"fs-extra@^9.1.0": - "integrity" "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==" - "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" - "version" "9.1.0" - dependencies: - "at-least-node" "^1.0.0" - "graceful-fs" "^4.2.0" - "jsonfile" "^6.0.1" - "universalify" "^2.0.0" - -"fs-readdir-recursive@^1.1.0": - "integrity" "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" - "resolved" "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" - "version" "1.1.0" - -"fs.realpath@^1.0.0": - "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - "version" "1.0.0" - -"fsevents@~2.1.1": - "integrity" "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==" - "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz" - "version" "2.1.3" - -"fsevents@~2.3.2": - "integrity" "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==" - "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - "version" "2.3.2" - -"function-bind@^1.1.1": - "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - "version" "1.1.1" - -"function.prototype.name@^1.1.5": - "integrity" "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==" - "resolved" "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" - "version" "1.1.5" - dependencies: - "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@^1.0.1": - "integrity" "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - "version" "1.0.1" - -"functions-have-names@^1.2.2", "functions-have-names@^1.2.3": - "integrity" "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - "resolved" "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - "version" "1.2.3" - -"get-caller-file@^2.0.1", "get-caller-file@^2.0.5": - "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - "version" "2.0.5" - -"get-func-name@^2.0.0": - "integrity" "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" - "resolved" "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" - "version" "2.0.0" - -"get-intrinsic@^1.0.2", "get-intrinsic@^1.1.1", "get-intrinsic@^1.1.3", "get-intrinsic@^1.2.0", "get-intrinsic@^1.2.1": - "integrity" "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==" - "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" - "version" "1.2.1" - dependencies: - "function-bind" "^1.1.1" - "has" "^1.0.3" - "has-proto" "^1.0.1" - "has-symbols" "^1.0.3" - -"get-port@^3.1.0": - "integrity" "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==" - "resolved" "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz" - "version" "3.2.0" - -"get-symbol-description@^1.0.0": - "integrity" "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==" - "resolved" "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "call-bind" "^1.0.2" - "get-intrinsic" "^1.1.1" - -"getpass@^0.1.1": - "integrity" "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==" - "resolved" "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" - "version" "0.1.7" - dependencies: - "assert-plus" "^1.0.0" - -"ghost-testrpc@^0.0.2": - "integrity" "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==" - "resolved" "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz" - "version" "0.0.2" - dependencies: - "chalk" "^2.4.2" - "node-emoji" "^1.10.0" - -"glob-parent@^5.1.2", "glob-parent@~5.1.0", "glob-parent@~5.1.2": - "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" - "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - "version" "5.1.2" - dependencies: - "is-glob" "^4.0.1" - -"glob@^5.0.15": - "integrity" "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==" - "resolved" "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" - "version" "5.0.15" - dependencies: - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "2 || 3" - "once" "^1.3.0" - "path-is-absolute" "^1.0.0" - -"glob@^7.0.0", "glob@^7.1.3", "glob@7.2.0": - "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" - "version" "7.2.0" - 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" - -"glob@^8.0.3": - "integrity" "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==" - "resolved" "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - "version" "8.1.0" - dependencies: - "fs.realpath" "^1.0.0" - "inflight" "^1.0.4" - "inherits" "2" - "minimatch" "^5.0.1" - "once" "^1.3.0" - -"glob@7.1.3": - "integrity" "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz" - "version" "7.1.3" - 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" - -"glob@7.1.7": - "integrity" "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==" - "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" - "version" "7.1.7" - 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" - -"global-modules@^2.0.0": - "integrity" "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==" - "resolved" "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "global-prefix" "^3.0.0" - -"global-prefix@^3.0.0": - "integrity" "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==" - "resolved" "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "ini" "^1.3.5" - "kind-of" "^6.0.2" - "which" "^1.3.1" - -"globalthis@^1.0.3": - "integrity" "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==" - "resolved" "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "define-properties" "^1.1.3" - -"globby@^10.0.1": - "integrity" "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==" - "resolved" "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz" - "version" "10.0.2" + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-replace@^3.0.0: + 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== + dependencies: + array-back "^3.0.1" + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^2.1.0: + 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== + dependencies: + locate-path "^2.0.0" + +flat@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz" + integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== + dependencies: + is-buffer "~2.0.3" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.12.1, follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^2.2.0: + version "2.5.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +fp-ts@1.19.3, fp-ts@^1.0.0: + version "1.19.3" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz" + integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^7.0.0, fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + 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== + dependencies: + 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@^1.0.1: + 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== + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + 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== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-port@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz" + integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +ghost-testrpc@^0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz" + integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== + dependencies: + chalk "^2.4.2" + node-emoji "^1.10.0" + +glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.1.3: + version "7.1.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + 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" + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + 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" + +glob@7.2.0, glob@^7.0.0, glob@^7.1.3: + version "7.2.0" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + 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" + +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== 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" - -"gopd@^1.0.1": - "integrity" "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==" - "resolved" "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "get-intrinsic" "^1.1.3" - -"graceful-fs@^4.1.2", "graceful-fs@^4.1.6", "graceful-fs@^4.1.9", "graceful-fs@^4.2.0", "graceful-fs@^4.2.4": - "integrity" "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - "version" "4.2.11" - -"growl@1.10.5": - "integrity" "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" - "resolved" "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" - "version" "1.10.5" - -"handlebars@^4.0.1": - "integrity" "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==" - "resolved" "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" - "version" "4.7.7" - dependencies: - "minimist" "^1.2.5" - "neo-async" "^2.6.0" - "source-map" "^0.6.1" - "wordwrap" "^1.0.0" + 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" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +handlebars@^4.0.1: + version "4.7.7" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" optionalDependencies: - "uglify-js" "^3.1.4" + uglify-js "^3.1.4" -"har-schema@^2.0.0": - "integrity" "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - "resolved" "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" - "version" "2.0.0" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== -"har-validator@~5.1.3": - "integrity" "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==" - "resolved" "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" - "version" "5.1.5" +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - "ajv" "^6.12.3" - "har-schema" "^2.0.0" + ajv "^6.12.3" + har-schema "^2.0.0" -"hardhat-contract-sizer@^2.10.0": - "integrity" "sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==" - "resolved" "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz" - "version" "2.10.0" +hardhat-contract-sizer@^2.10.0: + version "2.10.0" + resolved "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz" + integrity sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA== dependencies: - "chalk" "^4.0.0" - "cli-table3" "^0.6.0" - "strip-ansi" "^6.0.0" + chalk "^4.0.0" + cli-table3 "^0.6.0" + strip-ansi "^6.0.0" -"hardhat-gas-reporter@^1.0.8": - "integrity" "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==" - "resolved" "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz" - "version" "1.0.9" +hardhat-gas-reporter@^1.0.8: + version "1.0.9" + resolved "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz" + integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== dependencies: - "array-uniq" "1.0.3" - "eth-gas-reporter" "^0.2.25" - "sha1" "^1.1.1" + array-uniq "1.0.3" + eth-gas-reporter "^0.2.25" + sha1 "^1.1.1" -"hardhat@^2.0.0", "hardhat@^2.0.2", "hardhat@^2.0.4", "hardhat@^2.11.0", "hardhat@^2.17.2", "hardhat@^2.9.4", "hardhat@^2.9.5", "hardhat@^2.9.9", "hardhat@2.18.2": - "integrity" "sha512-lUVmJg7DsKcUCDpqv57CJl6vHqo/1PeHSfM3+WIa8UtRKmXyVTj1qQK01TDiuetkZBVg9Dn52qU+ZwaJQynaKA==" - "resolved" "https://registry.npmjs.org/hardhat/-/hardhat-2.18.2.tgz" - "version" "2.18.2" - 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" - -"hardhat@2.13.1": - "integrity" "sha512-ZZL7LQxHmbw4JQJsiEv2qE35nbR+isr2sIdtgZVPp0+zWqRkpr1OT7gmvhCNYfjpEPyfjZIxWriQWlphJhVPLQ==" - "resolved" "https://registry.npmjs.org/hardhat/-/hardhat-2.13.1.tgz" - "version" "2.13.1" +hardhat@2.13.1: + version "2.13.1" + resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.13.1.tgz" + integrity sha512-ZZL7LQxHmbw4JQJsiEv2qE35nbR+isr2sIdtgZVPp0+zWqRkpr1OT7gmvhCNYfjpEPyfjZIxWriQWlphJhVPLQ== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" @@ -3071,2614 +3011,2623 @@ "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" - "abort-controller" "^3.0.0" - "adm-zip" "^0.4.16" - "aggregate-error" "^3.0.0" - "ansi-escapes" "^4.3.0" - "chalk" "^2.4.2" - "chokidar" "^3.4.0" - "ci-info" "^2.0.0" - "debug" "^4.1.1" - "enquirer" "^2.3.0" - "env-paths" "^2.2.0" - "ethereum-cryptography" "^1.0.3" - "ethereumjs-abi" "^0.6.8" - "find-up" "^2.1.0" - "fp-ts" "1.19.3" - "fs-extra" "^7.0.1" - "glob" "7.2.0" - "immutable" "^4.0.0-rc.12" - "io-ts" "1.10.4" - "keccak" "^3.0.2" - "lodash" "^4.17.11" - "mnemonist" "^0.38.0" - "mocha" "^10.0.0" - "p-map" "^4.0.0" - "qs" "^6.7.0" - "raw-body" "^2.4.1" - "resolve" "1.17.0" - "semver" "^6.3.0" - "solc" "0.7.3" - "source-map-support" "^0.5.13" - "stacktrace-parser" "^0.1.10" - "tsort" "0.0.1" - "undici" "^5.14.0" - "uuid" "^8.3.2" - "ws" "^7.4.6" - -"has-bigints@^1.0.1", "has-bigints@^1.0.2": - "integrity" "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - "resolved" "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" - "version" "1.0.2" - -"has-flag@^1.0.0": - "integrity" "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" - "version" "1.0.0" - -"has-flag@^3.0.0": - "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - "version" "3.0.0" - -"has-flag@^4.0.0": - "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - "version" "4.0.0" - -"has-property-descriptors@^1.0.0": - "integrity" "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==" - "resolved" "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "get-intrinsic" "^1.1.1" - -"has-proto@^1.0.1": - "integrity" "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - "resolved" "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" - "version" "1.0.1" - -"has-symbols@^1.0.0", "has-symbols@^1.0.2", "has-symbols@^1.0.3": - "integrity" "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - "version" "1.0.3" - -"has-tostringtag@^1.0.0": - "integrity" "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==" - "resolved" "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "has-symbols" "^1.0.2" - -"has@^1.0.3": - "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" - "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - "version" "1.0.3" - dependencies: - "function-bind" "^1.1.1" - -"hash-base@^3.0.0": - "integrity" "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==" - "resolved" "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "inherits" "^2.0.4" - "readable-stream" "^3.6.0" - "safe-buffer" "^5.2.0" - -"hash.js@^1.0.0", "hash.js@^1.0.3", "hash.js@^1.1.7", "hash.js@1.1.7": - "integrity" "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==" - "resolved" "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" - "version" "1.1.7" - dependencies: - "inherits" "^2.0.3" - "minimalistic-assert" "^1.0.1" - -"hash.js@1.1.3": - "integrity" "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==" - "resolved" "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" - "version" "1.1.3" - dependencies: - "inherits" "^2.0.3" - "minimalistic-assert" "^1.0.0" - -"he@1.2.0": - "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - "version" "1.2.0" + abort-controller "^3.0.0" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + chalk "^2.4.2" + chokidar "^3.4.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + ethereumjs-abi "^0.6.8" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "7.2.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + keccak "^3.0.2" + lodash "^4.17.11" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + qs "^6.7.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.7.3" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + +hardhat@2.18.2, hardhat@^2.17.2: + version "2.18.2" + resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.18.2.tgz" + integrity sha512-lUVmJg7DsKcUCDpqv57CJl6vHqo/1PeHSfM3+WIa8UtRKmXyVTj1qQK01TDiuetkZBVg9Dn52qU+ZwaJQynaKA== + 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" + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" + integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== "heap@>= 0.2.0": - "integrity" "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" - "resolved" "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz" - "version" "0.2.7" - -"hmac-drbg@^1.0.1": - "integrity" "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==" - "resolved" "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "hash.js" "^1.0.3" - "minimalistic-assert" "^1.0.0" - "minimalistic-crypto-utils" "^1.0.1" - -"http-basic@^8.1.1": - "integrity" "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==" - "resolved" "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz" - "version" "8.1.3" - dependencies: - "caseless" "^0.12.0" - "concat-stream" "^1.6.2" - "http-response-object" "^3.0.1" - "parse-cache-control" "^1.0.1" - -"http-errors@2.0.0": - "integrity" "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==" - "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "depd" "2.0.0" - "inherits" "2.0.4" - "setprototypeof" "1.2.0" - "statuses" "2.0.1" - "toidentifier" "1.0.1" - -"http-response-object@^3.0.1": - "integrity" "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==" - "resolved" "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz" - "version" "3.0.2" + version "0.2.7" + resolved "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +http-basic@^8.1.1: + 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== + dependencies: + caseless "^0.12.0" + concat-stream "^1.6.2" + http-response-object "^3.0.1" + parse-cache-control "^1.0.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-response-object@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz" + integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== dependencies: "@types/node" "^10.0.3" -"http-signature@~1.2.0": - "integrity" "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==" - "resolved" "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "assert-plus" "^1.0.0" - "jsprim" "^1.2.2" - "sshpk" "^1.7.0" - -"https-proxy-agent@^5.0.0": - "integrity" "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==" - "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "agent-base" "6" - "debug" "4" - -"iconv-lite@0.4.24": - "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" - "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - "version" "0.4.24" - dependencies: - "safer-buffer" ">= 2.1.2 < 3" - -"ieee754@^1.1.4", "ieee754@^1.2.1": - "integrity" "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - "version" "1.2.1" - -"ignore@^5.1.1", "ignore@^5.2.4": - "integrity" "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" - "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" - "version" "5.2.4" - -"immutable@^4.0.0-rc.12": - "integrity" "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==" - "resolved" "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz" - "version" "4.3.1" - -"import-fresh@^3.2.1": - "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" - "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - "version" "3.3.0" - dependencies: - "parent-module" "^1.0.0" - "resolve-from" "^4.0.0" - -"indent-string@^4.0.0": - "integrity" "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - "resolved" "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - "version" "4.0.0" - -"inflight@^1.0.4": - "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" - "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "once" "^1.3.0" - "wrappy" "1" - -"inherits@^2.0.1", "inherits@^2.0.3", "inherits@^2.0.4", "inherits@~2.0.3", "inherits@2", "inherits@2.0.4": - "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - "version" "2.0.4" - -"ini@^1.3.5": - "integrity" "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - "resolved" "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - "version" "1.3.8" - -"internal-slot@^1.0.5": - "integrity" "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==" - "resolved" "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" - "version" "1.0.5" - dependencies: - "get-intrinsic" "^1.2.0" - "has" "^1.0.3" - "side-channel" "^1.0.4" - -"interpret@^1.0.0": - "integrity" "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - "resolved" "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" - "version" "1.4.0" - -"io-ts@1.10.4": - "integrity" "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==" - "resolved" "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" - "version" "1.10.4" - dependencies: - "fp-ts" "^1.0.0" - -"is-array-buffer@^3.0.1", "is-array-buffer@^3.0.2": - "integrity" "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==" - "resolved" "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" - "version" "3.0.2" - dependencies: - "call-bind" "^1.0.2" - "get-intrinsic" "^1.2.0" - "is-typed-array" "^1.1.10" - -"is-arrayish@^0.2.1": - "integrity" "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - "version" "0.2.1" - -"is-bigint@^1.0.1": - "integrity" "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==" - "resolved" "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "has-bigints" "^1.0.1" - -"is-binary-path@~2.1.0": - "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" - "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "binary-extensions" "^2.0.0" - -"is-boolean-object@^1.1.0": - "integrity" "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==" - "resolved" "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" - "version" "1.1.2" - dependencies: - "call-bind" "^1.0.2" - "has-tostringtag" "^1.0.0" - -"is-buffer@^2.0.5", "is-buffer@~2.0.3": - "integrity" "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" - "version" "2.0.5" - -"is-callable@^1.1.3", "is-callable@^1.1.4", "is-callable@^1.2.7": - "integrity" "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - "version" "1.2.7" - -"is-date-object@^1.0.1": - "integrity" "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==" - "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" - "version" "1.0.5" - dependencies: - "has-tostringtag" "^1.0.0" - -"is-extglob@^2.1.1": - "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - "version" "2.1.1" - -"is-fullwidth-code-point@^2.0.0": - "integrity" "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - "version" "2.0.0" - -"is-fullwidth-code-point@^3.0.0": - "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - "version" "3.0.0" - -"is-glob@^4.0.1", "is-glob@~4.0.1": - "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" - "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "is-extglob" "^2.1.1" - -"is-hex-prefixed@1.0.0": - "integrity" "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==" - "resolved" "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" - "version" "1.0.0" - -"is-negative-zero@^2.0.2": - "integrity" "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" - "version" "2.0.2" - -"is-number-object@^1.0.4": - "integrity" "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==" - "resolved" "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" - "version" "1.0.7" - dependencies: - "has-tostringtag" "^1.0.0" - -"is-number@^7.0.0": - "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - "version" "7.0.0" - -"is-plain-obj@^2.1.0": - "integrity" "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - "version" "2.1.0" - -"is-regex@^1.1.4": - "integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==" - "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - "version" "1.1.4" - dependencies: - "call-bind" "^1.0.2" - "has-tostringtag" "^1.0.0" - -"is-shared-array-buffer@^1.0.2": - "integrity" "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==" - "resolved" "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "call-bind" "^1.0.2" - -"is-string@^1.0.5", "is-string@^1.0.7": - "integrity" "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==" - "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" - "version" "1.0.7" - dependencies: - "has-tostringtag" "^1.0.0" - -"is-symbol@^1.0.2", "is-symbol@^1.0.3": - "integrity" "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==" - "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "has-symbols" "^1.0.2" - -"is-typed-array@^1.1.10", "is-typed-array@^1.1.9": - "integrity" "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==" - "resolved" "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" - "version" "1.1.10" - dependencies: - "available-typed-arrays" "^1.0.5" - "call-bind" "^1.0.2" - "for-each" "^0.3.3" - "gopd" "^1.0.1" - "has-tostringtag" "^1.0.0" - -"is-typedarray@~1.0.0": - "integrity" "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - "version" "1.0.0" - -"is-unicode-supported@^0.1.0": - "integrity" "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" - "resolved" "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" - "version" "0.1.0" - -"is-weakref@^1.0.2": - "integrity" "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==" - "resolved" "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "call-bind" "^1.0.2" - -"isarray@^1.0.0", "isarray@~1.0.0": - "integrity" "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - "version" "1.0.0" - -"isarray@^2.0.5": - "integrity" "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - "resolved" "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - "version" "2.0.5" - -"isexe@^2.0.0": - "integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - "version" "2.0.0" - -"isomorphic-unfetch@^3.0.0": - "integrity" "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==" - "resolved" "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "node-fetch" "^2.6.1" - "unfetch" "^4.2.0" - -"isstream@~0.1.2": - "integrity" "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - "resolved" "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" - "version" "0.1.2" - -"js-base64@^3.7.5": - "integrity" "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==" - "resolved" "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz" - "version" "3.7.5" - -"js-cookie@^2.2.1": - "integrity" "sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==" - "resolved" "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz" - "version" "2.2.1" - -"js-sdsl@^4.1.4": - "integrity" "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==" - "resolved" "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz" - "version" "4.4.2" - -"js-sha3@^0.8.0", "js-sha3@0.8.0": - "integrity" "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - "resolved" "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" - "version" "0.8.0" - -"js-sha3@0.5.7": - "integrity" "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" - "resolved" "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" - "version" "0.5.7" - -"js-tokens@^4.0.0": - "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - "version" "4.0.0" - -"js-yaml@^4.1.0", "js-yaml@4.1.0": - "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "argparse" "^2.0.1" - -"js-yaml@3.13.1": - "integrity" "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" - "version" "3.13.1" - dependencies: - "argparse" "^1.0.7" - "esprima" "^4.0.0" - -"js-yaml@3.x": - "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" - "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - "version" "3.14.1" - dependencies: - "argparse" "^1.0.7" - "esprima" "^4.0.0" - -"jsbn@~0.1.0": - "integrity" "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - "resolved" "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" - "version" "0.1.1" - -"json-parse-even-better-errors@^2.3.0": - "integrity" "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - "resolved" "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - "version" "2.3.1" - -"json-schema-traverse@^0.4.1": - "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - "version" "0.4.1" - -"json-schema-traverse@^1.0.0": - "integrity" "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - "version" "1.0.0" - -"json-schema@0.4.0": - "integrity" "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - "resolved" "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" - "version" "0.4.0" - -"json-stringify-safe@~5.0.1": - "integrity" "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - "resolved" "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" - "version" "5.0.1" - -"jsonfile@^2.1.0": - "integrity" "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==" - "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" - "version" "2.4.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +https-proxy-agent@^5.0.0: + 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== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.4, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.1.1, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +immutable@^4.0.0-rc.12: + version "4.3.1" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz" + integrity sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A== + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + +io-ts@1.10.4: + 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== + dependencies: + fp-ts "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^2.0.5, is-buffer@~2.0.3: + version "2.0.5" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^2.0.0: + 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== + +is-fullwidth-code-point@^3.0.0: + 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== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + 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== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + 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== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + 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== + dependencies: + call-bind "^1.0.2" + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isomorphic-unfetch@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz" + integrity sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q== + dependencies: + node-fetch "^2.6.1" + unfetch "^4.2.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +js-base64@^3.7.5: + version "3.7.5" + resolved "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz" + integrity sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA== + +js-cookie@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.1.tgz" + integrity sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== + +js-sdsl@^4.1.4: + version "4.4.2" + resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz" + integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== + +js-sha3@0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz" + integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== + +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@3.13.1: + version "3.13.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@3.x: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + 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== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== optionalDependencies: - "graceful-fs" "^4.1.6" + graceful-fs "^4.1.6" -"jsonfile@^4.0.0": - "integrity" "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==" - "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" - "version" "4.0.0" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: - "graceful-fs" "^4.1.6" + graceful-fs "^4.1.6" -"jsonfile@^6.0.1": - "integrity" "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==" - "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" - "version" "6.1.0" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: - "universalify" "^2.0.0" + universalify "^2.0.0" optionalDependencies: - "graceful-fs" "^4.1.6" - -"jsonschema@^1.2.4": - "integrity" "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==" - "resolved" "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz" - "version" "1.4.1" - -"jsprim@^1.2.2": - "integrity" "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==" - "resolved" "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" - "version" "1.4.2" - dependencies: - "assert-plus" "1.0.0" - "extsprintf" "1.3.0" - "json-schema" "0.4.0" - "verror" "1.10.0" - -"keccak@^3.0.0", "keccak@^3.0.2": - "integrity" "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==" - "resolved" "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz" - "version" "3.0.3" - dependencies: - "node-addon-api" "^2.0.0" - "node-gyp-build" "^4.2.0" - "readable-stream" "^3.6.0" - -"kind-of@^6.0.2": - "integrity" "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" - "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - "version" "6.0.3" - -"klaw@^1.0.0": - "integrity" "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==" - "resolved" "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" - "version" "1.3.1" + graceful-fs "^4.1.6" + +jsonschema@^1.2.4: + version "1.4.1" + resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== + +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +keccak@^3.0.0, keccak@^3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== optionalDependencies: - "graceful-fs" "^4.1.9" - -"level-supports@^4.0.0": - "integrity" "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==" - "resolved" "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz" - "version" "4.0.1" + graceful-fs "^4.1.9" + +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== + +level-transcoder@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== + dependencies: + buffer "^6.0.3" + module-error "^1.0.1" -"level-transcoder@^1.0.1": - "integrity" "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==" - "resolved" "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz" - "version" "1.0.1" - dependencies: - "buffer" "^6.0.3" - "module-error" "^1.0.1" - -"level@^8.0.0": - "integrity" "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==" - "resolved" "https://registry.npmjs.org/level/-/level-8.0.0.tgz" - "version" "8.0.0" - dependencies: - "browser-level" "^1.0.1" - "classic-level" "^1.2.0" +level@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/level/-/level-8.0.0.tgz" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== + dependencies: + browser-level "^1.0.1" + classic-level "^1.2.0" -"levn@~0.3.0": - "integrity" "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==" - "resolved" "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" - "version" "0.3.0" - dependencies: - "prelude-ls" "~1.1.2" - "type-check" "~0.3.2" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" -"lines-and-columns@^1.1.6": - "integrity" "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - "resolved" "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - "version" "1.2.4" - -"locate-path@^2.0.0": - "integrity" "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "p-locate" "^2.0.0" - "path-exists" "^3.0.0" - -"locate-path@^3.0.0": - "integrity" "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "p-locate" "^3.0.0" - "path-exists" "^3.0.0" - -"locate-path@^6.0.0": - "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" - "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "p-locate" "^5.0.0" - -"lodash.camelcase@^4.3.0": - "integrity" "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - "resolved" "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" - "version" "4.3.0" - -"lodash.clonedeep@^4.5.0": - "integrity" "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - "resolved" "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" - "version" "4.5.0" - -"lodash.isequal@^4.5.0": - "integrity" "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - "resolved" "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" - "version" "4.5.0" - -"lodash.truncate@^4.4.2": - "integrity" "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" - "resolved" "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" - "version" "4.4.2" - -"lodash@^4.17.11", "lodash@^4.17.14", "lodash@^4.17.15", "lodash@^4.17.19", "lodash@^4.17.21": - "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - "version" "4.17.21" - -"log-symbols@3.0.0": - "integrity" "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==" - "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "chalk" "^2.4.2" - -"log-symbols@4.1.0": - "integrity" "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==" - "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "chalk" "^4.1.0" - "is-unicode-supported" "^0.1.0" - -"loupe@^2.3.1": - "integrity" "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==" - "resolved" "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz" - "version" "2.3.6" - dependencies: - "get-func-name" "^2.0.0" - -"lru_map@^0.3.3": - "integrity" "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" - "resolved" "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" - "version" "0.3.3" - -"lru-cache@^5.1.1": - "integrity" "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - "version" "5.1.1" - dependencies: - "yallist" "^3.0.2" - -"lru-cache@^6.0.0": - "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" - "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "yallist" "^4.0.0" - -"make-error@^1.1.1": - "integrity" "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - "resolved" "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - "version" "1.3.6" - -"markdown-table@^1.1.3": - "integrity" "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==" - "resolved" "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz" - "version" "1.1.3" - -"mcl-wasm@^0.7.1": - "integrity" "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==" - "resolved" "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz" - "version" "0.7.9" - -"md5.js@^1.3.4": - "integrity" "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==" - "resolved" "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" - "version" "1.3.5" - dependencies: - "hash-base" "^3.0.0" - "inherits" "^2.0.1" - "safe-buffer" "^5.1.2" - -"memory-level@^1.0.0": - "integrity" "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==" - "resolved" "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "abstract-level" "^1.0.0" - "functional-red-black-tree" "^1.0.1" - "module-error" "^1.0.1" - -"memorystream@^0.3.1": - "integrity" "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==" - "resolved" "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" - "version" "0.3.1" - -"merge2@^1.2.3", "merge2@^1.3.0": - "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - "version" "1.4.1" - -"micromatch@^4.0.4": - "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" - "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - "version" "4.0.5" - dependencies: - "braces" "^3.0.2" - "picomatch" "^2.3.1" - -"mime-db@1.52.0": - "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - "version" "1.52.0" - -"mime-types@^2.1.12", "mime-types@~2.1.19": - "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" - "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - "version" "2.1.35" - dependencies: - "mime-db" "1.52.0" - -"minimalistic-assert@^1.0.0", "minimalistic-assert@^1.0.1": - "integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - "resolved" "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - "version" "1.0.1" - -"minimalistic-crypto-utils@^1.0.1": - "integrity" "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - "resolved" "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" - "version" "1.0.1" - -"minimatch@^3.0.4", "minimatch@^3.0.5", "minimatch@2 || 3": - "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - "version" "3.1.2" - dependencies: - "brace-expansion" "^1.1.7" - -"minimatch@^5.0.1": - "integrity" "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" - "version" "5.1.6" - dependencies: - "brace-expansion" "^2.0.1" - -"minimatch@3.0.4": - "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" - "version" "3.0.4" - dependencies: - "brace-expansion" "^1.1.7" - -"minimatch@5.0.1": - "integrity" "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==" - "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "brace-expansion" "^2.0.1" - -"minimist@^1.2.5", "minimist@^1.2.6", "minimist@^1.2.7": - "integrity" "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - "version" "1.2.8" - -"mkdirp@^1.0.4": - "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - "version" "1.0.4" - -"mkdirp@0.5.5": - "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" - "version" "0.5.5" - dependencies: - "minimist" "^1.2.5" - -"mkdirp@0.5.x": - "integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==" - "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - "version" "0.5.6" - dependencies: - "minimist" "^1.2.6" - -"mnemonist@^0.38.0": - "integrity" "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==" - "resolved" "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" - "version" "0.38.5" - dependencies: - "obliterator" "^2.0.0" - -"mocha@^10.0.0": - "integrity" "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==" - "resolved" "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz" - "version" "10.2.0" - dependencies: - "ansi-colors" "4.1.1" - "browser-stdout" "1.3.1" - "chokidar" "3.5.3" - "debug" "4.3.4" - "diff" "5.0.0" - "escape-string-regexp" "4.0.0" - "find-up" "5.0.0" - "glob" "7.2.0" - "he" "1.2.0" - "js-yaml" "4.1.0" - "log-symbols" "4.1.0" - "minimatch" "5.0.1" - "ms" "2.1.3" - "nanoid" "3.3.3" - "serialize-javascript" "6.0.0" - "strip-json-comments" "3.1.1" - "supports-color" "8.1.1" - "workerpool" "6.2.1" - "yargs" "16.2.0" - "yargs-parser" "20.2.4" - "yargs-unparser" "2.0.0" - -"mocha@^7.1.1": - "integrity" "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==" - "resolved" "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz" - "version" "7.2.0" - 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" - -"mocha@7.1.2": - "integrity" "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==" - "resolved" "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz" - "version" "7.1.2" - 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" - -"module-error@^1.0.1", "module-error@^1.0.2": - "integrity" "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==" - "resolved" "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz" - "version" "1.0.2" - -"ms@^2.1.1", "ms@2.1.1": - "integrity" "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" - "version" "2.1.1" - -"ms@2.1.2": - "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - "version" "2.1.2" - -"ms@2.1.3": - "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - "version" "2.1.3" - -"multiformats@9.9.0": - "integrity" "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" - "resolved" "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz" - "version" "9.9.0" - -"nanoid@3.3.3": - "integrity" "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==" - "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" - "version" "3.3.3" - -"napi-macros@^2.2.2": - "integrity" "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" - "resolved" "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz" - "version" "2.2.2" - -"neo-async@^2.6.0": - "integrity" "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - "resolved" "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - "version" "2.6.2" - -"node-addon-api@^2.0.0": - "integrity" "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - "resolved" "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" - "version" "2.0.2" - -"node-emoji@^1.10.0": - "integrity" "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==" - "resolved" "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" - "version" "1.11.0" - dependencies: - "lodash" "^4.17.21" - -"node-environment-flags@1.0.6": - "integrity" "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==" - "resolved" "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "object.getownpropertydescriptors" "^2.0.3" - "semver" "^5.7.0" - -"node-fetch@^2.6.0", "node-fetch@^2.6.1": - "integrity" "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==" - "resolved" "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz" - "version" "2.6.12" - dependencies: - "whatwg-url" "^5.0.0" - -"node-gyp-build@^4.2.0", "node-gyp-build@^4.3.0": - "integrity" "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==" - "resolved" "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" - "version" "4.6.0" - -"nofilter@^3.1.0": - "integrity" "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==" - "resolved" "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" - "version" "3.1.0" - -"nopt@3.x": - "integrity" "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==" - "resolved" "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" - "version" "3.0.6" - dependencies: - "abbrev" "1" - -"normalize-path@^3.0.0", "normalize-path@~3.0.0": - "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - "version" "3.0.0" - -"number-to-bn@1.7.0": - "integrity" "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==" - "resolved" "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" - "version" "1.7.0" - dependencies: - "bn.js" "4.11.6" - "strip-hex-prefix" "1.0.0" - -"oauth-sign@~0.9.0": - "integrity" "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - "resolved" "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" - "version" "0.9.0" - -"object-assign@^4.1.0": - "integrity" "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - "version" "4.1.1" - -"object-inspect@^1.12.3", "object-inspect@^1.9.0": - "integrity" "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" - "version" "1.12.3" - -"object-keys@^1.0.11", "object-keys@^1.1.1": - "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - "version" "1.1.1" - -"object.assign@^4.1.4": - "integrity" "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==" - "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" - "version" "4.1.4" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "has-symbols" "^1.0.3" - "object-keys" "^1.1.1" - -"object.assign@4.1.0": - "integrity" "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==" - "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz" - "version" "4.1.0" - dependencies: - "define-properties" "^1.1.2" - "function-bind" "^1.1.1" - "has-symbols" "^1.0.0" - "object-keys" "^1.0.11" - -"object.getownpropertydescriptors@^2.0.3": - "integrity" "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==" - "resolved" "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz" - "version" "2.1.6" - dependencies: - "array.prototype.reduce" "^1.0.5" - "call-bind" "^1.0.2" - "define-properties" "^1.2.0" - "es-abstract" "^1.21.2" - "safe-array-concat" "^1.0.0" - -"obliterator@^2.0.0": - "integrity" "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" - "resolved" "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" - "version" "2.0.4" - -"once@^1.3.0", "once@1.x": - "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" - "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - "version" "1.4.0" - dependencies: - "wrappy" "1" - -"optionator@^0.8.1": - "integrity" "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==" - "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" - "version" "0.8.3" - 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" - -"ordinal@^1.0.3": - "integrity" "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==" - "resolved" "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz" - "version" "1.0.3" - -"os-tmpdir@~1.0.2": - "integrity" "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" - "resolved" "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - "version" "1.0.2" - -"p-limit@^1.1.0": - "integrity" "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "p-try" "^1.0.0" - -"p-limit@^2.0.0": - "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - "version" "2.3.0" - dependencies: - "p-try" "^2.0.0" - -"p-limit@^3.0.2": - "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" - "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "yocto-queue" "^0.1.0" - -"p-locate@^2.0.0": - "integrity" "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "p-limit" "^1.1.0" - -"p-locate@^3.0.0": - "integrity" "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - "version" "3.0.0" - dependencies: - "p-limit" "^2.0.0" - -"p-locate@^5.0.0": - "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" - "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "p-limit" "^3.0.2" - -"p-map@^4.0.0": - "integrity" "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==" - "resolved" "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "aggregate-error" "^3.0.0" - -"p-try@^1.0.0": - "integrity" "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" - "resolved" "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" - "version" "1.0.0" - -"p-try@^2.0.0": - "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" - "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - "version" "2.2.0" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loupe@^2.3.1: + version "2.3.6" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== + dependencies: + get-func-name "^2.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +markdown-table@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz" + integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== + +mcl-wasm@^0.7.1: + version "0.7.9" + resolved "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz" + integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.7: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@0.5.5: + version "0.5.5" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@0.5.x: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz" + integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== + 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" + +mocha@^10.0.0: + version "10.2.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +mocha@^7.1.1: + version "7.2.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz" + integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== + 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" + +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + +ms@2.1.1, ms@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multiformats@9.9.0: + version "9.9.0" + resolved "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== + +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== + +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-environment-flags@1.0.6: + 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== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +node-fetch@^2.6.0, node-fetch@^2.6.1: + version "2.6.12" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.6.0" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz" + integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + +nopt@3.x: + version "3.0.6" + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== + dependencies: + abbrev "1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.0.11, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.0.3: + version "2.1.6" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz" + integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== + dependencies: + array.prototype.reduce "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.21.2" + safe-array-concat "^1.0.0" + +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== + +once@1.x, once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + 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" + +ordinal@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz" + integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + 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== + dependencies: + p-limit "^2.0.0" + +p-locate@^5.0.0: + 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== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -"pako@^2.1.0": - "integrity" "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" - "resolved" "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz" - "version" "2.1.0" +pako@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== -"parent-module@^1.0.0": - "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" - "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - "version" "1.0.1" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: - "callsites" "^3.0.0" + callsites "^3.0.0" -"parse-cache-control@^1.0.1": - "integrity" "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" - "resolved" "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz" - "version" "1.0.1" +parse-cache-control@^1.0.1: + 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== -"parse-json@^5.0.0": - "integrity" "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==" - "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - "version" "5.2.0" +parse-json@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" - "error-ex" "^1.3.1" - "json-parse-even-better-errors" "^2.3.0" - "lines-and-columns" "^1.1.6" - -"path-exists@^3.0.0": - "integrity" "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" - "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - "version" "3.0.0" - -"path-exists@^4.0.0": - "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - "version" "4.0.0" - -"path-is-absolute@^1.0.0": - "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - "version" "1.0.1" - -"path-parse@^1.0.6": - "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - "version" "1.0.7" - -"path-type@^4.0.0": - "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - "version" "4.0.0" - -"pathval@^1.1.1": - "integrity" "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" - "resolved" "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" - "version" "1.1.1" - -"pbkdf2@^3.0.17": - "integrity" "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==" - "resolved" "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" - "version" "3.1.2" - 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" - -"performance-now@^2.1.0": - "integrity" "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" - "version" "2.1.0" - -"picomatch@^2.0.4", "picomatch@^2.2.1", "picomatch@^2.3.1": - "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - "version" "2.3.1" - -"pify@^4.0.1": - "integrity" "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - "resolved" "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" - "version" "4.0.1" - -"pluralize@^8.0.0": - "integrity" "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" - "resolved" "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" - "version" "8.0.0" - -"prelude-ls@~1.1.2": - "integrity" "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" - "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" - "version" "1.1.2" - -"prettier-plugin-solidity@^1.1.3": - "integrity" "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==" - "resolved" "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz" - "version" "1.1.3" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + 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" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +prettier-plugin-solidity@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz" + integrity sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg== dependencies: "@solidity-parser/parser" "^0.16.0" - "semver" "^7.3.8" - "solidity-comments-extractor" "^0.0.7" - -"prettier@^2.3.1": - "integrity" "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" - "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" - "version" "2.8.8" - -"prettier@^2.8.3": - "integrity" "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==" - "resolved" "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" - "version" "2.8.8" - -"prettier@>=2.3.0 || >=3.0.0-alpha.0": - "integrity" "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==" - "resolved" "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz" - "version" "3.1.0" - -"process-nextick-args@~2.0.0": - "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - "version" "2.0.1" - -"promise@^8.0.0": - "integrity" "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==" - "resolved" "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" - "version" "8.3.0" - dependencies: - "asap" "~2.0.6" - -"proper-lockfile@^4.1.1": - "integrity" "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==" - "resolved" "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz" - "version" "4.1.2" - dependencies: - "graceful-fs" "^4.2.4" - "retry" "^0.12.0" - "signal-exit" "^3.0.2" - -"proxy-from-env@^1.1.0": - "integrity" "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - "resolved" "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - "version" "1.1.0" - -"psl@^1.1.28": - "integrity" "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - "resolved" "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" - "version" "1.9.0" - -"punycode@^2.1.0", "punycode@^2.1.1": - "integrity" "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" - "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" - "version" "2.3.0" - -"qs@^6.4.0", "qs@~6.5.2": - "integrity" "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" - "resolved" "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" - "version" "6.5.3" - -"qs@^6.7.0": - "integrity" "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==" - "resolved" "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz" - "version" "6.11.2" - dependencies: - "side-channel" "^1.0.4" - -"queue-microtask@^1.2.2", "queue-microtask@^1.2.3": - "integrity" "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - "version" "1.2.3" - -"randombytes@^2.1.0": - "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" - "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - "version" "2.1.0" - dependencies: - "safe-buffer" "^5.1.0" - -"raw-body@^2.4.1": - "integrity" "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==" - "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" - "version" "2.5.2" - dependencies: - "bytes" "3.1.2" - "http-errors" "2.0.0" - "iconv-lite" "0.4.24" - "unpipe" "1.0.0" - -"readable-stream@^2.2.2": - "integrity" "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - "version" "2.3.8" - 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" - -"readable-stream@^3.6.0": - "integrity" "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==" - "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - "version" "3.6.2" - dependencies: - "inherits" "^2.0.3" - "string_decoder" "^1.1.1" - "util-deprecate" "^1.0.1" - -"readdirp@~3.2.0": - "integrity" "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==" - "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz" - "version" "3.2.0" - dependencies: - "picomatch" "^2.0.4" - -"readdirp@~3.6.0": - "integrity" "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==" - "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - "version" "3.6.0" - dependencies: - "picomatch" "^2.2.1" - -"rechoir@^0.6.2": - "integrity" "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==" - "resolved" "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" - "version" "0.6.2" - dependencies: - "resolve" "^1.1.6" - -"recursive-readdir@^2.2.2": - "integrity" "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==" - "resolved" "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" - "version" "2.2.3" - dependencies: - "minimatch" "^3.0.5" - -"reduce-flatten@^2.0.0": - "integrity" "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==" - "resolved" "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" - "version" "2.0.0" - -"regexp.prototype.flags@^1.5.0": - "integrity" "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==" - "resolved" "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" - "version" "1.5.0" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.2.0" - "functions-have-names" "^1.2.3" - -"req-cwd@^2.0.0": - "integrity" "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==" - "resolved" "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "req-from" "^2.0.0" - -"req-from@^2.0.0": - "integrity" "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==" - "resolved" "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "resolve-from" "^3.0.0" - -"request-promise-core@1.1.4": - "integrity" "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==" - "resolved" "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz" - "version" "1.1.4" - dependencies: - "lodash" "^4.17.19" - -"request-promise-native@^1.0.5": - "integrity" "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==" - "resolved" "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz" - "version" "1.0.9" - dependencies: - "request-promise-core" "1.1.4" - "stealthy-require" "^1.1.1" - "tough-cookie" "^2.3.3" - -"request@^2.34", "request@^2.88.0": - "integrity" "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==" - "resolved" "https://registry.npmjs.org/request/-/request-2.88.2.tgz" - "version" "2.88.2" - 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" - -"require-directory@^2.1.1": - "integrity" "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - "version" "2.1.1" - -"require-from-string@^2.0.0", "require-from-string@^2.0.2": - "integrity" "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" - "resolved" "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - "version" "2.0.2" - -"require-main-filename@^2.0.0": - "integrity" "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" - "resolved" "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" - "version" "2.0.0" - -"resolve-from@^3.0.0": - "integrity" "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" - "version" "3.0.0" - -"resolve-from@^4.0.0": - "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - "version" "4.0.0" - -"resolve@^1.1.6", "resolve@1.17.0": - "integrity" "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" - "version" "1.17.0" - dependencies: - "path-parse" "^1.0.6" - -"resolve@1.1.x": - "integrity" "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==" - "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" - "version" "1.1.7" - -"retry@^0.12.0": - "integrity" "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==" - "resolved" "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" - "version" "0.12.0" - -"retry@0.13.1": - "integrity" "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - "resolved" "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" - "version" "0.13.1" - -"reusify@^1.0.4": - "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - "version" "1.0.4" - -"rimraf@^2.2.8": - "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" - "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - "version" "2.7.1" - dependencies: - "glob" "^7.1.3" - -"ripemd160@^2.0.0", "ripemd160@^2.0.1": - "integrity" "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==" - "resolved" "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" - "version" "2.0.2" - dependencies: - "hash-base" "^3.0.0" - "inherits" "^2.0.1" - -"rlp@^2.2.3", "rlp@^2.2.4": - "integrity" "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==" - "resolved" "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" - "version" "2.2.7" - dependencies: - "bn.js" "^5.2.0" - -"run-parallel-limit@^1.1.0": - "integrity" "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==" - "resolved" "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz" - "version" "1.1.0" - dependencies: - "queue-microtask" "^1.2.2" - -"run-parallel@^1.1.9": - "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" - "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - "version" "1.2.0" - dependencies: - "queue-microtask" "^1.2.2" - -"rustbn.js@~0.2.0": - "integrity" "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - "resolved" "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" - "version" "0.2.0" - -"safe-array-concat@^1.0.0": - "integrity" "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==" - "resolved" "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "call-bind" "^1.0.2" - "get-intrinsic" "^1.2.0" - "has-symbols" "^1.0.3" - "isarray" "^2.0.5" - -"safe-buffer@^5.0.1", "safe-buffer@^5.1.0", "safe-buffer@^5.1.1", "safe-buffer@^5.1.2", "safe-buffer@^5.2.0", "safe-buffer@~5.2.0": - "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - "version" "5.2.1" - -"safe-buffer@~5.1.0", "safe-buffer@~5.1.1": - "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - "version" "5.1.2" - -"safe-regex-test@^1.0.0": - "integrity" "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==" - "resolved" "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "call-bind" "^1.0.2" - "get-intrinsic" "^1.1.3" - "is-regex" "^1.1.4" - -"safer-buffer@^2.0.2", "safer-buffer@^2.1.0", "safer-buffer@>= 2.1.2 < 3", "safer-buffer@~2.1.0": - "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - "version" "2.1.2" - -"sc-istanbul@^0.4.5": - "integrity" "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==" - "resolved" "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz" - "version" "0.4.6" - dependencies: - "abbrev" "1.0.x" - "async" "1.x" - "escodegen" "1.8.x" - "esprima" "2.7.x" - "glob" "^5.0.15" - "handlebars" "^4.0.1" - "js-yaml" "3.x" - "mkdirp" "0.5.x" - "nopt" "3.x" - "once" "1.x" - "resolve" "1.1.x" - "supports-color" "^3.1.0" - "which" "^1.1.1" - "wordwrap" "^1.0.0" - -"scrypt-js@^3.0.0", "scrypt-js@3.0.1": - "integrity" "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - "resolved" "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" - "version" "3.0.1" - -"scrypt-js@2.0.4": - "integrity" "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - "resolved" "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz" - "version" "2.0.4" - -"secp256k1@^4.0.1": - "integrity" "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==" - "resolved" "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" - "version" "4.0.3" - dependencies: - "elliptic" "^6.5.4" - "node-addon-api" "^2.0.0" - "node-gyp-build" "^4.2.0" - -"semver@^5.5.0": - "integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - "version" "5.7.2" - -"semver@^5.7.0": - "integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - "version" "5.7.2" - -"semver@^6.3.0": - "integrity" "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - "version" "6.3.1" - -"semver@^7.3.4": - "integrity" "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - "version" "7.5.4" - dependencies: - "lru-cache" "^6.0.0" - -"semver@^7.3.8": - "integrity" "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==" - "resolved" "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - "version" "7.5.4" - dependencies: - "lru-cache" "^6.0.0" - -"serialize-javascript@6.0.0": - "integrity" "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==" - "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" - "version" "6.0.0" - dependencies: - "randombytes" "^2.1.0" - -"set-blocking@^2.0.0": - "integrity" "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - "resolved" "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" - "version" "2.0.0" - -"setimmediate@^1.0.5": - "integrity" "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - "version" "1.0.5" - -"setimmediate@1.0.4": - "integrity" "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" - "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" - "version" "1.0.4" - -"setprototypeof@1.2.0": - "integrity" "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - "version" "1.2.0" - -"sha.js@^2.4.0", "sha.js@^2.4.8": - "integrity" "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==" - "resolved" "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" - "version" "2.4.11" - dependencies: - "inherits" "^2.0.1" - "safe-buffer" "^5.0.1" - -"sha1@^1.1.1": - "integrity" "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==" - "resolved" "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "charenc" ">= 0.0.1" - "crypt" ">= 0.0.1" - -"shelljs@^0.8.3": - "integrity" "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==" - "resolved" "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" - "version" "0.8.5" - dependencies: - "glob" "^7.0.0" - "interpret" "^1.0.0" - "rechoir" "^0.6.2" - -"side-channel@^1.0.4": - "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==" - "resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "call-bind" "^1.0.0" - "get-intrinsic" "^1.0.2" - "object-inspect" "^1.9.0" - -"signal-exit@^3.0.2": - "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - "version" "3.0.7" - -"slash@^3.0.0": - "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - "version" "3.0.0" - -"slice-ansi@^4.0.0": - "integrity" "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==" - "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "ansi-styles" "^4.0.0" - "astral-regex" "^2.0.0" - "is-fullwidth-code-point" "^3.0.0" - -"solc@0.7.3": - "integrity" "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==" - "resolved" "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" - "version" "0.7.3" - 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" - -"solhint@^3.4.1": - "integrity" "sha512-pzZn2RlZhws1XwvLPVSsxfHrwsteFf5eySOhpAytzXwKQYbTCJV6z8EevYDiSVKMpWrvbKpEtJ055CuEmzp4Xg==" - "resolved" "https://registry.npmjs.org/solhint/-/solhint-3.4.1.tgz" - "version" "3.4.1" + semver "^7.3.8" + solidity-comments-extractor "^0.0.7" + +prettier@^2.3.1, prettier@^2.8.3: + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +process-nextick-args@~2.0.0: + 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== + +promise@^8.0.0: + version "8.3.0" + resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +proper-lockfile@^4.1.1: + version "4.1.2" + resolved "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +qs@^6.4.0, qs@~6.5.2: + version "6.5.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +qs@^6.7.0: + version "6.11.2" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2, queue-microtask@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^2.2.2: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + 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" + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== + dependencies: + picomatch "^2.0.4" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + +regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +req-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz" + integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== + dependencies: + req-from "^2.0.0" + +req-from@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz" + integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== + dependencies: + resolve-from "^3.0.0" + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5: + 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== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.88.0: + version "2.88.2" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + 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" + +require-directory@^2.1.1: + 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== + +require-from-string@^2.0.0, require-from-string@^2.0.2: + 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== + +require-main-filename@^2.0.0: + 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== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + +resolve@1.17.0, resolve@^1.1.6: + version "1.17.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +retry@0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.2.8: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.2.3, rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex-test@^1.0.0: + 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== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sc-istanbul@^0.4.5: + 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== + 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" + +scrypt-js@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz" + integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== + +scrypt-js@3.0.1, scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +semver@^5.5.0, semver@^5.7.0: + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.0: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.4, semver@^7.3.8: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setimmediate@1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz" + integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +sha1@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz" + integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== + dependencies: + charenc ">= 0.0.1" + crypt ">= 0.0.1" + +shelljs@^0.8.3: + version "0.8.5" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +solc@0.7.3: + version "0.7.3" + resolved "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + 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" + +solhint@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/solhint/-/solhint-3.4.1.tgz" + integrity sha512-pzZn2RlZhws1XwvLPVSsxfHrwsteFf5eySOhpAytzXwKQYbTCJV6z8EevYDiSVKMpWrvbKpEtJ055CuEmzp4Xg== dependencies: "@solidity-parser/parser" "^0.16.0" - "ajv" "^6.12.6" - "antlr4" "^4.11.0" - "ast-parents" "^0.0.1" - "chalk" "^4.1.2" - "commander" "^10.0.0" - "cosmiconfig" "^8.0.0" - "fast-diff" "^1.2.0" - "glob" "^8.0.3" - "ignore" "^5.2.4" - "js-yaml" "^4.1.0" - "lodash" "^4.17.21" - "pluralize" "^8.0.0" - "semver" "^6.3.0" - "strip-ansi" "^6.0.1" - "table" "^6.8.1" - "text-table" "^0.2.0" + ajv "^6.12.6" + antlr4 "^4.11.0" + ast-parents "^0.0.1" + chalk "^4.1.2" + commander "^10.0.0" + cosmiconfig "^8.0.0" + fast-diff "^1.2.0" + glob "^8.0.3" + ignore "^5.2.4" + js-yaml "^4.1.0" + lodash "^4.17.21" + pluralize "^8.0.0" + semver "^6.3.0" + strip-ansi "^6.0.1" + table "^6.8.1" + text-table "^0.2.0" optionalDependencies: - "prettier" "^2.8.3" + prettier "^2.8.3" -"solidity-ast@^0.4.15": - "integrity" "sha512-Pr5sCAj1SFqzwFZw1HPKSq0PehlQNdM8GwKyAVYh2DOn7/cCK8LUKD1HeHnKtTgBW7hi9h4nnnan7hpAg5RhWQ==" - "resolved" "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.49.tgz" - "version" "0.4.49" +solidity-ast@^0.4.15: + version "0.4.49" + resolved "https://registry.npmjs.org/solidity-ast/-/solidity-ast-0.4.49.tgz" + integrity sha512-Pr5sCAj1SFqzwFZw1HPKSq0PehlQNdM8GwKyAVYh2DOn7/cCK8LUKD1HeHnKtTgBW7hi9h4nnnan7hpAg5RhWQ== -"solidity-comments-extractor@^0.0.7": - "integrity" "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==" - "resolved" "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz" - "version" "0.0.7" +solidity-comments-extractor@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz" + integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== -"solidity-coverage@^0.8.1", "solidity-coverage@^0.8.2": - "integrity" "sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg==" - "resolved" "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.4.tgz" - "version" "0.8.4" +solidity-coverage@^0.8.2: + version "0.8.4" + resolved "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.4.tgz" + integrity sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg== dependencies: "@ethersproject/abi" "^5.0.9" "@solidity-parser/parser" "^0.16.0" - "chalk" "^2.4.2" - "death" "^1.1.0" - "detect-port" "^1.3.0" - "difflib" "^0.2.4" - "fs-extra" "^8.1.0" - "ghost-testrpc" "^0.0.2" - "global-modules" "^2.0.0" - "globby" "^10.0.1" - "jsonschema" "^1.2.4" - "lodash" "^4.17.15" - "mocha" "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" - -"source-map-support@^0.5.13": - "integrity" "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" - "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - "version" "0.5.21" - dependencies: - "buffer-from" "^1.0.0" - "source-map" "^0.6.0" - -"source-map@^0.6.0": - "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - "version" "0.6.1" - -"source-map@^0.6.1": - "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - "version" "0.6.1" - -"source-map@~0.2.0": - "integrity" "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==" - "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz" - "version" "0.2.0" - dependencies: - "amdefine" ">=0.0.4" - -"sprintf-js@~1.0.2": - "integrity" "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - "version" "1.0.3" - -"sshpk@^1.7.0": - "integrity" "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==" - "resolved" "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" - "version" "1.17.0" - 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" - -"stacktrace-parser@^0.1.10": - "integrity" "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==" - "resolved" "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" - "version" "0.1.10" - dependencies: - "type-fest" "^0.7.1" - -"statuses@2.0.1": - "integrity" "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - "resolved" "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - "version" "2.0.1" - -"stealthy-require@^1.1.1": - "integrity" "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==" - "resolved" "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" - "version" "1.1.1" - -"streamsearch@^1.1.0": - "integrity" "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" - "resolved" "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" - "version" "1.1.0" - -"string_decoder@^1.1.1": - "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" - "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - "version" "1.3.0" - dependencies: - "safe-buffer" "~5.2.0" - -"string_decoder@~1.1.1": - "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" - "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - "version" "1.1.1" - dependencies: - "safe-buffer" "~5.1.0" - -"string-format@^2.0.0": - "integrity" "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" - "resolved" "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" - "version" "2.0.0" - -"string-width@^1.0.2 || 2": - "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "is-fullwidth-code-point" "^2.0.0" - "strip-ansi" "^4.0.0" - -"string-width@^2.1.1": - "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - "version" "2.1.1" - dependencies: - "is-fullwidth-code-point" "^2.0.0" - "strip-ansi" "^4.0.0" - -"string-width@^3.0.0", "string-width@^3.1.0": - "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" - "version" "3.1.0" - dependencies: - "emoji-regex" "^7.0.1" - "is-fullwidth-code-point" "^2.0.0" - "strip-ansi" "^5.1.0" - -"string-width@^4.1.0", "string-width@^4.2.0", "string-width@^4.2.3": - "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" - "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - "version" "4.2.3" - dependencies: - "emoji-regex" "^8.0.0" - "is-fullwidth-code-point" "^3.0.0" - "strip-ansi" "^6.0.1" - -"string.prototype.trim@^1.2.7": - "integrity" "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==" - "resolved" "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" - "version" "1.2.7" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" - -"string.prototype.trimend@^1.0.6": - "integrity" "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==" - "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" - "version" "1.0.6" - dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" - -"string.prototype.trimstart@^1.0.6": - "integrity" "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==" - "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" - "version" "1.0.6" + 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" + +source-map-support@^0.5.13: + 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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz" + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== + dependencies: + amdefine ">=0.0.4" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + 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" + +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz" + integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + +"string-width@^1.0.2 || 2", string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.1.1: + 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== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: - "call-bind" "^1.0.2" - "define-properties" "^1.1.4" - "es-abstract" "^1.20.4" - -"strip-ansi@^4.0.0": - "integrity" "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - "version" "4.0.0" - dependencies: - "ansi-regex" "^3.0.0" - -"strip-ansi@^5.0.0", "strip-ansi@^5.1.0", "strip-ansi@^5.2.0": - "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" - "version" "5.2.0" - dependencies: - "ansi-regex" "^4.1.0" - -"strip-ansi@^6.0.0", "strip-ansi@^6.0.1": - "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" - "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - "version" "6.0.1" - dependencies: - "ansi-regex" "^5.0.1" - -"strip-hex-prefix@1.0.0": - "integrity" "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==" - "resolved" "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" - "version" "1.0.0" + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: - "is-hex-prefixed" "1.0.0" - -"strip-json-comments@2.0.1": - "integrity" "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" - "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - "version" "2.0.1" - -"strip-json-comments@3.1.1": - "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - "version" "3.1.1" + is-hex-prefixed "1.0.0" + +strip-json-comments@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -"supports-color@^3.1.0": - "integrity" "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" - "version" "3.2.3" +strip-json-comments@3.1.1: + 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== + +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== dependencies: - "has-flag" "^1.0.0" - -"supports-color@^5.3.0": - "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - "version" "5.5.0" + has-flag "^3.0.0" + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - "has-flag" "^3.0.0" + has-flag "^4.0.0" -"supports-color@^7.1.0": - "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - "version" "7.2.0" - dependencies: - "has-flag" "^4.0.0" +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" -"supports-color@6.0.0": - "integrity" "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz" - "version" "6.0.0" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: - "has-flag" "^3.0.0" + has-flag "^3.0.0" -"supports-color@8.1.1": - "integrity" "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==" - "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - "version" "8.1.1" +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - "has-flag" "^4.0.0" + has-flag "^4.0.0" -"sync-request@^6.0.0": - "integrity" "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==" - "resolved" "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz" - "version" "6.1.0" +sync-request@^6.0.0: + 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== dependencies: - "http-response-object" "^3.0.1" - "sync-rpc" "^1.2.1" - "then-request" "^6.0.0" + http-response-object "^3.0.1" + sync-rpc "^1.2.1" + then-request "^6.0.0" -"sync-rpc@^1.2.1": - "integrity" "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==" - "resolved" "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz" - "version" "1.3.6" +sync-rpc@^1.2.1: + version "1.3.6" + resolved "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz" + integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== dependencies: - "get-port" "^3.1.0" + get-port "^3.1.0" -"table-layout@^1.0.2": - "integrity" "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==" - "resolved" "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" - "version" "1.0.2" +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== dependencies: - "array-back" "^4.0.1" - "deep-extend" "~0.6.0" - "typical" "^5.2.0" - "wordwrapjs" "^4.0.0" + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" -"table@^6.8.0", "table@^6.8.1": - "integrity" "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==" - "resolved" "https://registry.npmjs.org/table/-/table-6.8.1.tgz" - "version" "6.8.1" +table@^6.8.0, table@^6.8.1: + version "6.8.1" + resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== 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" + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" -"text-table@^0.2.0": - "integrity" "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - "version" "0.2.0" +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -"then-request@^6.0.0": - "integrity" "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==" - "resolved" "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz" - "version" "6.0.2" +then-request@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz" + integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== 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" - -"tmp@0.0.33": - "integrity" "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==" - "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" - "version" "0.0.33" - dependencies: - "os-tmpdir" "~1.0.2" - -"to-regex-range@^5.0.1": - "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" - "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - "version" "5.0.1" - dependencies: - "is-number" "^7.0.0" - -"toidentifier@1.0.1": - "integrity" "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" - "version" "1.0.1" - -"tough-cookie@^2.3.3", "tough-cookie@~2.5.0": - "integrity" "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==" - "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" - "version" "2.5.0" - dependencies: - "psl" "^1.1.28" - "punycode" "^2.1.1" - -"tr46@~0.0.3": - "integrity" "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - "resolved" "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - "version" "0.0.3" - -"ts-command-line-args@^2.2.0": - "integrity" "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==" - "resolved" "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz" - "version" "2.5.1" - dependencies: - "chalk" "^4.1.0" - "command-line-args" "^5.1.1" - "command-line-usage" "^6.1.0" - "string-format" "^2.0.0" - -"ts-essentials@^7.0.1": - "integrity" "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==" - "resolved" "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" - "version" "7.0.3" - -"ts-node@*", "ts-node@^10.9.1", "ts-node@>=8.0.0": - "integrity" "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==" - "resolved" "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" - "version" "10.9.1" + 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" + +tmp@0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-regex-range@^5.0.1: + 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== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tough-cookie@^2.3.3, tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 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" - -"tslib@^1.11.1", "tslib@^1.9.3": - "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - "version" "1.14.1" - -"tslib@^2.3.1": - "integrity" "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz" - "version" "2.6.0" - -"tslib@^2.5.0": - "integrity" "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz" - "version" "2.6.0" - -"tslib@2.4.0": - "integrity" "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" - "version" "2.4.0" - -"tsort@0.0.1": - "integrity" "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" - "resolved" "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" - "version" "0.0.1" - -"tunnel-agent@^0.6.0": - "integrity" "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==" - "resolved" "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" - "version" "0.6.0" - dependencies: - "safe-buffer" "^5.0.1" - -"tweetnacl-util@^0.15.1": - "integrity" "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" - "resolved" "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" - "version" "0.15.1" - -"tweetnacl@^0.14.3": - "integrity" "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - "version" "0.14.5" - -"tweetnacl@^1.0.3": - "integrity" "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" - "version" "1.0.3" - -"tweetnacl@~0.14.0": - "integrity" "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" - "version" "0.14.5" - -"type-check@~0.3.2": - "integrity" "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==" - "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" - "version" "0.3.2" - dependencies: - "prelude-ls" "~1.1.2" - -"type-detect@^4.0.0", "type-detect@^4.0.5": - "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - "version" "4.0.8" - -"type-fest@^0.21.3": - "integrity" "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - "version" "0.21.3" - -"type-fest@^0.7.1": - "integrity" "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" - "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" - "version" "0.7.1" - -"typechain@^8.1.1", "typechain@^8.2.0", "typechain@^8.3.1": - "integrity" "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==" - "resolved" "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz" - "version" "8.3.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" + +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@^1.11.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.3.1, tslib@^2.5.0: + version "2.6.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0, type-detect@^4.0.5: + 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== + +type-fest@^0.21.3: + 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== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typechain@^8.1.1: + version "8.3.2" + resolved "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== 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" - -"typed-array-byte-offset@^1.0.0": - "integrity" "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==" - "resolved" "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz" - "version" "1.0.0" - dependencies: - "available-typed-arrays" "^1.0.5" - "call-bind" "^1.0.2" - "for-each" "^0.3.3" - "has-proto" "^1.0.1" - "is-typed-array" "^1.1.10" - -"typed-array-length@^1.0.4": - "integrity" "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==" - "resolved" "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" - "version" "1.0.4" - dependencies: - "call-bind" "^1.0.2" - "for-each" "^0.3.3" - "is-typed-array" "^1.1.9" - -"typedarray@^0.0.6": - "integrity" "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" - "version" "0.0.6" - -"typescript@*", "typescript@^5.0.4", "typescript@>=2.7", "typescript@>=3.7.0", "typescript@>=4.3.0", "typescript@>=4.5.0", "typescript@>=4.7.0": - "integrity" "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==" - "resolved" "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz" - "version" "5.1.6" - -"typical@^4.0.0": - "integrity" "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==" - "resolved" "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" - "version" "4.0.0" - -"typical@^5.2.0": - "integrity" "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" - "resolved" "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" - "version" "5.2.0" - -"uglify-js@^3.1.4": - "integrity" "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==" - "resolved" "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" - "version" "3.17.4" - -"unbox-primitive@^1.0.2": - "integrity" "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==" - "resolved" "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" - "version" "1.0.2" - dependencies: - "call-bind" "^1.0.2" - "has-bigints" "^1.0.2" - "has-symbols" "^1.0.3" - "which-boxed-primitive" "^1.0.2" - -"undici@^5.14.0": - "integrity" "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==" - "resolved" "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz" - "version" "5.22.1" - dependencies: - "busboy" "^1.6.0" - -"unfetch@^4.2.0": - "integrity" "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" - "resolved" "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz" - "version" "4.2.0" - -"universalify@^0.1.0": - "integrity" "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - "resolved" "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" - "version" "0.1.2" - -"universalify@^2.0.0": - "integrity" "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - "resolved" "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" - "version" "2.0.0" - -"unpipe@1.0.0": - "integrity" "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - "resolved" "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - "version" "1.0.0" - -"uri-js@^4.2.2": - "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" - "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - "version" "4.4.1" - dependencies: - "punycode" "^2.1.0" - -"utf8@3.0.0": - "integrity" "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - "resolved" "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz" - "version" "3.0.0" - -"util-deprecate@^1.0.1", "util-deprecate@~1.0.1": - "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - "version" "1.0.2" - -"uuid@^3.3.2": - "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" - "version" "3.4.0" - -"uuid@^8.3.2": - "integrity" "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - "version" "8.3.2" - -"uuid@^9.0.1": - "integrity" "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" - "version" "9.0.1" - -"uuid@2.0.1": - "integrity" "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==" - "resolved" "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" - "version" "2.0.1" - -"v8-compile-cache-lib@^3.0.1": - "integrity" "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" - "resolved" "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" - "version" "3.0.1" - -"verror@1.10.0": - "integrity" "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==" - "resolved" "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" - "version" "1.10.0" - dependencies: - "assert-plus" "^1.0.0" - "core-util-is" "1.0.2" - "extsprintf" "^1.2.0" - -"web3-utils@^1.3.6": - "integrity" "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==" - "resolved" "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz" - "version" "1.10.0" - dependencies: - "bn.js" "^5.2.1" - "ethereum-bloom-filters" "^1.0.6" - "ethereumjs-util" "^7.1.0" - "ethjs-unit" "0.1.6" - "number-to-bn" "1.7.0" - "randombytes" "^2.1.0" - "utf8" "3.0.0" - -"webidl-conversions@^3.0.0": - "integrity" "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - "resolved" "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - "version" "3.0.1" - -"whatwg-url@^5.0.0": - "integrity" "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==" - "resolved" "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - "version" "5.0.0" - dependencies: - "tr46" "~0.0.3" - "webidl-conversions" "^3.0.0" - -"which-boxed-primitive@^1.0.2": - "integrity" "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==" - "resolved" "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" - "version" "1.0.2" - 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" - -"which-module@^2.0.0": - "integrity" "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" - "resolved" "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" - "version" "2.0.1" - -"which-typed-array@^1.1.10": - "integrity" "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==" - "resolved" "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz" - "version" "1.1.10" - dependencies: - "available-typed-arrays" "^1.0.5" - "call-bind" "^1.0.2" - "for-each" "^0.3.3" - "gopd" "^1.0.1" - "has-tostringtag" "^1.0.0" - "is-typed-array" "^1.1.10" - -"which@^1.1.1", "which@^1.3.1", "which@1.3.1": - "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" - "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - "version" "1.3.1" - dependencies: - "isexe" "^2.0.0" - -"wide-align@1.1.3": - "integrity" "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==" - "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" - "version" "1.1.3" - dependencies: - "string-width" "^1.0.2 || 2" - -"word-wrap@~1.2.3": - "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" - "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" - "version" "1.2.3" - -"wordwrap@^1.0.0": - "integrity" "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" - "resolved" "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" - "version" "1.0.0" - -"wordwrapjs@^4.0.0": - "integrity" "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==" - "resolved" "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" - "version" "4.0.1" - dependencies: - "reduce-flatten" "^2.0.0" - "typical" "^5.2.0" - -"workerpool@6.2.1": - "integrity" "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" - "resolved" "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" - "version" "6.2.1" - -"wrap-ansi@^5.1.0": - "integrity" "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==" - "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" - "version" "5.1.0" - dependencies: - "ansi-styles" "^3.2.0" - "string-width" "^3.0.0" - "strip-ansi" "^5.0.0" - -"wrap-ansi@^7.0.0": - "integrity" "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==" - "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - "version" "7.0.0" - dependencies: - "ansi-styles" "^4.0.0" - "string-width" "^4.1.0" - "strip-ansi" "^6.0.0" - -"wrappy@1": - "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - "version" "1.0.2" - -"ws@^7.4.6": - "integrity" "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==" - "resolved" "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - "version" "7.5.9" - -"ws@7.4.6": - "integrity" "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" - "resolved" "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" - "version" "7.4.6" - -"ws@8.5.0": - "integrity" "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==" - "resolved" "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz" - "version" "8.5.0" - -"xmlhttprequest@1.8.0": - "integrity" "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==" - "resolved" "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" - "version" "1.8.0" - -"y18n@^4.0.0": - "integrity" "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" - "resolved" "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" - "version" "4.0.3" - -"y18n@^5.0.5": - "integrity" "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - "resolved" "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - "version" "5.0.8" - -"yallist@^3.0.2": - "integrity" "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - "version" "3.1.1" - -"yallist@^4.0.0": - "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - "version" "4.0.0" - -"yargs-parser@^13.1.2", "yargs-parser@13.1.2": - "integrity" "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==" - "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" - "version" "13.1.2" - dependencies: - "camelcase" "^5.0.0" - "decamelize" "^1.2.0" - -"yargs-parser@^20.2.2", "yargs-parser@20.2.4": - "integrity" "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" - "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" - "version" "20.2.4" - -"yargs-unparser@1.6.0": - "integrity" "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==" - "resolved" "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz" - "version" "1.6.0" - dependencies: - "flat" "^4.1.0" - "lodash" "^4.17.15" - "yargs" "^13.3.0" - -"yargs-unparser@2.0.0": - "integrity" "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==" - "resolved" "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" - "version" "2.0.0" - dependencies: - "camelcase" "^6.0.0" - "decamelize" "^4.0.0" - "flat" "^5.0.2" - "is-plain-obj" "^2.1.0" - -"yargs@^13.3.0", "yargs@13.3.2": - "integrity" "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==" - "resolved" "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" - "version" "13.3.2" - 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" - -"yargs@16.2.0": - "integrity" "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==" - "resolved" "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - "version" "16.2.0" - 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" - -"yn@3.1.1": - "integrity" "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" - "resolved" "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" - "version" "3.1.1" - -"yocto-queue@^0.1.0": - "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - "version" "0.1.0" + 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" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typescript@^5.0.4: + version "5.1.6" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + +uglify-js@^3.1.4: + version "3.17.4" + resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +undici@^5.14.0: + version "5.22.1" + resolved "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz" + integrity sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw== + dependencies: + busboy "^1.6.0" + +unfetch@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz" + integrity sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz" + integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +v8-compile-cache-lib@^3.0.1: + 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== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +web3-utils@^1.3.6: + version "1.10.0" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz" + integrity sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg== + 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" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + 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" + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.10: + version "1.1.10" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz" + integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@1.3.1, which@^1.1.1, which@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@~1.2.3: + 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== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +wrap-ansi@^5.1.0: + 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== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@7.4.6: + version "7.4.6" + resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + +ws@8.5.0: + version "8.5.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +xmlhttprequest@1.8.0: + version "1.8.0" + resolved "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" + integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@13.1.2, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@20.2.4, yargs-parser@^20.2.2: + version "20.2.4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@13.3.2, yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + 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" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + 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" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From d82d3d93e4ec24e77aef5d0f08371fbc97dbf2a5 Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Fri, 8 Dec 2023 16:55:11 -0700 Subject: [PATCH 02/18] adding functionality, doing gas tests --- contracts/GitcoinIdentityStaking.sol | 262 ++++++++++++++++++++++++++- test/GitcoinIdentityStaking.ts | 96 ++++++++++ 2 files changed, 355 insertions(+), 3 deletions(-) create mode 100644 test/GitcoinIdentityStaking.ts diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index ee48d54..af26701 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -2,9 +2,12 @@ pragma solidity ^0.8.23; import {Initializable, AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; +import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; +import "hardhat/console.sol"; + /** * @title GitcoinIdentityStaking * @notice This contract is used to stake GTC on self/community identity @@ -15,16 +18,269 @@ contract GitcoinIdentityStaking is UUPSUpgradeable, AccessControlUpgradeable, PausableUpgradeable +{ + using EnumerableSet for EnumerableSet.AddressSet; + + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + struct Stake { + uint256 amount; + uint64 unlockTime; + } + + uint256 public stakeCount; + mapping(address => uint256[]) public selfStakeIds; + mapping(address => mapping(address => uint256[])) public communityStakeIds; + mapping(address => EnumerableSet.AddressSet) private communityStakersForAddress; + mapping(address => EnumerableSet.AddressSet) private communityStakeesForAddress; + + mapping(uint256 => Stake) public stakes; + + uint256 public incrementToReset; + + // season# => amount + mapping(uint256 => uint256) public totalSlashed; + + mapping(uint256 => bool) public slashHashes; + + function initialize() public initializer { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + } + + function selfStake(uint256 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + selfStakeIds[msg.sender].push(stakeId); + } + + function communityStake(address stakee, uint256 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + communityStakeIds[msg.sender][stakee].push(stakeId); + + communityStakeesForAddress[msg.sender].add(stakee); + communityStakersForAddress[stakee].add(msg.sender); + } + + function slash(address[] calldata accounts, uint64 slashedPercent, uint256 slashHash) external { + uint256 numAccounts = accounts.length; + + for (uint256 j = 0; j < numAccounts; j++) { + address account = accounts[j]; + uint256 numSelfStakes = selfStakeIds[account].length; + for (uint256 i = 0; i < numSelfStakes; i++) { + uint256 stakeId = selfStakeIds[account][i]; + uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; + totalSlashed[incrementToReset] += slashedAmount; + stakes[stakeId].amount -= slashedAmount; + } + + uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); + for (uint256 i = 0; i < numStakedOnByMe; i++) { + address stakee = communityStakeesForAddress[account].at(i); + uint256 numStakes = communityStakeIds[account][stakee].length; + for (uint256 i = 0; i < numStakes; i++) { + uint256 stakeId = communityStakeIds[account][stakee][i]; + uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; + totalSlashed[incrementToReset] += slashedAmount; + stakes[stakeId].amount -= slashedAmount; + } + } + + uint256 numOthersStakingMe = communityStakersForAddress[account].length(); + for (uint256 i = 0; i < numOthersStakingMe; i++) { + address staker = communityStakersForAddress[account].at(i); + uint256 numStakes = communityStakeIds[staker][account].length; + for (uint256 i = 0; i < numStakes; i++) { + uint256 stakeId = communityStakeIds[staker][account][i]; + uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; + totalSlashed[incrementToReset] += slashedAmount; + stakes[stakeId].amount -= slashedAmount; + } + } + } + + slashHashes[slashHash] = true; + } + + function burn() external { + // TODO check that threshold has passed since last burn, save this timestamp + incrementToReset++; + } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} + +contract GitcoinIdentityStaking2 is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + struct Stake { + uint256 amount; + uint64 unlockTime; + uint64 slashedPercent; + uint64 slashedTime; + } + + mapping(address => uint256[]) public selfStakeIds; + mapping(uint256 => Stake) public stakes; + uint256 public stakeCount; + uint256[] public slashed; + + function initialize() public initializer { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + } + + function selfStake(uint256 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + selfStakeIds[msg.sender].push(stakeId); + } + + // NOTE don't allow increasing stake amount for a stake that has slashedPercent > 0 + + function slash(address[] calldata accounts, uint64 slashedPercent) external { + uint256 numAccounts = accounts.length; + for (uint256 j = 0; j < numAccounts; j++) { + address account = accounts[j]; + uint256 numStakes = selfStakeIds[account].length; + for (uint256 i = 0; i < numStakes; i++) { + uint256 stakeId = selfStakeIds[account][i]; + uint64 newSlashedPercent = 100 - + ((100 - slashedPercent) * (100 - stakes[stakeId].slashedPercent)) / + 100; + stakes[stakeId].slashedPercent = newSlashedPercent; + stakes[stakeId].slashedTime = uint64(block.timestamp); + slashed.push(stakeId); + } + } + } + + function burn() external { + uint256 numSlashed = slashed.length; + for (uint256 i = 0; i < numSlashed; i++) { + if (stakes[slashed[i]].slashedTime > 0) { + uint256 stakeId = slashed[i]; + uint256 slashedAmount = (stakes[stakeId].slashedPercent * + stakes[stakeId].amount) / 100; + stakes[stakeId].amount -= slashedAmount; + } + } + slashed = new uint256[](0); + } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} + +contract GitcoinIdentityStaking3 is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable { bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); error OnlySlasher(); error OnlyAdmin(); - constructor() { - // Grant the minter role to a specified account + struct Stake { + uint256 amount; + uint64 unlockTime; + } + + struct Slash { + uint64 slashedPercent; + uint64 slashedTime; + } + + mapping(address => uint256[]) public selfStakeIds; + mapping(uint256 => Stake) public stakes; + mapping(uint256 => Slash) public slashes; + uint256 public stakeCount; + + function initialize() public initializer { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + } + + function selfStake(uint256 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + selfStakeIds[msg.sender].push(stakeId); } - function _authorizeUpgrade(address) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} + // NOTE don't allow increasing stake amount for a stake that has slashedPercent > 0 + + function slash(address[] calldata accounts, uint64 slashedPercent) external { + uint256 numAccounts = accounts.length; + for (uint256 j = 0; j < numAccounts; j++) { + address account = accounts[j]; + uint256 numStakes = selfStakeIds[account].length; + for (uint256 i = 0; i < numStakes; i++) { + uint256 stakeId = selfStakeIds[account][i]; + uint64 newSlashedPercent = 100 - + ((100 - slashedPercent) * (100 - slashes[stakeId].slashedPercent)) / + 100; + slashes[stakeId].slashedPercent = newSlashedPercent; + slashes[stakeId].slashedTime = uint64(block.timestamp); + } + } + } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} + + function burn(uint256[] calldata ids) external { + uint256 numIds = ids.length; + for (uint256 i = 0; i < numIds; i++) { + if (slashes[ids[i]].slashedTime > 0) { + uint256 stakeId = ids[i]; + uint256 slashedAmount = (slashes[stakeId].slashedPercent * + stakes[stakeId].amount) / 100; + stakes[stakeId].amount -= slashedAmount; + } + } + } } diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts new file mode 100644 index 0000000..710479a --- /dev/null +++ b/test/GitcoinIdentityStaking.ts @@ -0,0 +1,96 @@ +import { expect } from "chai"; +import { ethers } from "hardhat"; + +describe("GitcoinIdentityStaking", function () { + this.beforeEach(async function () { + const [ownerAccount, ...userAccounts] = await ethers.getSigners(); + + this.owner = ownerAccount; + this.userAccounts = userAccounts; + + // Deploy GitcoinAttester + const GitcoinIdentityStaking = await ethers.getContractFactory( + "GitcoinIdentityStaking", + this.owner + ); + this.gitcoinIdentityStaking = await GitcoinIdentityStaking.deploy(); + await this.gitcoinIdentityStaking.connect(this.owner).initialize(); + // + // Deploy GitcoinAttester + const GitcoinIdentityStaking2 = await ethers.getContractFactory( + "GitcoinIdentityStaking2", + this.owner + ); + this.gitcoinIdentityStaking2 = await GitcoinIdentityStaking2.deploy(); + await this.gitcoinIdentityStaking2.connect(this.owner).initialize(); + + const GitcoinIdentityStaking3 = await ethers.getContractFactory( + "GitcoinIdentityStaking3", + this.owner + ); + this.gitcoinIdentityStaking3 = await GitcoinIdentityStaking3.deploy(); + await this.gitcoinIdentityStaking3.connect(this.owner).initialize(); + }); + + it.only("self stake gas tests", async function () { + const userAccounts = this.userAccounts.slice(0, 1); + + await Promise.all( + [ + this.gitcoinIdentityStaking + // this.gitcoinIdentityStaking2, + // this.gitcoinIdentityStaking3 + ].map(async (gitcoinIdentityStaking: any, idx: number) => { + await Promise.all( + userAccounts.map(async (userAccount: any, accountIdx: number) => { + await gitcoinIdentityStaking + .connect(userAccount) + .selfStake(100000, 1702165387); + + await gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[accountIdx + 1], + 100000, + 1702165387 + ); + + await gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[ + accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 + ], + 100000, + 1702165387 + ); + }) + ); + + expect(await gitcoinIdentityStaking.stakeCount()).to.equal( + userAccounts.length * 3 + ); + + const addresses = userAccounts.map( + ({ address }: { address: string }) => address + ); + + await gitcoinIdentityStaking + .connect(this.owner) + .slash(addresses, 50, 123); + + await gitcoinIdentityStaking + .connect(this.owner) + .slash(addresses, 50, 456); + + if (idx === 2) { + await gitcoinIdentityStaking + .connect(this.owner) + .burn([...Array(userAccounts.length * 2).keys()].map((i) => i + 1)); + } else { + await gitcoinIdentityStaking.connect(this.owner).burn(); + } + }) + ); + }); +}); From 0e77ca02dd79632e57b4c2b0ce5c16b2993d4932 Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Mon, 18 Dec 2023 16:34:25 -0700 Subject: [PATCH 03/18] continuing gas tests --- contracts/GitcoinIdentityStaking.sol | 729 ++++++++++++++++++++++++--- contracts/mocks/GTC.sol | 410 +++++++++++++++ contracts/mocks/SafeMath.sol | 186 +++++++ hardhat.config.ts | 28 +- test/GitcoinIdentityStaking.ts | 173 +++++-- 5 files changed, 1388 insertions(+), 138 deletions(-) create mode 100644 contracts/mocks/GTC.sol create mode 100644 contracts/mocks/SafeMath.sol diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index af26701..508f8b6 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -2,9 +2,10 @@ pragma solidity ^0.8.23; import {Initializable, AccessControlUpgradeable} from "@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol"; -import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; +import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; +import {GTC} from "./mocks/GTC.sol"; import "hardhat/console.sol"; @@ -13,6 +14,7 @@ import "hardhat/console.sol"; * @notice This contract is used to stake GTC on self/community identity */ +// Control contract GitcoinIdentityStaking is Initializable, UUPSUpgradeable, @@ -31,26 +33,32 @@ contract GitcoinIdentityStaking is uint64 unlockTime; } - uint256 public stakeCount; mapping(address => uint256[]) public selfStakeIds; mapping(address => mapping(address => uint256[])) public communityStakeIds; - mapping(address => EnumerableSet.AddressSet) private communityStakersForAddress; - mapping(address => EnumerableSet.AddressSet) private communityStakeesForAddress; + mapping(address => EnumerableSet.AddressSet) + private communityStakersForAddress; + mapping(address => EnumerableSet.AddressSet) + private communityStakeesForAddress; + + mapping(uint256 stakeId => Stake) public stakes; + uint256 public stakeCount; - mapping(uint256 => Stake) public stakes; + uint256 public currentBurnRound = 1; - uint256 public incrementToReset; + mapping(uint256 round => uint256 amount) public totalSlashed; - // season# => amount - mapping(uint256 => uint256) public totalSlashed; + // Used to permit unfreeze + mapping(uint256 => bool) public slashProofHashes; - mapping(uint256 => bool) public slashHashes; + GTC public gtc; - function initialize() public initializer { + function initialize(address gtcAddress) public initializer { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); __AccessControl_init(); __Pausable_init(); + + gtc = GTC(gtcAddress); } function selfStake(uint256 amount, uint64 unlockTime) external { @@ -60,10 +68,17 @@ contract GitcoinIdentityStaking is uint256 stakeId = ++stakeCount; stakes[stakeId].amount = amount; stakes[stakeId].unlockTime = unlockTime; + + gtc.transferFrom(msg.sender, address(this), amount); + selfStakeIds[msg.sender].push(stakeId); } - function communityStake(address stakee, uint256 amount, uint64 unlockTime) external { + function communityStake( + address stakee, + uint256 amount, + uint64 unlockTime + ) external { require(amount > 0, "Amount must be greater than 0"); require(unlockTime > block.timestamp, "Unlock time must be in the future"); @@ -73,67 +88,91 @@ contract GitcoinIdentityStaking is communityStakeIds[msg.sender][stakee].push(stakeId); + gtc.transferFrom(msg.sender, address(this), amount); + communityStakeesForAddress[msg.sender].add(stakee); communityStakersForAddress[stakee].add(msg.sender); } - function slash(address[] calldata accounts, uint64 slashedPercent, uint256 slashHash) external { + function slash( + address[] calldata accounts, + uint64 slashedPercent, + uint256 slashProofHash + ) external { uint256 numAccounts = accounts.length; - for (uint256 j = 0; j < numAccounts; j++) { - address account = accounts[j]; + for (uint256 i = 0; i < numAccounts; i++) { + address account = accounts[i]; uint256 numSelfStakes = selfStakeIds[account].length; - for (uint256 i = 0; i < numSelfStakes; i++) { - uint256 stakeId = selfStakeIds[account][i]; + for (uint256 j = 0; j < numSelfStakes; j++) { + uint256 stakeId = selfStakeIds[account][j]; uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; - totalSlashed[incrementToReset] += slashedAmount; + totalSlashed[currentBurnRound] += slashedAmount; stakes[stakeId].amount -= slashedAmount; } uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); - for (uint256 i = 0; i < numStakedOnByMe; i++) { - address stakee = communityStakeesForAddress[account].at(i); + for (uint256 j = 0; j < numStakedOnByMe; j++) { + address stakee = communityStakeesForAddress[account].at(j); uint256 numStakes = communityStakeIds[account][stakee].length; - for (uint256 i = 0; i < numStakes; i++) { - uint256 stakeId = communityStakeIds[account][stakee][i]; - uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; - totalSlashed[incrementToReset] += slashedAmount; + for (uint256 k = 0; k < numStakes; k++) { + uint256 stakeId = communityStakeIds[account][stakee][k]; + uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / + 100; + totalSlashed[currentBurnRound] += slashedAmount; stakes[stakeId].amount -= slashedAmount; } } uint256 numOthersStakingMe = communityStakersForAddress[account].length(); - for (uint256 i = 0; i < numOthersStakingMe; i++) { - address staker = communityStakersForAddress[account].at(i); + for (uint256 j = 0; j < numOthersStakingMe; j++) { + address staker = communityStakersForAddress[account].at(j); uint256 numStakes = communityStakeIds[staker][account].length; - for (uint256 i = 0; i < numStakes; i++) { - uint256 stakeId = communityStakeIds[staker][account][i]; - uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; - totalSlashed[incrementToReset] += slashedAmount; + for (uint256 k = 0; k < numStakes; k++) { + uint256 stakeId = communityStakeIds[staker][account][k]; + uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / + 100; + totalSlashed[currentBurnRound] += slashedAmount; stakes[stakeId].amount -= slashedAmount; } } } - slashHashes[slashHash] = true; + slashProofHashes[slashProofHash] = true; } + // Burn last round, start next round (locking this round) + // Rounds don't matter, this is just to time the slashing function burn() external { // TODO check that threshold has passed since last burn, save this timestamp - incrementToReset++; + + gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); + + currentBurnRound++; } + // Pseudocode + // function release(address, amount, proof, slashProofHash) external { + // require(msg.sender has Releaser role) + // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); + // checkProof(proof, slashProofHash); // Probably merkle membership? + // // release + // } + function _authorizeUpgrade( address ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} } +// Tracking slashes explicitly in contract contract GitcoinIdentityStaking2 is Initializable, UUPSUpgradeable, AccessControlUpgradeable, PausableUpgradeable { + using EnumerableSet for EnumerableSet.AddressSet; + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); error OnlySlasher(); @@ -142,20 +181,35 @@ contract GitcoinIdentityStaking2 is struct Stake { uint256 amount; uint64 unlockTime; - uint64 slashedPercent; - uint64 slashedTime; + } + + struct Slash { + uint256 amount; + uint64 time; + address[] accounts; } mapping(address => uint256[]) public selfStakeIds; - mapping(uint256 => Stake) public stakes; + mapping(address => mapping(address => uint256[])) public communityStakeIds; + mapping(address => EnumerableSet.AddressSet) + private communityStakersForAddress; + mapping(address => EnumerableSet.AddressSet) + private communityStakeesForAddress; + + mapping(uint256 stakeId => Stake) public stakes; + mapping(uint256 slashId => Slash) public slashes; uint256 public stakeCount; - uint256[] public slashed; + uint256 public slashCount; - function initialize() public initializer { + GTC public gtc; + + function initialize(address gtcAddress) public initializer { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); __AccessControl_init(); __Pausable_init(); + + gtc = GTC(gtcAddress); } function selfStake(uint256 amount, uint64 unlockTime) external { @@ -169,49 +223,108 @@ contract GitcoinIdentityStaking2 is selfStakeIds[msg.sender].push(stakeId); } - // NOTE don't allow increasing stake amount for a stake that has slashedPercent > 0 + function communityStake( + address stakee, + uint256 amount, + uint64 unlockTime + ) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + communityStakeIds[msg.sender][stakee].push(stakeId); + + communityStakeesForAddress[msg.sender].add(stakee); + communityStakersForAddress[stakee].add(msg.sender); + } function slash(address[] calldata accounts, uint64 slashedPercent) external { + uint256 totalSlashed = 0; uint256 numAccounts = accounts.length; - for (uint256 j = 0; j < numAccounts; j++) { - address account = accounts[j]; - uint256 numStakes = selfStakeIds[account].length; - for (uint256 i = 0; i < numStakes; i++) { - uint256 stakeId = selfStakeIds[account][i]; - uint64 newSlashedPercent = 100 - - ((100 - slashedPercent) * (100 - stakes[stakeId].slashedPercent)) / - 100; - stakes[stakeId].slashedPercent = newSlashedPercent; - stakes[stakeId].slashedTime = uint64(block.timestamp); - slashed.push(stakeId); + for (uint256 i = 0; i < numAccounts; i++) { + address account = accounts[i]; + uint256 selfStakeCount = selfStakeIds[account].length; + for (uint256 j = 0; j < selfStakeCount; j++) { + uint256 stakeId = selfStakeIds[account][j]; + uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; + stakes[stakeId].amount -= slashedAmount; + totalSlashed += slashedAmount; + } + + uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); + for (uint256 j = 0; j < numStakedOnByMe; j++) { + address stakee = communityStakeesForAddress[account].at(j); + uint256 numStakes = communityStakeIds[account][stakee].length; + for (uint256 k = 0; k < numStakes; k++) { + uint256 stakeId = communityStakeIds[account][stakee][k]; + uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / + 100; + stakes[stakeId].amount -= slashedAmount; + totalSlashed += slashedAmount; + } + } + + uint256 numOthersStakingMe = communityStakersForAddress[account].length(); + for (uint256 j = 0; j < numOthersStakingMe; j++) { + address staker = communityStakersForAddress[account].at(j); + uint256 numStakes = communityStakeIds[staker][account].length; + for (uint256 k = 0; k < numStakes; k++) { + uint256 stakeId = communityStakeIds[staker][account][k]; + uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / + 100; + stakes[stakeId].amount -= slashedAmount; + totalSlashed += slashedAmount; + } } } + + slashes[slashCount].amount = totalSlashed; + slashes[slashCount].time = uint64(block.timestamp); + slashes[slashCount].accounts = accounts; + + slashCount++; } - function burn() external { - uint256 numSlashed = slashed.length; - for (uint256 i = 0; i < numSlashed; i++) { - if (stakes[slashed[i]].slashedTime > 0) { - uint256 stakeId = slashed[i]; - uint256 slashedAmount = (stakes[stakeId].slashedPercent * - stakes[stakeId].amount) / 100; - stakes[stakeId].amount -= slashedAmount; + function burn(uint256[] calldata slashIds) external { + uint256 amountToBurn = 0; + + uint256 numIds = slashIds.length; + for (uint256 i = 0; i < numIds; i++) { + uint256 slashId = slashIds[i]; + if (slashes[slashId].time > 0) { + amountToBurn += slashes[slashId].amount; } + + delete slashes[slashId]; } - slashed = new uint256[](0); + // burn amountToBurn } + // Pseudocode + // function release(address, amount, slashId) external { + // require(msg.sender has Releaser role) + // require(slashed[slashId] exists) + // require(slashes[slashId].accounts.contains(address)) + // // release + // } + function _authorizeUpgrade( address ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} } +// Track slashes explicitly, move gas usage to burn contract GitcoinIdentityStaking3 is Initializable, UUPSUpgradeable, AccessControlUpgradeable, PausableUpgradeable { + using EnumerableSet for EnumerableSet.AddressSet; + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); error OnlySlasher(); @@ -223,22 +336,40 @@ contract GitcoinIdentityStaking3 is } struct Slash { - uint64 slashedPercent; - uint64 slashedTime; + uint64 percent; + uint64 time; + address[] accounts; } mapping(address => uint256[]) public selfStakeIds; - mapping(uint256 => Stake) public stakes; - mapping(uint256 => Slash) public slashes; + mapping(address => mapping(address => uint256[])) public communityStakeIds; + mapping(address => EnumerableSet.AddressSet) + private communityStakersForAddress; + mapping(address => EnumerableSet.AddressSet) + private communityStakeesForAddress; + + mapping(uint256 stakeId => Stake) public stakes; + mapping(uint256 slashId => Slash) public slashes; uint256 public stakeCount; + uint256 public slashCount; - function initialize() public initializer { + GTC public gtc; + + function initialize(address gtcAddress) public initializer { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); __AccessControl_init(); __Pausable_init(); + + gtc = GTC(gtcAddress); } + // For this one, getting self and community stake totals is + // WAY more complex, all the slashing calculations from the + // `burn` function must be executed for **any** read. But + // if we don't need to ever read this data as part of a + // transaction, that's fine + function selfStake(uint256 amount, uint64 unlockTime) external { require(amount > 0, "Amount must be greater than 0"); require(unlockTime > block.timestamp, "Unlock time must be in the future"); @@ -250,37 +381,475 @@ contract GitcoinIdentityStaking3 is selfStakeIds[msg.sender].push(stakeId); } - // NOTE don't allow increasing stake amount for a stake that has slashedPercent > 0 + function communityStake( + address stakee, + uint256 amount, + uint64 unlockTime + ) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + communityStakeIds[msg.sender][stakee].push(stakeId); + + communityStakeesForAddress[msg.sender].add(stakee); + communityStakersForAddress[stakee].add(msg.sender); + } function slash(address[] calldata accounts, uint64 slashedPercent) external { + slashes[slashCount].percent = slashedPercent; + slashes[slashCount].time = uint64(block.timestamp); + slashes[slashCount].accounts = accounts; + + slashCount++; + } + + // This kind of sucks because if there are new community stakers + // after your slash but before the burn, they'll be slashed too + // So we need to store more info or something + function burn(uint256[] calldata slashIds) external { + uint256 amountToBurn = 0; + + uint256 numIds = slashIds.length; + for (uint256 i = 0; i < numIds; i++) { + uint64 slashedPercent = slashes[slashIds[i]].percent; + + for (uint256 j = 0; j < slashes[slashIds[i]].accounts.length; j++) { + address account = slashes[slashIds[i]].accounts[j]; + uint256 selfStakeCount = selfStakeIds[account].length; + for (uint256 k = 0; k < selfStakeCount; k++) { + uint256 stakeId = selfStakeIds[account][k]; + uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / + 100; + stakes[stakeId].amount -= slashedAmount; + amountToBurn += slashedAmount; + } + + uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); + for (uint256 k = 0; k < numStakedOnByMe; k++) { + address stakee = communityStakeesForAddress[account].at(k); + uint256 numStakes = communityStakeIds[account][stakee].length; + for (uint256 l = 0; l < numStakes; l++) { + uint256 stakeId = communityStakeIds[account][stakee][l]; + uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / + 100; + stakes[stakeId].amount -= slashedAmount; + amountToBurn += slashedAmount; + } + } + + uint256 numOthersStakingMe = communityStakersForAddress[account] + .length(); + for (uint256 k = 0; k < numOthersStakingMe; k++) { + address staker = communityStakersForAddress[account].at(k); + uint256 numStakes = communityStakeIds[staker][account].length; + for (uint256 l = 0; l < numStakes; l++) { + uint256 stakeId = communityStakeIds[staker][account][l]; + uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / + 100; + stakes[stakeId].amount -= slashedAmount; + amountToBurn += slashedAmount; + } + } + } + + delete slashes[slashIds[i]]; + } + // burn amountToBurn + } + + // Pseudocode + // function release(address, amount, slashId) external { + // require(msg.sender has Releaser role) + // } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} + +// Only one stake per stakee:staker, lock period +contract GitcoinIdentityStaking4 is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + using EnumerableSet for EnumerableSet.AddressSet; + + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + mapping(address => uint256) public selfStakeAmount; + mapping(address => mapping(address => uint256)) public communityStakeAmounts; + + mapping(address staker => mapping(address stakee => bool)) + public unlockPending; + + mapping(address => EnumerableSet.AddressSet) + private communityStakersForAddress; + mapping(address => EnumerableSet.AddressSet) + private communityStakeesForAddress; + + uint256 public currentBurnRound = 1; + + mapping(uint256 round => uint256 amount) public totalSlashed; + + // Used to permit unfreeze + mapping(uint256 => bool) public slashProofHashes; + + GTC public gtc; + + function initialize(address gtcAddress) public initializer { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + + gtc = GTC(gtcAddress); + } + + function selfStake(uint256 amount) external { + // require(amount > 0, "Amount must be greater than 0"); + // require(unlockPending[msg.sender][msg.sender] == false, "Unlock pending"); + + gtc.transferFrom(msg.sender, address(this), amount); + + selfStakeAmount[msg.sender] += amount; + } + + function communityStake(address stakee, uint256 amount) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockPending[msg.sender][stakee] == false, "Unlock pending"); + + communityStakeAmounts[msg.sender][stakee] += amount; + + gtc.transferFrom(msg.sender, address(this), amount); + + communityStakeesForAddress[msg.sender].add(stakee); + communityStakersForAddress[stakee].add(msg.sender); + } + + function slash( + address[] calldata accounts, + uint64 slashedPercent, + uint256 slashProofHash + ) external { uint256 numAccounts = accounts.length; - for (uint256 j = 0; j < numAccounts; j++) { - address account = accounts[j]; - uint256 numStakes = selfStakeIds[account].length; - for (uint256 i = 0; i < numStakes; i++) { - uint256 stakeId = selfStakeIds[account][i]; - uint64 newSlashedPercent = 100 - - ((100 - slashedPercent) * (100 - slashes[stakeId].slashedPercent)) / + + for (uint256 i = 0; i < numAccounts; i++) { + address account = accounts[i]; + + uint256 selfSlashedAmount = (slashedPercent * selfStakeAmount[account]) / 100; + totalSlashed[currentBurnRound] += selfSlashedAmount; + selfStakeAmount[account] -= selfSlashedAmount; + + uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); + for (uint256 j = 0; j < numStakedOnByMe; j++) { + address stakee = communityStakeesForAddress[account].at(j); + uint256 slashedAmount = (slashedPercent * communityStakeAmounts[account][stakee]) / + 100; + totalSlashed[currentBurnRound] += slashedAmount; + communityStakeAmounts[account][stakee] -= slashedAmount; + } + + uint256 numOthersStakingMe = communityStakersForAddress[account].length(); + for (uint256 j = 0; j < numOthersStakingMe; j++) { + address staker = communityStakersForAddress[account].at(j); + uint256 slashedAmount = (slashedPercent * communityStakeAmounts[staker][account]) / 100; - slashes[stakeId].slashedPercent = newSlashedPercent; - slashes[stakeId].slashedTime = uint64(block.timestamp); + totalSlashed[currentBurnRound] += slashedAmount; + communityStakeAmounts[staker][account] -= slashedAmount; } } + + slashProofHashes[slashProofHash] = true; } + // Burn last round, start next round (locking this round) + // Rounds don't matter, this is just to time the slashing + function burn() external { + // TODO check that threshold has passed since last burn, save this timestamp + + gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); + + currentBurnRound++; + } + + // Pseudocode + // function release(address, amount, proof, slashProofHash) external { + // require(msg.sender has Releaser role) + // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); + // checkProof(proof, slashProofHash); // Probably merkle membership? + // // release + // } + function _authorizeUpgrade( address ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} - function burn(uint256[] calldata ids) external { - uint256 numIds = ids.length; - for (uint256 i = 0; i < numIds; i++) { - if (slashes[ids[i]].slashedTime > 0) { - uint256 stakeId = ids[i]; - uint256 slashedAmount = (slashes[stakeId].slashedPercent * - stakes[stakeId].amount) / 100; - stakes[stakeId].amount -= slashedAmount; +// Only one stake per stakee:staker +contract GitcoinIdentityStaking5 is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + using EnumerableSet for EnumerableSet.AddressSet; + + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + struct Stake { + uint256 amount; + uint64 unlockTime; + } + + mapping(address => Stake) public selfStakeAmount; + mapping(address => mapping(address => Stake)) public communityStakeAmounts; + + mapping(address staker => mapping(address stakee => bool)) + public unlockPending; + + mapping(address => EnumerableSet.AddressSet) + private communityStakersForAddress; + mapping(address => EnumerableSet.AddressSet) + private communityStakeesForAddress; + + uint256 public currentBurnRound = 1; + + mapping(uint256 round => uint256 amount) public totalSlashed; + + // Used to permit unfreeze + mapping(uint256 => bool) public slashProofHashes; + + GTC public gtc; + + function initialize(address gtcAddress) public initializer { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + + gtc = GTC(gtcAddress); + } + + function selfStake(uint256 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockPending[msg.sender][msg.sender] == false, "Unlock pending"); + + gtc.transferFrom(msg.sender, address(this), amount); + + selfStakeAmount[msg.sender].amount += amount; + selfStakeAmount[msg.sender].unlockTime = unlockTime; + } + + function communityStake(address stakee, uint256 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockPending[msg.sender][stakee] == false, "Unlock pending"); + + communityStakeAmounts[msg.sender][stakee].amount += amount; + communityStakeAmounts[msg.sender][stakee].unlockTime = unlockTime; + + gtc.transferFrom(msg.sender, address(this), amount); + + communityStakeesForAddress[msg.sender].add(stakee); + communityStakersForAddress[stakee].add(msg.sender); + } + + function slash( + address[] calldata accounts, + uint64 slashedPercent, + uint256 slashProofHash + ) external { + uint256 numAccounts = accounts.length; + + for (uint256 i = 0; i < numAccounts; i++) { + address account = accounts[i]; + + uint256 selfSlashedAmount = (slashedPercent * selfStakeAmount[account].amount) / 100; + totalSlashed[currentBurnRound] += selfSlashedAmount; + selfStakeAmount[account].amount -= selfSlashedAmount; + + uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); + for (uint256 j = 0; j < numStakedOnByMe; j++) { + address stakee = communityStakeesForAddress[account].at(j); + uint256 slashedAmount = (slashedPercent * communityStakeAmounts[account][stakee].amount) / + 100; + totalSlashed[currentBurnRound] += slashedAmount; + communityStakeAmounts[account][stakee].amount -= slashedAmount; + } + + uint256 numOthersStakingMe = communityStakersForAddress[account].length(); + for (uint256 j = 0; j < numOthersStakingMe; j++) { + address staker = communityStakersForAddress[account].at(j); + uint256 slashedAmount = (slashedPercent * communityStakeAmounts[staker][account].amount) / + 100; + totalSlashed[currentBurnRound] += slashedAmount; + communityStakeAmounts[staker][account].amount -= slashedAmount; + } + } + + slashProofHashes[slashProofHash] = true; + } + + // Burn last round, start next round (locking this round) + // Rounds don't matter, this is just to time the slashing + function burn() external { + // TODO check that threshold has passed since last burn, save this timestamp + + gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); + + currentBurnRound++; + } + + // Pseudocode + // function release(address, amount, proof, slashProofHash) external { + // require(msg.sender has Releaser role) + // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); + // checkProof(proof, slashProofHash); // Probably merkle membership? + // // release + // } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} + +// Only one stake per stakee:staker, store amount as uint192 +contract GitcoinIdentityStaking6 is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + using EnumerableSet for EnumerableSet.AddressSet; + + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + struct Stake { + uint192 amount; + uint64 unlockTime; + } + + mapping(address => Stake) public selfStakeAmount; + mapping(address => mapping(address => Stake)) public communityStakeAmounts; + + mapping(address staker => mapping(address stakee => bool)) + public unlockPending; + + mapping(address => EnumerableSet.AddressSet) + private communityStakersForAddress; + mapping(address => EnumerableSet.AddressSet) + private communityStakeesForAddress; + + uint256 public currentBurnRound = 1; + + mapping(uint256 round => uint192 amount) public totalSlashed; + + // Used to permit unfreeze + mapping(uint256 => bool) public slashProofHashes; + + GTC public gtc; + + function initialize(address gtcAddress) public initializer { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + + gtc = GTC(gtcAddress); + } + + function selfStake(uint192 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockPending[msg.sender][msg.sender] == false, "Unlock pending"); + + gtc.transferFrom(msg.sender, address(this), uint256(amount)); + + selfStakeAmount[msg.sender].amount += amount; + selfStakeAmount[msg.sender].unlockTime = unlockTime; + } + + function communityStake(address stakee, uint192 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockPending[msg.sender][stakee] == false, "Unlock pending"); + + communityStakeAmounts[msg.sender][stakee].amount += amount; + communityStakeAmounts[msg.sender][stakee].unlockTime = unlockTime; + + gtc.transferFrom(msg.sender, address(this), uint256(amount)); + + communityStakeesForAddress[msg.sender].add(stakee); + communityStakersForAddress[stakee].add(msg.sender); + } + + function slash( + address[] calldata accounts, + uint64 slashedPercent, + uint256 slashProofHash + ) external { + uint256 numAccounts = accounts.length; + + for (uint256 i = 0; i < numAccounts; i++) { + address account = accounts[i]; + + uint192 selfSlashedAmount = (slashedPercent * selfStakeAmount[account].amount) / 100; + totalSlashed[currentBurnRound] += selfSlashedAmount; + selfStakeAmount[account].amount -= selfSlashedAmount; + + uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); + for (uint256 j = 0; j < numStakedOnByMe; j++) { + address stakee = communityStakeesForAddress[account].at(j); + uint192 slashedAmount = (slashedPercent * communityStakeAmounts[account][stakee].amount) / + 100; + totalSlashed[currentBurnRound] += slashedAmount; + communityStakeAmounts[account][stakee].amount -= slashedAmount; + } + + uint256 numOthersStakingMe = communityStakersForAddress[account].length(); + for (uint256 j = 0; j < numOthersStakingMe; j++) { + address staker = communityStakersForAddress[account].at(j); + uint192 slashedAmount = (slashedPercent * communityStakeAmounts[staker][account].amount) / + 100; + totalSlashed[currentBurnRound] += slashedAmount; + communityStakeAmounts[staker][account].amount -= slashedAmount; } } + + slashProofHashes[slashProofHash] = true; + } + + // Burn last round, start next round (locking this round) + // Rounds don't matter, this is just to time the slashing + function burn() external { + // TODO check that threshold has passed since last burn, save this timestamp + + gtc.transfer(address(1), uint256(totalSlashed[currentBurnRound - 1])); + + currentBurnRound++; } + + // Pseudocode + // function release(address, amount, proof, slashProofHash) external { + // require(msg.sender has Releaser role) + // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); + // checkProof(proof, slashProofHash); // Probably merkle membership? + // // release + // } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} } diff --git a/contracts/mocks/GTC.sol b/contracts/mocks/GTC.sol new file mode 100644 index 0000000..1a18cee --- /dev/null +++ b/contracts/mocks/GTC.sol @@ -0,0 +1,410 @@ +pragma solidity 0.8.23; + +import "./SafeMath.sol"; + +contract GTC { + /// @notice EIP-20 token name for this token + string public constant name = "Gitcoin"; + + /// @notice EIP-20 token symbol for this token + string public constant symbol = "GTC"; + + /// @notice EIP-20 token decimals for this token + uint8 public constant decimals = 18; + + /// @notice Total number of tokens in circulation + uint public totalSupply = 100_000_000e18; // 100 million GTC + + /// @notice Address which may mint new tokens + address public minter; + + /// @notice Address of the GTCDistribution contract + address public GTCDist; + + /// @notice The timestamp after which minting may occur + uint public mintingAllowedAfter; + + /// @notice Minimum time between mints + uint32 public constant minimumTimeBetweenMints = 1 days * 365; + + /// @notice Cap on the percentage of totalSupply that can be minted at each mint + uint8 public constant mintCap = 2; + + /// @notice Allowance amounts on behalf of others + mapping (address => mapping (address => uint96)) internal allowances; + + /// @notice Official record of token balances for each account + mapping (address => uint96) internal balances; + + /// @notice A record of each accounts delegate + mapping (address => address) public delegates; + + /// @notice A checkpoint for marking number of votes from a given block + struct Checkpoint { + uint32 fromBlock; + uint96 votes; + } + + /// @notice A record of votes checkpoints for each account, by index + mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; + + /// @notice The number of checkpoints for each account + mapping (address => uint32) public numCheckpoints; + + /// @notice The EIP-712 typehash for the contract's domain + bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); + + /// @notice The EIP-712 typehash for the delegation struct used by the contract + bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); + + /// @notice The EIP-712 typehash for the permit struct used by the contract + bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); + + /// @notice A record of states for signing / validating signatures + mapping (address => uint) public nonces; + + /// @notice An event thats emitted when the minter address is changed + event MinterChanged(address minter, address newMinter); + + /// @notice An event thats emitted when the minter address is changed + event GTCDistChanged(address delegator, address delegatee); + + /// @notice An event thats emitted when an account changes its delegate + event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); + + /// @notice An event thats emitted when a delegate account's vote balance changes + event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); + + /// @notice The standard EIP-20 transfer event + event Transfer(address indexed from, address indexed to, uint256 amount); + + /// @notice The standard EIP-20 approval event + event Approval(address indexed owner, address indexed spender, uint256 amount); + + /** + * @notice Construct a new GTC token + * @param account The initial account to grant all the tokens + * @param minter_ The account with minting ability + * @param mintingAllowedAfter_ The timestamp after which minting may occur + */ + constructor(address account, address minter_, uint mintingAllowedAfter_) public { + require(mintingAllowedAfter_ >= block.timestamp, "GTC::constructor: minting can only begin after deployment"); + balances[account] = uint96(totalSupply); + emit Transfer(address(0), account, totalSupply); + minter = minter_; + emit MinterChanged(address(0), minter); + mintingAllowedAfter = mintingAllowedAfter_; + } + + /** + * @notice Change the minter address + * @param minter_ The address of the new minter + */ + function setMinter(address minter_) external { + require(msg.sender == minter, "GTC::setMinter: only the minter can change the minter address"); + emit MinterChanged(minter, minter_); + minter = minter_; + } + + /** + * @notice Change/set TokenDistribution address, needs to be called after GTCToken contract is deployed + * @param GTCDist_ The address of the TokenDistributor contract + */ + function setGTCDist(address GTCDist_) external { + require(msg.sender == minter, "GTC::setGTCDist: only the minter can change the GTCDist address"); + emit GTCDistChanged(GTCDist, GTCDist_); + GTCDist = GTCDist_; + } + + /** + * @notice Mint new tokens + * @param dst The address of the destination account + * @param rawAmount The number of tokens to be minted + */ + function mint(address dst, uint rawAmount) external { + require(msg.sender == minter, "GTC::mint: only the minter can mint"); + // require(block.timestamp >= mintingAllowedAfter, "GTC::mint: minting not allowed yet"); + require(dst != address(0), "GTC::mint: cannot transfer to the zero address"); + + // record the mint + mintingAllowedAfter = SafeMath.add(block.timestamp, minimumTimeBetweenMints); + + // mint the amount + uint96 amount = safe96(rawAmount, "GTC::mint: amount exceeds 96 bits"); + require(amount <= SafeMath.div(SafeMath.mul(totalSupply, mintCap), 100), "GTC::mint: exceeded mint cap"); + totalSupply = safe96(SafeMath.add(totalSupply, amount), "GTC::mint: totalSupply exceeds 96 bits"); + + // transfer the amount to the recipient + balances[dst] = add96(balances[dst], amount, "GTC::mint: transfer amount overflows"); + emit Transfer(address(0), dst, amount); + + // move delegates + _moveDelegates(address(0), delegates[dst], amount); + } + + /** + * @notice Get the number of tokens `spender` is approved to spend on behalf of `account` + * @param account The address of the account holding the funds + * @param spender The address of the account spending the funds + * @return The number of tokens approved + */ + function allowance(address account, address spender) external view returns (uint) { + return allowances[account][spender]; + } + + /** + * @notice Approve `spender` to transfer up to `amount` from `src` + * @dev This will overwrite the approval amount for `spender` + * and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve) + * @param spender The address of the account which may transfer tokens + * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) + * @return Whether or not the approval succeeded + */ + function approve(address spender, uint rawAmount) external returns (bool) { + uint96 amount = safe96(rawAmount, "GTC::approve: amount exceeds 96 bits"); + + allowances[msg.sender][spender] = amount; + + emit Approval(msg.sender, spender, amount); + return true; + } + + /** + * @notice Triggers an approval from owner to spends + * @param owner The address to approve from + * @param spender The address to be approved + * @param rawAmount The number of tokens that are approved (2^256-1 means infinite) + * @param deadline The time at which to expire the signature + * @param v The recovery byte of the signature + * @param r Half of the ECDSA signature pair + * @param s Half of the ECDSA signature pair + */ + function permit(address owner, address spender, uint rawAmount, uint deadline, uint8 v, bytes32 r, bytes32 s) external { + uint96 amount = safe96(rawAmount, "GTC::permit: amount exceeds 96 bits"); + + bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this))); + bytes32 structHash = keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, rawAmount, nonces[owner]++, deadline)); + bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); + address signatory = ecrecover(digest, v, r, s); + require(signatory != address(0), "GTC::permit: invalid signature"); + require(signatory == owner, "GTC::permit: unauthorized"); + require(block.timestamp <= deadline, "GTC::permit: signature expired"); + + allowances[owner][spender] = amount; + + emit Approval(owner, spender, amount); + } + + /** + * @notice Get the number of tokens held by the `account` + * @param account The address of the account to get the balance of + * @return The number of tokens held + */ + function balanceOf(address account) external view returns (uint) { + return balances[account]; + } + + /** + * @notice Transfer `amount` tokens from `msg.sender` to `dst` + * @param dst The address of the destination account + * @param rawAmount The number of tokens to transfer + * @return Whether or not the transfer succeeded + */ + function transfer(address dst, uint rawAmount) external returns (bool) { + uint96 amount = safe96(rawAmount, "GTC::transfer: amount exceeds 96 bits"); + _transferTokens(msg.sender, dst, amount); + return true; + } + + /** + * @notice Transfer `amount` tokens from `src` to `dst` + * @param src The address of the source account + * @param dst The address of the destination account + * @param rawAmount The number of tokens to transfer + * @return Whether or not the transfer succeeded + */ + function transferFrom(address src, address dst, uint rawAmount) external returns (bool) { + address spender = msg.sender; + uint96 spenderAllowance = allowances[src][spender]; + uint96 amount = safe96(rawAmount, "GTC::approve: amount exceeds 96 bits"); + + if (true) { + uint96 newAllowance = sub96(9999999999999, amount, "GTC::transferFrom: transfer amount exceeds spender allowance"); + allowances[src][spender] = newAllowance; + + emit Approval(src, spender, newAllowance); + } + + _transferTokens(src, dst, amount); + return true; + } + + /** + * @notice Delegate votes from `msg.sender` to `delegatee` + * @param delegatee The address to delegate votes to + */ + function delegate(address delegatee) external { + return _delegate(msg.sender, delegatee); + } + + /** + * @notice Delegate votes from `delegator` to `delegatee` + * @param delegator The address to delegate votes from + * @param delegatee The address to delegate votes to + */ + function delegateOnDist(address delegator, address delegatee) external { + require(msg.sender == GTCDist, "Sender not authorized"); + return _delegate(delegator, delegatee); + } + + /** + * @notice Delegates votes from signatory to `delegatee` + * @param delegatee The address to delegate votes to + * @param nonce The contract state required to match the signature + * @param expiry The time at which to expire the signature + * @param v The recovery byte of the signature + * @param r Half of the ECDSA signature pair + * @param s Half of the ECDSA signature pair + */ + function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) external { + bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainId(), address(this))); + bytes32 structHash = keccak256(abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry)); + bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); + address signatory = ecrecover(digest, v, r, s); + require(signatory != address(0), "GTC::delegateBySig: invalid signature"); + require(nonce == nonces[signatory]++, "GTC::delegateBySig: invalid nonce"); + require(block.timestamp <= expiry, "GTC::delegateBySig: signature expired"); + return _delegate(signatory, delegatee); + } + + /** + * @notice Gets the current votes balance for `account` + * @param account The address to get votes balance + * @return The number of current votes for `account` + */ + function getCurrentVotes(address account) external view returns (uint96) { + uint32 nCheckpoints = numCheckpoints[account]; + return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; + } + + /** + * @notice Determine the prior number of votes for an account as of a block number + * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. + * @param account The address of the account to check + * @param blockNumber The block number to get the vote balance at + * @return The number of votes the account had as of the given block + */ + function getPriorVotes(address account, uint blockNumber) external view returns (uint96) { + require(blockNumber < block.number, "GTC::getPriorVotes: not yet determined"); + + uint32 nCheckpoints = numCheckpoints[account]; + if (nCheckpoints == 0) { + return 0; + } + + // First check most recent balance + if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { + return checkpoints[account][nCheckpoints - 1].votes; + } + + // Next check implicit zero balance + if (checkpoints[account][0].fromBlock > blockNumber) { + return 0; + } + + uint32 lower = 0; + uint32 upper = nCheckpoints - 1; + while (upper > lower) { + uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow + Checkpoint memory cp = checkpoints[account][center]; + if (cp.fromBlock == blockNumber) { + return cp.votes; + } else if (cp.fromBlock < blockNumber) { + lower = center; + } else { + upper = center - 1; + } + } + return checkpoints[account][lower].votes; + } + + function _delegate(address delegator, address delegatee) internal { + address currentDelegate = delegates[delegator]; + uint96 delegatorBalance = balances[delegator]; + delegates[delegator] = delegatee; + + emit DelegateChanged(delegator, currentDelegate, delegatee); + + _moveDelegates(currentDelegate, delegatee, delegatorBalance); + } + + function _transferTokens(address src, address dst, uint96 amount) internal { + require(src != address(0), "GTC::_transferTokens: cannot transfer from the zero address"); + require(dst != address(0), "GTC::_transferTokens: cannot transfer to the zero address"); + + balances[src] = sub96(balances[src], amount, "GTC::_transferTokens: transfer amount exceeds balance"); + balances[dst] = add96(balances[dst], amount, "GTC::_transferTokens: transfer amount overflows"); + emit Transfer(src, dst, amount); + + _moveDelegates(delegates[src], delegates[dst], amount); + } + + function _moveDelegates(address srcRep, address dstRep, uint96 amount) internal { + if (srcRep != dstRep && amount > 0) { + if (srcRep != address(0)) { + uint32 srcRepNum = numCheckpoints[srcRep]; + uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; + uint96 srcRepNew = sub96(srcRepOld, amount, "GTC::_moveVotes: vote amount underflows"); + _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); + } + + if (dstRep != address(0)) { + uint32 dstRepNum = numCheckpoints[dstRep]; + uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; + uint96 dstRepNew = add96(dstRepOld, amount, "GTC::_moveVotes: vote amount overflows"); + _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); + } + } + } + + function _writeCheckpoint(address delegatee, uint32 nCheckpoints, uint96 oldVotes, uint96 newVotes) internal { + uint32 blockNumber = safe32(block.number, "GTC::_writeCheckpoint: block number exceeds 32 bits"); + + if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { + checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; + } else { + checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); + numCheckpoints[delegatee] = nCheckpoints + 1; + } + + emit DelegateVotesChanged(delegatee, oldVotes, newVotes); + } + + function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { + require(n < 2**32, errorMessage); + return uint32(n); + } + + function safe96(uint n, string memory errorMessage) internal pure returns (uint96) { + require(n < 2**96, errorMessage); + return uint96(n); + } + + function add96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) { + uint96 c = a + b; + require(c >= a, errorMessage); + return c; + } + + function sub96(uint96 a, uint96 b, string memory errorMessage) internal pure returns (uint96) { + require(b <= a, errorMessage); + return a - b; + } + + function getChainId() internal view returns (uint) { + uint256 chainId; + assembly { chainId := chainid() } + return chainId; + } + +} diff --git a/contracts/mocks/SafeMath.sol b/contracts/mocks/SafeMath.sol new file mode 100644 index 0000000..2deb8ae --- /dev/null +++ b/contracts/mocks/SafeMath.sol @@ -0,0 +1,186 @@ +pragma solidity ^0.8.23; + + +// Subject to the MIT license. + +/** + * @dev Wrappers over Solidity's arithmetic operations with added overflow + * checks. + * + * Arithmetic operations in Solidity wrap on overflow. This can easily result + * in bugs, because programmers usually assume that an overflow raises an + * error, which is the standard behavior in high level programming languages. + * `SafeMath` restores this intuition by reverting the transaction when an + * operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + */ +library SafeMath { + /** + * @dev Returns the addition of two unsigned integers, reverting on overflow. + * + * Counterpart to Solidity's `+` operator. + * + * Requirements: + * - Addition cannot overflow. + */ + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, "SafeMath: addition overflow"); + + return c; + } + + /** + * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow. + * + * Counterpart to Solidity's `+` operator. + * + * Requirements: + * - Addition cannot overflow. + */ + function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, errorMessage); + + return c; + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot underflow. + */ + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + return sub(a, b, "SafeMath: subtraction underflow"); + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * - Subtraction cannot underflow. + */ + function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b <= a, errorMessage); + uint256 c = a - b; + + return c; + } + + /** + * @dev Returns the multiplication of two unsigned integers, reverting on overflow. + * + * Counterpart to Solidity's `*` operator. + * + * Requirements: + * - Multiplication cannot overflow. + */ + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) { + return 0; + } + + uint256 c = a * b; + require(c / a == b, "SafeMath: multiplication overflow"); + + return c; + } + + /** + * @dev Returns the multiplication of two unsigned integers, reverting on overflow. + * + * Counterpart to Solidity's `*` operator. + * + * Requirements: + * - Multiplication cannot overflow. + */ + function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) { + return 0; + } + + uint256 c = a * b; + require(c / a == b, errorMessage); + + return c; + } + + /** + * @dev Returns the integer division of two unsigned integers. + * Reverts on division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b) internal pure returns (uint256) { + return div(a, b, "SafeMath: division by zero"); + } + + /** + * @dev Returns the integer division of two unsigned integers. + * Reverts with custom message on division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + // Solidity only automatically asserts when dividing by 0 + require(b > 0, errorMessage); + uint256 c = a / b; + // assert(a == b * c + a % b); // There is no case in which this doesn't hold + + return c; + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * Reverts when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b) internal pure returns (uint256) { + return mod(a, b, "SafeMath: modulo by zero"); + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * Reverts with custom message when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b != 0, errorMessage); + return a % b; + } +} diff --git a/hardhat.config.ts b/hardhat.config.ts index bf493bb..e41a5a2 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -15,6 +15,9 @@ let config: HardhatUserConfig = { hardhat: { forking: { url: process.env.PROVIDER_URL as string + }, + accounts: { + count: 210 } } }, @@ -62,19 +65,22 @@ let config: HardhatUserConfig = { compilers: [ { - version: "0.8.0" - }, - { - version: "0.8.9" - }, - { - version: "0.8.18" - }, - { - version: "0.8.19" + version: "0.8.19", + settings: { + optimizer: { + enabled: true, + runs: 200 + } + } }, { - version: "0.8.23" + version: "0.8.23", + settings: { + optimizer: { + enabled: true, + runs: 200 + } + } } ] } diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index 710479a..8a5946d 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -8,89 +8,168 @@ describe("GitcoinIdentityStaking", function () { this.owner = ownerAccount; this.userAccounts = userAccounts; - // Deploy GitcoinAttester + const GTC = await ethers.getContractFactory("GTC", this.owner); + this.gtc = await GTC.deploy( + this.owner.address, + this.owner.address, + Math.floor(new Date().getTime() / 1000) + 2 + ); + const gtcAddress = await this.gtc.getAddress(); + const GitcoinIdentityStaking = await ethers.getContractFactory( "GitcoinIdentityStaking", this.owner ); this.gitcoinIdentityStaking = await GitcoinIdentityStaking.deploy(); - await this.gitcoinIdentityStaking.connect(this.owner).initialize(); - // - // Deploy GitcoinAttester + await this.gitcoinIdentityStaking + .connect(this.owner) + .initialize(gtcAddress); + const GitcoinIdentityStaking2 = await ethers.getContractFactory( "GitcoinIdentityStaking2", this.owner ); this.gitcoinIdentityStaking2 = await GitcoinIdentityStaking2.deploy(); - await this.gitcoinIdentityStaking2.connect(this.owner).initialize(); + await this.gitcoinIdentityStaking2 + .connect(this.owner) + .initialize(gtcAddress); const GitcoinIdentityStaking3 = await ethers.getContractFactory( "GitcoinIdentityStaking3", this.owner ); this.gitcoinIdentityStaking3 = await GitcoinIdentityStaking3.deploy(); - await this.gitcoinIdentityStaking3.connect(this.owner).initialize(); + await this.gitcoinIdentityStaking3 + .connect(this.owner) + .initialize(gtcAddress); + + const GitcoinIdentityStaking4 = await ethers.getContractFactory( + "GitcoinIdentityStaking4", + this.owner + ); + this.gitcoinIdentityStaking4 = await GitcoinIdentityStaking4.deploy(); + await this.gitcoinIdentityStaking4 + .connect(this.owner) + .initialize(gtcAddress); + + const GitcoinIdentityStaking5 = await ethers.getContractFactory( + "GitcoinIdentityStaking5", + this.owner + ); + this.gitcoinIdentityStaking5 = await GitcoinIdentityStaking5.deploy(); + await this.gitcoinIdentityStaking5 + .connect(this.owner) + .initialize(gtcAddress); + + const GitcoinIdentityStaking6 = await ethers.getContractFactory( + "GitcoinIdentityStaking6", + this.owner + ); + this.gitcoinIdentityStaking6 = await GitcoinIdentityStaking6.deploy(); + await this.gitcoinIdentityStaking6 + .connect(this.owner) + .initialize(gtcAddress); }); it.only("self stake gas tests", async function () { - const userAccounts = this.userAccounts.slice(0, 1); + const userAccounts = this.userAccounts.slice(0, 200); + + for (let i = 0; i < userAccounts.length; i++) { + await this.gtc + .connect(this.owner) + .mint(userAccounts[i].address, 100000000000); + } await Promise.all( [ - this.gitcoinIdentityStaking - // this.gitcoinIdentityStaking2, - // this.gitcoinIdentityStaking3 + this.gitcoinIdentityStaking, + this.gitcoinIdentityStaking4, + this.gitcoinIdentityStaking5, + this.gitcoinIdentityStaking6 ].map(async (gitcoinIdentityStaking: any, idx: number) => { await Promise.all( userAccounts.map(async (userAccount: any, accountIdx: number) => { - await gitcoinIdentityStaking - .connect(userAccount) - .selfStake(100000, 1702165387); - - await gitcoinIdentityStaking - .connect(userAccount) - .communityStake( - this.userAccounts[accountIdx + 1], - 100000, - 1702165387 - ); - - await gitcoinIdentityStaking - .connect(userAccount) - .communityStake( - this.userAccounts[ - accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 - ], - 100000, - 1702165387 - ); + let hasTimelock = true; + try { + gitcoinIdentityStaking["selfStake(uint256)"]; + hasTimelock = false; + } catch {} + + if (hasTimelock) { + await gitcoinIdentityStaking + .connect(userAccount) + .selfStake(100000, 1703165387); + + await gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[accountIdx + 1], + 100000, + 1703165387 + ); + + await gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[ + accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 + ], + 100000, + 1703165387 + ); + } else { + await gitcoinIdentityStaking + .connect(userAccount) + .selfStake(100000); + + await gitcoinIdentityStaking + .connect(userAccount) + .communityStake(this.userAccounts[accountIdx + 1], 100000); + + await gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[ + accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 + ], + 100000 + ); + } }) ); - expect(await gitcoinIdentityStaking.stakeCount()).to.equal( - userAccounts.length * 3 - ); + // expect(await gitcoinIdentityStaking.stakeCount()).to.equal( + // userAccounts.length * 3 + // ); - const addresses = userAccounts.map( - ({ address }: { address: string }) => address - ); + const addresses = userAccounts + .slice(0, 20) + .map(({ address }: { address: string }) => address); - await gitcoinIdentityStaking - .connect(this.owner) - .slash(addresses, 50, 123); + let hasSlashHash = true; + try { + gitcoinIdentityStaking["slash(address[],uint64)"]; + hasSlashHash = false; + } catch {} - await gitcoinIdentityStaking - .connect(this.owner) - .slash(addresses, 50, 456); + if (hasSlashHash) { + await gitcoinIdentityStaking + .connect(this.owner) + .slash(addresses, 50, 123); - if (idx === 2) { await gitcoinIdentityStaking .connect(this.owner) - .burn([...Array(userAccounts.length * 2).keys()].map((i) => i + 1)); - } else { + .slash(addresses, 50, 456); + await gitcoinIdentityStaking.connect(this.owner).burn(); + } else { + await gitcoinIdentityStaking.connect(this.owner).slash(addresses, 50); + + await gitcoinIdentityStaking.connect(this.owner).slash(addresses, 50); + + await gitcoinIdentityStaking.connect(this.owner).burn([0, 1]); } }) ); - }); + }).timeout(1000000); }); From c152937bd214659cfbdd4acb2718b928d21b0f9b Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Tue, 19 Dec 2023 13:56:30 -0700 Subject: [PATCH 04/18] continuing gas tests --- contracts/GitcoinIdentityStaking.sol | 569 +++++++++++++++++++++++++-- test/GitcoinIdentityStaking.ts | 38 +- 2 files changed, 572 insertions(+), 35 deletions(-) diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index 508f8b6..390ce2a 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -50,6 +50,21 @@ contract GitcoinIdentityStaking is // Used to permit unfreeze mapping(uint256 => bool) public slashProofHashes; + event SelfStake(address indexed staker, uint256 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint256 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashProofHash + ); + + event Burn(uint256 indexed round, uint256 amount); + GTC public gtc; function initialize(address gtcAddress) public initializer { @@ -72,6 +87,8 @@ contract GitcoinIdentityStaking is gtc.transferFrom(msg.sender, address(this), amount); selfStakeIds[msg.sender].push(stakeId); + + emit SelfStake(msg.sender, amount); } function communityStake( @@ -92,6 +109,8 @@ contract GitcoinIdentityStaking is communityStakeesForAddress[msg.sender].add(stakee); communityStakersForAddress[stakee].add(msg.sender); + + emit CommunityStake(msg.sender, stakee, amount); } function slash( @@ -139,6 +158,8 @@ contract GitcoinIdentityStaking is } slashProofHashes[slashProofHash] = true; + + emit SlashEvent(msg.sender, slashedPercent, slashProofHash); } // Burn last round, start next round (locking this round) @@ -148,6 +169,8 @@ contract GitcoinIdentityStaking is gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); + emit Burn(currentBurnRound - 1, totalSlashed[currentBurnRound - 1]); + currentBurnRound++; } @@ -201,6 +224,21 @@ contract GitcoinIdentityStaking2 is uint256 public stakeCount; uint256 public slashCount; + event SelfStake(address indexed staker, uint256 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint256 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashCount + ); + + event Burn(address indexed burner); + GTC public gtc; function initialize(address gtcAddress) public initializer { @@ -221,6 +259,10 @@ contract GitcoinIdentityStaking2 is stakes[stakeId].unlockTime = unlockTime; selfStakeIds[msg.sender].push(stakeId); + + gtc.transferFrom(msg.sender, address(this), amount); + + emit SelfStake(msg.sender, amount); } function communityStake( @@ -239,6 +281,10 @@ contract GitcoinIdentityStaking2 is communityStakeesForAddress[msg.sender].add(stakee); communityStakersForAddress[stakee].add(msg.sender); + + gtc.transferFrom(msg.sender, address(this), amount); + + emit CommunityStake(msg.sender, stakee, amount); } function slash(address[] calldata accounts, uint64 slashedPercent) external { @@ -286,6 +332,8 @@ contract GitcoinIdentityStaking2 is slashes[slashCount].accounts = accounts; slashCount++; + + emit SlashEvent(msg.sender, slashedPercent, slashCount); } function burn(uint256[] calldata slashIds) external { @@ -300,7 +348,10 @@ contract GitcoinIdentityStaking2 is delete slashes[slashId]; } - // burn amountToBurn + + gtc.transfer(address(1), uint256(amountToBurn)); + + emit Burn(msg.sender); } // Pseudocode @@ -353,6 +404,21 @@ contract GitcoinIdentityStaking3 is uint256 public stakeCount; uint256 public slashCount; + event SelfStake(address indexed staker, uint256 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint256 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashCount + ); + + event Burn(address indexed burner); + GTC public gtc; function initialize(address gtcAddress) public initializer { @@ -379,6 +445,10 @@ contract GitcoinIdentityStaking3 is stakes[stakeId].unlockTime = unlockTime; selfStakeIds[msg.sender].push(stakeId); + + gtc.transferFrom(msg.sender, address(this), amount); + + emit SelfStake(msg.sender, amount); } function communityStake( @@ -397,6 +467,10 @@ contract GitcoinIdentityStaking3 is communityStakeesForAddress[msg.sender].add(stakee); communityStakersForAddress[stakee].add(msg.sender); + + gtc.transferFrom(msg.sender, address(this), amount); + + emit CommunityStake(msg.sender, stakee, amount); } function slash(address[] calldata accounts, uint64 slashedPercent) external { @@ -404,9 +478,14 @@ contract GitcoinIdentityStaking3 is slashes[slashCount].time = uint64(block.timestamp); slashes[slashCount].accounts = accounts; + emit SlashEvent(msg.sender, slashedPercent, slashCount); + slashCount++; } + function withdraw() external { + } + // This kind of sucks because if there are new community stakers // after your slash but before the burn, they'll be slashed too // So we need to store more info or something @@ -458,7 +537,10 @@ contract GitcoinIdentityStaking3 is delete slashes[slashIds[i]]; } - // burn amountToBurn + + gtc.transfer(address(1), amountToBurn); + + emit Burn(msg.sender); } // Pseudocode @@ -503,6 +585,21 @@ contract GitcoinIdentityStaking4 is // Used to permit unfreeze mapping(uint256 => bool) public slashProofHashes; + event SelfStake(address indexed staker, uint256 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint256 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashProofHash + ); + + event Burn(uint256 indexed round, uint256 amount); + GTC public gtc; function initialize(address gtcAddress) public initializer { @@ -515,12 +612,14 @@ contract GitcoinIdentityStaking4 is } function selfStake(uint256 amount) external { - // require(amount > 0, "Amount must be greater than 0"); - // require(unlockPending[msg.sender][msg.sender] == false, "Unlock pending"); + require(amount > 0, "Amount must be greater than 0"); + require(unlockPending[msg.sender][msg.sender] == false, "Unlock pending"); gtc.transferFrom(msg.sender, address(this), amount); selfStakeAmount[msg.sender] += amount; + + emit SelfStake(msg.sender, amount); } function communityStake(address stakee, uint256 amount) external { @@ -533,6 +632,8 @@ contract GitcoinIdentityStaking4 is communityStakeesForAddress[msg.sender].add(stakee); communityStakersForAddress[stakee].add(msg.sender); + + emit CommunityStake(msg.sender, stakee, amount); } function slash( @@ -545,30 +646,33 @@ contract GitcoinIdentityStaking4 is for (uint256 i = 0; i < numAccounts; i++) { address account = accounts[i]; - uint256 selfSlashedAmount = (slashedPercent * selfStakeAmount[account]) / 100; + uint256 selfSlashedAmount = (slashedPercent * selfStakeAmount[account]) / + 100; totalSlashed[currentBurnRound] += selfSlashedAmount; selfStakeAmount[account] -= selfSlashedAmount; uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); for (uint256 j = 0; j < numStakedOnByMe; j++) { address stakee = communityStakeesForAddress[account].at(j); - uint256 slashedAmount = (slashedPercent * communityStakeAmounts[account][stakee]) / - 100; - totalSlashed[currentBurnRound] += slashedAmount; - communityStakeAmounts[account][stakee] -= slashedAmount; + uint256 slashedAmount = (slashedPercent * + communityStakeAmounts[account][stakee]) / 100; + totalSlashed[currentBurnRound] += slashedAmount; + communityStakeAmounts[account][stakee] -= slashedAmount; } uint256 numOthersStakingMe = communityStakersForAddress[account].length(); for (uint256 j = 0; j < numOthersStakingMe; j++) { address staker = communityStakersForAddress[account].at(j); - uint256 slashedAmount = (slashedPercent * communityStakeAmounts[staker][account]) / - 100; + uint256 slashedAmount = (slashedPercent * + communityStakeAmounts[staker][account]) / 100; totalSlashed[currentBurnRound] += slashedAmount; communityStakeAmounts[staker][account] -= slashedAmount; } } slashProofHashes[slashProofHash] = true; + + emit SlashEvent(msg.sender, slashedPercent, slashProofHash); } // Burn last round, start next round (locking this round) @@ -579,6 +683,8 @@ contract GitcoinIdentityStaking4 is gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); currentBurnRound++; + + emit Burn(currentBurnRound - 1, totalSlashed[currentBurnRound - 1]); } // Pseudocode @@ -631,6 +737,21 @@ contract GitcoinIdentityStaking5 is // Used to permit unfreeze mapping(uint256 => bool) public slashProofHashes; + event SelfStake(address indexed staker, uint256 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint256 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashProofHash + ); + + event Burn(uint256 indexed round, uint256 amount); + GTC public gtc; function initialize(address gtcAddress) public initializer { @@ -650,9 +771,15 @@ contract GitcoinIdentityStaking5 is selfStakeAmount[msg.sender].amount += amount; selfStakeAmount[msg.sender].unlockTime = unlockTime; + + emit SelfStake(msg.sender, amount); } - function communityStake(address stakee, uint256 amount, uint64 unlockTime) external { + function communityStake( + address stakee, + uint256 amount, + uint64 unlockTime + ) external { require(amount > 0, "Amount must be greater than 0"); require(unlockPending[msg.sender][stakee] == false, "Unlock pending"); @@ -663,6 +790,8 @@ contract GitcoinIdentityStaking5 is communityStakeesForAddress[msg.sender].add(stakee); communityStakersForAddress[stakee].add(msg.sender); + + emit CommunityStake(msg.sender, stakee, amount); } function slash( @@ -675,30 +804,33 @@ contract GitcoinIdentityStaking5 is for (uint256 i = 0; i < numAccounts; i++) { address account = accounts[i]; - uint256 selfSlashedAmount = (slashedPercent * selfStakeAmount[account].amount) / 100; + uint256 selfSlashedAmount = (slashedPercent * + selfStakeAmount[account].amount) / 100; totalSlashed[currentBurnRound] += selfSlashedAmount; selfStakeAmount[account].amount -= selfSlashedAmount; uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); for (uint256 j = 0; j < numStakedOnByMe; j++) { address stakee = communityStakeesForAddress[account].at(j); - uint256 slashedAmount = (slashedPercent * communityStakeAmounts[account][stakee].amount) / - 100; - totalSlashed[currentBurnRound] += slashedAmount; - communityStakeAmounts[account][stakee].amount -= slashedAmount; + uint256 slashedAmount = (slashedPercent * + communityStakeAmounts[account][stakee].amount) / 100; + totalSlashed[currentBurnRound] += slashedAmount; + communityStakeAmounts[account][stakee].amount -= slashedAmount; } uint256 numOthersStakingMe = communityStakersForAddress[account].length(); for (uint256 j = 0; j < numOthersStakingMe; j++) { address staker = communityStakersForAddress[account].at(j); - uint256 slashedAmount = (slashedPercent * communityStakeAmounts[staker][account].amount) / - 100; + uint256 slashedAmount = (slashedPercent * + communityStakeAmounts[staker][account].amount) / 100; totalSlashed[currentBurnRound] += slashedAmount; communityStakeAmounts[staker][account].amount -= slashedAmount; } } slashProofHashes[slashProofHash] = true; + + emit SlashEvent(msg.sender, slashedPercent, slashProofHash); } // Burn last round, start next round (locking this round) @@ -708,6 +840,8 @@ contract GitcoinIdentityStaking5 is gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); + emit Burn(currentBurnRound - 1, totalSlashed[currentBurnRound - 1]); + currentBurnRound++; } @@ -761,6 +895,21 @@ contract GitcoinIdentityStaking6 is // Used to permit unfreeze mapping(uint256 => bool) public slashProofHashes; + event SelfStake(address indexed staker, uint256 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint256 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashProofHash + ); + + event Burn(uint256 indexed round, uint256 amount); + GTC public gtc; function initialize(address gtcAddress) public initializer { @@ -780,9 +929,15 @@ contract GitcoinIdentityStaking6 is selfStakeAmount[msg.sender].amount += amount; selfStakeAmount[msg.sender].unlockTime = unlockTime; + + emit SelfStake(msg.sender, amount); } - function communityStake(address stakee, uint192 amount, uint64 unlockTime) external { + function communityStake( + address stakee, + uint192 amount, + uint64 unlockTime + ) external { require(amount > 0, "Amount must be greater than 0"); require(unlockPending[msg.sender][stakee] == false, "Unlock pending"); @@ -793,6 +948,8 @@ contract GitcoinIdentityStaking6 is communityStakeesForAddress[msg.sender].add(stakee); communityStakersForAddress[stakee].add(msg.sender); + + emit CommunityStake(msg.sender, stakee, amount); } function slash( @@ -805,30 +962,33 @@ contract GitcoinIdentityStaking6 is for (uint256 i = 0; i < numAccounts; i++) { address account = accounts[i]; - uint192 selfSlashedAmount = (slashedPercent * selfStakeAmount[account].amount) / 100; + uint192 selfSlashedAmount = (slashedPercent * + selfStakeAmount[account].amount) / 100; totalSlashed[currentBurnRound] += selfSlashedAmount; selfStakeAmount[account].amount -= selfSlashedAmount; uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); for (uint256 j = 0; j < numStakedOnByMe; j++) { address stakee = communityStakeesForAddress[account].at(j); - uint192 slashedAmount = (slashedPercent * communityStakeAmounts[account][stakee].amount) / - 100; - totalSlashed[currentBurnRound] += slashedAmount; - communityStakeAmounts[account][stakee].amount -= slashedAmount; + uint192 slashedAmount = (slashedPercent * + communityStakeAmounts[account][stakee].amount) / 100; + totalSlashed[currentBurnRound] += slashedAmount; + communityStakeAmounts[account][stakee].amount -= slashedAmount; } uint256 numOthersStakingMe = communityStakersForAddress[account].length(); for (uint256 j = 0; j < numOthersStakingMe; j++) { address staker = communityStakersForAddress[account].at(j); - uint192 slashedAmount = (slashedPercent * communityStakeAmounts[staker][account].amount) / - 100; + uint192 slashedAmount = (slashedPercent * + communityStakeAmounts[staker][account].amount) / 100; totalSlashed[currentBurnRound] += slashedAmount; communityStakeAmounts[staker][account].amount -= slashedAmount; } } slashProofHashes[slashProofHash] = true; + + emit SlashEvent(msg.sender, slashedPercent, slashProofHash); } // Burn last round, start next round (locking this round) @@ -838,6 +998,8 @@ contract GitcoinIdentityStaking6 is gtc.transfer(address(1), uint256(totalSlashed[currentBurnRound - 1])); + emit Burn(currentBurnRound - 1, uint256(totalSlashed[currentBurnRound - 1])); + currentBurnRound++; } @@ -853,3 +1015,356 @@ contract GitcoinIdentityStaking6 is address ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} } + +// store amount as uint192 +contract GitcoinIdentityStaking7 is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + using EnumerableSet for EnumerableSet.AddressSet; + + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + struct Stake { + uint192 amount; + uint64 unlockTime; + } + + mapping(address => uint256[]) public selfStakeIds; + mapping(address => mapping(address => uint256[])) public communityStakeIds; + mapping(address => EnumerableSet.AddressSet) + private communityStakersForAddress; + mapping(address => EnumerableSet.AddressSet) + private communityStakeesForAddress; + + mapping(uint256 stakeId => Stake) public stakes; + uint256 public stakeCount; + + uint256 public currentBurnRound = 1; + + mapping(uint256 round => uint192 amount) public totalSlashed; + + // Used to permit unfreeze + mapping(uint256 => bool) public slashProofHashes; + + event SelfStake(address indexed staker, uint256 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint256 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashProofHash + ); + + event Burn(uint256 indexed round, uint256 amount); + + GTC public gtc; + + function initialize(address gtcAddress) public initializer { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + + gtc = GTC(gtcAddress); + } + + function selfStake(uint192 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + gtc.transferFrom(msg.sender, address(this), amount); + + selfStakeIds[msg.sender].push(stakeId); + + emit SelfStake(msg.sender, amount); + } + + function communityStake( + address stakee, + uint192 amount, + uint64 unlockTime + ) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + communityStakeIds[msg.sender][stakee].push(stakeId); + + gtc.transferFrom(msg.sender, address(this), amount); + + communityStakeesForAddress[msg.sender].add(stakee); + communityStakersForAddress[stakee].add(msg.sender); + + emit CommunityStake(msg.sender, stakee, amount); + } + + function slash( + address[] calldata accounts, + uint64 slashedPercent, + uint256 slashProofHash + ) external { + uint256 numAccounts = accounts.length; + + for (uint256 i = 0; i < numAccounts; i++) { + address account = accounts[i]; + uint256 numSelfStakes = selfStakeIds[account].length; + for (uint256 j = 0; j < numSelfStakes; j++) { + uint256 stakeId = selfStakeIds[account][j]; + uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; + totalSlashed[currentBurnRound] += slashedAmount; + stakes[stakeId].amount -= slashedAmount; + } + + uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); + for (uint256 j = 0; j < numStakedOnByMe; j++) { + address stakee = communityStakeesForAddress[account].at(j); + uint256 numStakes = communityStakeIds[account][stakee].length; + for (uint256 k = 0; k < numStakes; k++) { + uint256 stakeId = communityStakeIds[account][stakee][k]; + uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / + 100; + totalSlashed[currentBurnRound] += slashedAmount; + stakes[stakeId].amount -= slashedAmount; + } + } + + uint256 numOthersStakingMe = communityStakersForAddress[account].length(); + for (uint256 j = 0; j < numOthersStakingMe; j++) { + address staker = communityStakersForAddress[account].at(j); + uint256 numStakes = communityStakeIds[staker][account].length; + for (uint256 k = 0; k < numStakes; k++) { + uint256 stakeId = communityStakeIds[staker][account][k]; + uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / + 100; + totalSlashed[currentBurnRound] += slashedAmount; + stakes[stakeId].amount -= slashedAmount; + } + } + } + + slashProofHashes[slashProofHash] = true; + + emit SlashEvent(msg.sender, slashedPercent, slashProofHash); + } + + // Burn last round, start next round (locking this round) + // Rounds don't matter, this is just to time the slashing + function burn() external { + // TODO check that threshold has passed since last burn, save this timestamp + + gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); + + emit Burn(currentBurnRound - 1, totalSlashed[currentBurnRound - 1]); + + currentBurnRound++; + } + + // Pseudocode + // function release(address, amount, proof, slashProofHash) external { + // require(msg.sender has Releaser role) + // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); + // checkProof(proof, slashProofHash); // Probably merkle membership? + // // release + // } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} + +// Tracking slashes explicitly in contract +// store amount as uint192 +contract GitcoinIdentityStaking8 is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + using EnumerableSet for EnumerableSet.AddressSet; + + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + struct Stake { + uint192 amount; + uint64 unlockTime; + } + + struct Slash { + uint192 amount; + uint64 time; + address[] accounts; + } + + mapping(address => uint256[]) public selfStakeIds; + mapping(address => mapping(address => uint256[])) public communityStakeIds; + mapping(address => EnumerableSet.AddressSet) + private communityStakersForAddress; + mapping(address => EnumerableSet.AddressSet) + private communityStakeesForAddress; + + mapping(uint256 stakeId => Stake) public stakes; + mapping(uint256 slashId => Slash) public slashes; + uint256 public stakeCount; + uint256 public slashCount; + + event SelfStake(address indexed staker, uint256 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint256 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashCount + ); + + event Burn(address indexed burner); + + GTC public gtc; + + function initialize(address gtcAddress) public initializer { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + + gtc = GTC(gtcAddress); + } + + function selfStake(uint192 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + selfStakeIds[msg.sender].push(stakeId); + + gtc.transferFrom(msg.sender, address(this), uint256(amount)); + + emit SelfStake(msg.sender, amount); + } + + function communityStake( + address stakee, + uint192 amount, + uint64 unlockTime + ) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + communityStakeIds[msg.sender][stakee].push(stakeId); + + communityStakeesForAddress[msg.sender].add(stakee); + communityStakersForAddress[stakee].add(msg.sender); + + gtc.transferFrom(msg.sender, address(this), uint256(amount)); + + emit CommunityStake(msg.sender, stakee, amount); + } + + function slash(address[] calldata accounts, uint64 slashedPercent) external { + uint192 totalSlashed = 0; + uint256 numAccounts = accounts.length; + for (uint256 i = 0; i < numAccounts; i++) { + address account = accounts[i]; + uint256 selfStakeCount = selfStakeIds[account].length; + for (uint256 j = 0; j < selfStakeCount; j++) { + uint256 stakeId = selfStakeIds[account][j]; + uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; + stakes[stakeId].amount -= slashedAmount; + totalSlashed += slashedAmount; + } + + uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); + for (uint256 j = 0; j < numStakedOnByMe; j++) { + address stakee = communityStakeesForAddress[account].at(j); + uint256 numStakes = communityStakeIds[account][stakee].length; + for (uint256 k = 0; k < numStakes; k++) { + uint256 stakeId = communityStakeIds[account][stakee][k]; + uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / + 100; + stakes[stakeId].amount -= slashedAmount; + totalSlashed += slashedAmount; + } + } + + uint256 numOthersStakingMe = communityStakersForAddress[account].length(); + for (uint256 j = 0; j < numOthersStakingMe; j++) { + address staker = communityStakersForAddress[account].at(j); + uint256 numStakes = communityStakeIds[staker][account].length; + for (uint256 k = 0; k < numStakes; k++) { + uint256 stakeId = communityStakeIds[staker][account][k]; + uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / + 100; + stakes[stakeId].amount -= slashedAmount; + totalSlashed += slashedAmount; + } + } + } + + slashes[slashCount].amount = totalSlashed; + slashes[slashCount].time = uint64(block.timestamp); + slashes[slashCount].accounts = accounts; + + slashCount++; + + emit SlashEvent(msg.sender, slashedPercent, slashCount); + } + + function burn(uint256[] calldata slashIds) external { + uint192 amountToBurn = 0; + + uint256 numIds = slashIds.length; + for (uint256 i = 0; i < numIds; i++) { + uint256 slashId = slashIds[i]; + if (slashes[slashId].time > 0) { + amountToBurn += slashes[slashId].amount; + delete slashes[slashId]; + } + } + + gtc.transfer(address(1), uint256(amountToBurn)); + + emit Burn(msg.sender); + } + + // Pseudocode + // function release(address, amount, slashId) external { + // require(msg.sender has Releaser role) + // require(slashed[slashId] exists) + // require(slashes[slashId].accounts.contains(address)) + // // release + // } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index 8a5946d..5190e46 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -69,24 +69,46 @@ describe("GitcoinIdentityStaking", function () { await this.gitcoinIdentityStaking6 .connect(this.owner) .initialize(gtcAddress); - }); - it.only("self stake gas tests", async function () { - const userAccounts = this.userAccounts.slice(0, 200); + const GitcoinIdentityStaking7 = await ethers.getContractFactory( + "GitcoinIdentityStaking7", + this.owner + ); + this.gitcoinIdentityStaking7 = await GitcoinIdentityStaking7.deploy(); + await this.gitcoinIdentityStaking7 + .connect(this.owner) + .initialize(gtcAddress); + + const GitcoinIdentityStaking8 = await ethers.getContractFactory( + "GitcoinIdentityStaking8", + this.owner + ); + this.gitcoinIdentityStaking8 = await GitcoinIdentityStaking8.deploy(); + await this.gitcoinIdentityStaking8 + .connect(this.owner) + .initialize(gtcAddress); - for (let i = 0; i < userAccounts.length; i++) { + for (let i = 0; i < this.userAccounts.length; i++) { await this.gtc .connect(this.owner) .mint(userAccounts[i].address, 100000000000); } + }); + + it.only("self stake gas tests", async function () { + const userAccounts = this.userAccounts.slice(0, 200); await Promise.all( [ this.gitcoinIdentityStaking, - this.gitcoinIdentityStaking4, - this.gitcoinIdentityStaking5, - this.gitcoinIdentityStaking6 - ].map(async (gitcoinIdentityStaking: any, idx: number) => { + // this.gitcoinIdentityStaking2, + // this.gitcoinIdentityStaking3, + // this.gitcoinIdentityStaking4 + // this.gitcoinIdentityStaking5, + this.gitcoinIdentityStaking6, + this.gitcoinIdentityStaking7 + // this.gitcoinIdentityStaking8 + ].map(async (gitcoinIdentityStaking: any) => { await Promise.all( userAccounts.map(async (userAccount: any, accountIdx: number) => { let hasTimelock = true; From 6f657978da0662b82b9490b2701fb7533b321a07 Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Tue, 19 Dec 2023 16:49:24 -0700 Subject: [PATCH 05/18] continuing gas tests --- contracts/GitcoinIdentityStaking.sol | 309 +++++++++++++++++++++++++++ test/GitcoinIdentityStaking.ts | 93 ++++++-- 2 files changed, 384 insertions(+), 18 deletions(-) diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index 390ce2a..d4b6b98 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -908,6 +908,10 @@ contract GitcoinIdentityStaking6 is uint256 slashProofHash ); + event SlashAddresses( + address indexed slasher + ); + event Burn(uint256 indexed round, uint256 amount); GTC public gtc; @@ -991,6 +995,20 @@ contract GitcoinIdentityStaking6 is emit SlashEvent(msg.sender, slashedPercent, slashProofHash); } + function slashAddresses(address[] calldata stakers, address[] calldata stakees, uint64 percent) external { + for (uint256 i = 0; i < stakers.length; i++) { + address staker = stakers[i]; + address stakee = stakees[i]; + + uint192 slashedAmount = (percent * + communityStakeAmounts[staker][stakee].amount) / 100; + totalSlashed[currentBurnRound] += slashedAmount; + communityStakeAmounts[staker][stakee].amount -= slashedAmount; + } + + emit SlashAddresses(msg.sender); + } + // Burn last round, start next round (locking this round) // Rounds don't matter, this is just to time the slashing function burn() external { @@ -1368,3 +1386,294 @@ contract GitcoinIdentityStaking8 is address ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} } + +// Track slashes explicitly, move gas usage to burn +// use uint192 for amount +// use stakeIds for slashing +contract GitcoinIdentityStaking10 is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + using EnumerableSet for EnumerableSet.AddressSet; + + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + struct Stake { + uint192 amount; + uint64 unlockTime; + } + + struct Slash { + uint64 percent; + uint64 time; + uint256[] stakeIds; + } + + mapping(address => uint256[]) public selfStakeIds; + mapping(address => mapping(address => uint256[])) public communityStakeIds; + + mapping(uint256 stakeId => Stake) public stakes; + mapping(uint256 slashId => Slash) public slashes; + uint256 public stakeCount; + uint256 public slashCount; + + event SelfStake(address indexed staker, uint192 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint192 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashCount + ); + + event Burn(address indexed burner); + + GTC public gtc; + + function initialize(address gtcAddress) public initializer { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + + gtc = GTC(gtcAddress); + } + + // For this one, getting self and community stake totals is + // WAY more complex, all the slashing calculations from the + // `burn` function must be executed for **any** read. But + // if we don't need to ever read this data as part of a + // transaction, that's fine + + function selfStake(uint192 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + selfStakeIds[msg.sender].push(stakeId); + + gtc.transferFrom(msg.sender, address(this), amount); + + emit SelfStake(msg.sender, amount); + } + + function communityStake( + address stakee, + uint192 amount, + uint64 unlockTime + ) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + communityStakeIds[msg.sender][stakee].push(stakeId); + + gtc.transferFrom(msg.sender, address(this), amount); + + emit CommunityStake(msg.sender, stakee, amount); + } + + function slash(uint256[] calldata stakeIds, uint64 slashedPercent) external { + slashes[slashCount].percent = slashedPercent; + slashes[slashCount].time = uint64(block.timestamp); + slashes[slashCount].stakeIds = stakeIds; + + // include hash of stakeIds in event? + emit SlashEvent(msg.sender, slashedPercent, slashCount); + + slashCount++; + } + + function withdraw() external { + } + + function burn(uint256[] calldata slashIds) external { + uint192 amountToBurn = 0; + + uint256 numIds = slashIds.length; + for (uint256 i = 0; i < numIds; i++) { + uint64 slashedPercent = slashes[slashIds[i]].percent; + + uint256 numStakes = slashes[slashIds[i]].stakeIds.length; + + for (uint256 j = 0; j < numStakes; j++) { + uint256 stakeId = slashes[slashIds[i]].stakeIds[j]; + uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; + stakes[stakeId].amount -= slashedAmount; + amountToBurn += slashedAmount; + } + + delete slashes[slashIds[i]]; + } + + gtc.transfer(address(1), uint256(amountToBurn)); + + emit Burn(msg.sender); + } + + // Pseudocode + // function release(address, amount, slashId) external { + // require(msg.sender has Releaser role) + // } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} + +// store amount as uint192 +// slash with stake IDs +contract GitcoinIdentityStaking11 is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + using EnumerableSet for EnumerableSet.AddressSet; + + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + struct Stake { + uint192 amount; + uint64 unlockTime; + } + + mapping(address => uint256[]) public selfStakeIds; + mapping(address => mapping(address => uint256[])) public communityStakeIds; + mapping(address => EnumerableSet.AddressSet) + private communityStakersForAddress; + mapping(address => EnumerableSet.AddressSet) + private communityStakeesForAddress; + + mapping(uint256 stakeId => Stake) public stakes; + uint256 public stakeCount; + + uint256 public currentBurnRound = 1; + + mapping(uint256 round => uint192 amount) public totalSlashed; + + // Used to permit unfreeze + mapping(uint256 => bool) public slashProofHashes; + + event SelfStake(address indexed staker, uint256 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint256 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashProofHash + ); + + event Burn(uint256 indexed round, uint256 amount); + + GTC public gtc; + + function initialize(address gtcAddress) public initializer { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + + gtc = GTC(gtcAddress); + } + + function selfStake(uint192 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + gtc.transferFrom(msg.sender, address(this), amount); + + selfStakeIds[msg.sender].push(stakeId); + + emit SelfStake(msg.sender, amount); + } + + function communityStake( + address stakee, + uint192 amount, + uint64 unlockTime + ) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + communityStakeIds[msg.sender][stakee].push(stakeId); + + gtc.transferFrom(msg.sender, address(this), amount); + + emit CommunityStake(msg.sender, stakee, amount); + } + + function slash( + uint256[] calldata stakeIds, + uint64 slashedPercent, + uint256 slashProofHash + ) external { + uint256 numStakes = stakeIds.length; + + for (uint256 i = 0; i < numStakes; i++) { + uint256 stakeId = stakeIds[i]; + uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; + totalSlashed[currentBurnRound] += slashedAmount; + stakes[stakeId].amount -= slashedAmount; + } + + slashProofHashes[slashProofHash] = true; + + emit SlashEvent(msg.sender, slashedPercent, slashProofHash); + } + + // Burn last round, start next round (locking this round) + // Rounds don't matter, this is just to time the slashing + function burn() external { + // TODO check that threshold has passed since last burn, save this timestamp + + gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); + + emit Burn(currentBurnRound - 1, totalSlashed[currentBurnRound - 1]); + + currentBurnRound++; + } + + // Pseudocode + // function release(address, amount, proof, slashProofHash) external { + // require(msg.sender has Releaser role) + // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); + // checkProof(proof, slashProofHash); // Probably merkle membership? + // // release + // } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} + diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index 5190e46..e5d4f41 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -88,6 +88,24 @@ describe("GitcoinIdentityStaking", function () { .connect(this.owner) .initialize(gtcAddress); + const GitcoinIdentityStaking10 = await ethers.getContractFactory( + "GitcoinIdentityStaking10", + this.owner + ); + this.gitcoinIdentityStaking10 = await GitcoinIdentityStaking10.deploy(); + await this.gitcoinIdentityStaking10 + .connect(this.owner) + .initialize(gtcAddress); + + const GitcoinIdentityStaking11 = await ethers.getContractFactory( + "GitcoinIdentityStaking11", + this.owner + ); + this.gitcoinIdentityStaking11 = await GitcoinIdentityStaking11.deploy(); + await this.gitcoinIdentityStaking11 + .connect(this.owner) + .initialize(gtcAddress); + for (let i = 0; i < this.userAccounts.length; i++) { await this.gtc .connect(this.owner) @@ -106,9 +124,13 @@ describe("GitcoinIdentityStaking", function () { // this.gitcoinIdentityStaking4 // this.gitcoinIdentityStaking5, this.gitcoinIdentityStaking6, - this.gitcoinIdentityStaking7 + this.gitcoinIdentityStaking7, // this.gitcoinIdentityStaking8 + this.gitcoinIdentityStaking10, + this.gitcoinIdentityStaking11 ].map(async (gitcoinIdentityStaking: any) => { + const slashAddresses: { staker: string; stakee: string }[] = []; + await Promise.all( userAccounts.map(async (userAccount: any, accountIdx: number) => { let hasTimelock = true; @@ -157,6 +179,23 @@ describe("GitcoinIdentityStaking", function () { 100000 ); } + slashAddresses.push( + { + staker: userAccount.address, + stakee: userAccount.address + }, + { + staker: userAccount.address, + stakee: this.userAccounts[accountIdx + 1].address + }, + { + staker: userAccount.address, + stakee: + this.userAccounts[ + accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 + ].address + } + ); }) ); @@ -168,28 +207,46 @@ describe("GitcoinIdentityStaking", function () { .slice(0, 20) .map(({ address }: { address: string }) => address); - let hasSlashHash = true; + const stakeIds = Array.from({ length: 60 }, (_, i) => i); + + for (const slashMethod in [ + ["slash(uint256[],uint64)", [stakeIds, 50]], + ["slash(uint256[],uint64, uint256)", [stakeIds, 50, 123]], + ["slash(address[],uint64)", [addresses, 50]], + ["slash(address[],uint64, uint256)", [addresses, 50, 123]] + ]) { + const [func, args] = slashMethod; + try { + gitcoinIdentityStaking[func]; + } catch { + continue; + } + await gitcoinIdentityStaking.connect(this.owner)[func](...args); + } + + let hasBurnArgs = false; try { - gitcoinIdentityStaking["slash(address[],uint64)"]; - hasSlashHash = false; + gitcoinIdentityStaking["burn(uint256[])"]; + hasBurnArgs = true; } catch {} - if (hasSlashHash) { - await gitcoinIdentityStaking - .connect(this.owner) - .slash(addresses, 50, 123); - - await gitcoinIdentityStaking - .connect(this.owner) - .slash(addresses, 50, 456); - - await gitcoinIdentityStaking.connect(this.owner).burn(); + if (hasBurnArgs) { + await gitcoinIdentityStaking.connect(this.owner).burn([0, 1]); } else { - await gitcoinIdentityStaking.connect(this.owner).slash(addresses, 50); - - await gitcoinIdentityStaking.connect(this.owner).slash(addresses, 50); + await gitcoinIdentityStaking.connect(this.owner).burn(); + } - await gitcoinIdentityStaking.connect(this.owner).burn([0, 1]); + let hasSlashAddresses = false; + try { + gitcoinIdentityStaking.slashAddresses; + hasSlashAddresses = true; + } catch {} + if (hasSlashAddresses) { + await gitcoinIdentityStaking.connect(this.owner).slashAddresses( + slashAddresses.slice(0, 60).map(({ staker }) => staker), + slashAddresses.slice(0, 60).map(({ stakee }) => stakee), + 50 + ); } }) ); From 908d49ad4bf419d82feace00034286c493e1709d Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Wed, 20 Dec 2023 07:23:20 -0700 Subject: [PATCH 06/18] fixed test script --- contracts/GitcoinIdentityStaking.sol | 10 +++------- test/GitcoinIdentityStaking.ts | 10 +++++----- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index d4b6b98..fcdd0a0 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -1558,10 +1558,6 @@ contract GitcoinIdentityStaking11 is mapping(address => uint256[]) public selfStakeIds; mapping(address => mapping(address => uint256[])) public communityStakeIds; - mapping(address => EnumerableSet.AddressSet) - private communityStakersForAddress; - mapping(address => EnumerableSet.AddressSet) - private communityStakeesForAddress; mapping(uint256 stakeId => Stake) public stakes; uint256 public stakeCount; @@ -1573,11 +1569,11 @@ contract GitcoinIdentityStaking11 is // Used to permit unfreeze mapping(uint256 => bool) public slashProofHashes; - event SelfStake(address indexed staker, uint256 amount); + event SelfStake(address indexed staker, uint192 amount); event CommunityStake( address indexed staker, address indexed stakee, - uint256 amount + uint192 amount ); event SlashEvent( @@ -1586,7 +1582,7 @@ contract GitcoinIdentityStaking11 is uint256 slashProofHash ); - event Burn(uint256 indexed round, uint256 amount); + event Burn(uint256 indexed round, uint192 amount); GTC public gtc; diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index e5d4f41..e809033 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -118,7 +118,7 @@ describe("GitcoinIdentityStaking", function () { await Promise.all( [ - this.gitcoinIdentityStaking, + // this.gitcoinIdentityStaking, // this.gitcoinIdentityStaking2, // this.gitcoinIdentityStaking3, // this.gitcoinIdentityStaking4 @@ -209,13 +209,13 @@ describe("GitcoinIdentityStaking", function () { const stakeIds = Array.from({ length: 60 }, (_, i) => i); - for (const slashMethod in [ + for (const slashMethod of [ ["slash(uint256[],uint64)", [stakeIds, 50]], - ["slash(uint256[],uint64, uint256)", [stakeIds, 50, 123]], + ["slash(uint256[],uint64,uint256)", [stakeIds, 50, 123]], ["slash(address[],uint64)", [addresses, 50]], - ["slash(address[],uint64, uint256)", [addresses, 50, 123]] + ["slash(address[],uint64,uint256)", [addresses, 50, 123]] ]) { - const [func, args] = slashMethod; + const [func, args]: any = slashMethod; try { gitcoinIdentityStaking[func]; } catch { From 27a7d269bc6226372b86d8ea78e106f1feb02c3a Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Wed, 20 Dec 2023 08:29:34 -0700 Subject: [PATCH 07/18] continuing gas tests --- contracts/GitcoinIdentityStaking.sol | 177 ++++++++++++++++++++++----- test/GitcoinIdentityStaking.ts | 108 ++++++++++------ 2 files changed, 216 insertions(+), 69 deletions(-) diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index fcdd0a0..1bfa1a5 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -483,8 +483,7 @@ contract GitcoinIdentityStaking3 is slashCount++; } - function withdraw() external { - } + function withdraw() external {} // This kind of sucks because if there are new community stakers // after your slash but before the burn, they'll be slashed too @@ -722,9 +721,6 @@ contract GitcoinIdentityStaking5 is mapping(address => Stake) public selfStakeAmount; mapping(address => mapping(address => Stake)) public communityStakeAmounts; - mapping(address staker => mapping(address stakee => bool)) - public unlockPending; - mapping(address => EnumerableSet.AddressSet) private communityStakersForAddress; mapping(address => EnumerableSet.AddressSet) @@ -765,7 +761,6 @@ contract GitcoinIdentityStaking5 is function selfStake(uint256 amount, uint64 unlockTime) external { require(amount > 0, "Amount must be greater than 0"); - require(unlockPending[msg.sender][msg.sender] == false, "Unlock pending"); gtc.transferFrom(msg.sender, address(this), amount); @@ -781,7 +776,6 @@ contract GitcoinIdentityStaking5 is uint64 unlockTime ) external { require(amount > 0, "Amount must be greater than 0"); - require(unlockPending[msg.sender][stakee] == false, "Unlock pending"); communityStakeAmounts[msg.sender][stakee].amount += amount; communityStakeAmounts[msg.sender][stakee].unlockTime = unlockTime; @@ -880,9 +874,6 @@ contract GitcoinIdentityStaking6 is mapping(address => Stake) public selfStakeAmount; mapping(address => mapping(address => Stake)) public communityStakeAmounts; - mapping(address staker => mapping(address stakee => bool)) - public unlockPending; - mapping(address => EnumerableSet.AddressSet) private communityStakersForAddress; mapping(address => EnumerableSet.AddressSet) @@ -908,9 +899,7 @@ contract GitcoinIdentityStaking6 is uint256 slashProofHash ); - event SlashAddresses( - address indexed slasher - ); + event SlashAddresses(address indexed slasher); event Burn(uint256 indexed round, uint256 amount); @@ -927,7 +916,6 @@ contract GitcoinIdentityStaking6 is function selfStake(uint192 amount, uint64 unlockTime) external { require(amount > 0, "Amount must be greater than 0"); - require(unlockPending[msg.sender][msg.sender] == false, "Unlock pending"); gtc.transferFrom(msg.sender, address(this), uint256(amount)); @@ -943,7 +931,6 @@ contract GitcoinIdentityStaking6 is uint64 unlockTime ) external { require(amount > 0, "Amount must be greater than 0"); - require(unlockPending[msg.sender][stakee] == false, "Unlock pending"); communityStakeAmounts[msg.sender][stakee].amount += amount; communityStakeAmounts[msg.sender][stakee].unlockTime = unlockTime; @@ -995,20 +982,6 @@ contract GitcoinIdentityStaking6 is emit SlashEvent(msg.sender, slashedPercent, slashProofHash); } - function slashAddresses(address[] calldata stakers, address[] calldata stakees, uint64 percent) external { - for (uint256 i = 0; i < stakers.length; i++) { - address staker = stakers[i]; - address stakee = stakees[i]; - - uint192 slashedAmount = (percent * - communityStakeAmounts[staker][stakee].amount) / 100; - totalSlashed[currentBurnRound] += slashedAmount; - communityStakeAmounts[staker][stakee].amount -= slashedAmount; - } - - emit SlashAddresses(msg.sender); - } - // Burn last round, start next round (locking this round) // Rounds don't matter, this is just to time the slashing function burn() external { @@ -1016,7 +989,10 @@ contract GitcoinIdentityStaking6 is gtc.transfer(address(1), uint256(totalSlashed[currentBurnRound - 1])); - emit Burn(currentBurnRound - 1, uint256(totalSlashed[currentBurnRound - 1])); + emit Burn( + currentBurnRound - 1, + uint256(totalSlashed[currentBurnRound - 1]) + ); currentBurnRound++; } @@ -1499,8 +1475,7 @@ contract GitcoinIdentityStaking10 is slashCount++; } - function withdraw() external { - } + function withdraw() external {} function burn(uint256[] calldata slashIds) external { uint192 amountToBurn = 0; @@ -1673,3 +1648,141 @@ contract GitcoinIdentityStaking11 is ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} } +// Only one stake per stakee:staker, store amount as uint192 +// slash with staker[], stakee[], percent +contract GitcoinIdentityStaking12 is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + using EnumerableSet for EnumerableSet.AddressSet; + + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + struct Stake { + uint192 amount; + uint64 unlockTime; + } + + mapping(address => Stake) public selfStakeAmount; + mapping(address => mapping(address => Stake)) public communityStakeAmounts; + + uint256 public currentBurnRound = 1; + + mapping(uint256 round => uint192 amount) public totalSlashed; + + // Used to permit unfreeze + mapping(uint256 => bool) public slashProofHashes; + + event SelfStake(address indexed staker, uint256 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint256 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashProofHash + ); + + event SlashAddresses(address indexed slasher); + + event Burn(uint256 indexed round, uint256 amount); + + GTC public gtc; + + function initialize(address gtcAddress) public initializer { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + + gtc = GTC(gtcAddress); + } + + function selfStake(uint192 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + gtc.transferFrom(msg.sender, address(this), uint256(amount)); + + selfStakeAmount[msg.sender].amount += amount; + selfStakeAmount[msg.sender].unlockTime = unlockTime; + + emit SelfStake(msg.sender, amount); + } + + function communityStake( + address stakee, + uint192 amount, + uint64 unlockTime + ) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + communityStakeAmounts[msg.sender][stakee].amount += amount; + communityStakeAmounts[msg.sender][stakee].unlockTime = unlockTime; + + gtc.transferFrom(msg.sender, address(this), uint256(amount)); + + emit CommunityStake(msg.sender, stakee, amount); + } + + function slashAddresses( + address[] calldata stakers, + address[] calldata stakees, + uint64 percent + ) external { + for (uint256 i = 0; i < stakers.length; i++) { + address staker = stakers[i]; + address stakee = stakees[i]; + + if (stakee == staker) { + uint192 slashedAmount = (percent * selfStakeAmount[staker].amount) / + 100; + totalSlashed[currentBurnRound] += slashedAmount; + selfStakeAmount[staker].amount -= slashedAmount; + } else { + uint192 slashedAmount = (percent * + communityStakeAmounts[staker][stakee].amount) / 100; + totalSlashed[currentBurnRound] += slashedAmount; + communityStakeAmounts[staker][stakee].amount -= slashedAmount; + } + } + + emit SlashAddresses(msg.sender); + } + + // Burn last round, start next round (locking this round) + // Rounds don't matter, this is just to time the slashing + function burn() external { + // TODO check that threshold has passed since last burn, save this timestamp + + gtc.transfer(address(1), uint256(totalSlashed[currentBurnRound - 1])); + + emit Burn( + currentBurnRound - 1, + uint256(totalSlashed[currentBurnRound - 1]) + ); + + currentBurnRound++; + } + + // Pseudocode + // function release(address, amount, proof, slashProofHash) external { + // require(msg.sender has Releaser role) + // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); + // checkProof(proof, slashProofHash); // Probably merkle membership? + // // release + // } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index e809033..288b1b0 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -1,6 +1,14 @@ import { expect } from "chai"; import { ethers } from "hardhat"; +function shuffleArray(array: any[]) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array; +} + describe("GitcoinIdentityStaking", function () { this.beforeEach(async function () { const [ownerAccount, ...userAccounts] = await ethers.getSigners(); @@ -106,6 +114,15 @@ describe("GitcoinIdentityStaking", function () { .connect(this.owner) .initialize(gtcAddress); + const GitcoinIdentityStaking12 = await ethers.getContractFactory( + "GitcoinIdentityStaking12", + this.owner + ); + this.gitcoinIdentityStaking12 = await GitcoinIdentityStaking12.deploy(); + await this.gitcoinIdentityStaking12 + .connect(this.owner) + .initialize(gtcAddress); + for (let i = 0; i < this.userAccounts.length; i++) { await this.gtc .connect(this.owner) @@ -126,8 +143,9 @@ describe("GitcoinIdentityStaking", function () { this.gitcoinIdentityStaking6, this.gitcoinIdentityStaking7, // this.gitcoinIdentityStaking8 - this.gitcoinIdentityStaking10, - this.gitcoinIdentityStaking11 + // this.gitcoinIdentityStaking10, + this.gitcoinIdentityStaking11, + this.gitcoinIdentityStaking12 ].map(async (gitcoinIdentityStaking: any) => { const slashAddresses: { staker: string; stakee: string }[] = []; @@ -140,44 +158,60 @@ describe("GitcoinIdentityStaking", function () { } catch {} if (hasTimelock) { - await gitcoinIdentityStaking - .connect(userAccount) - .selfStake(100000, 1703165387); - - await gitcoinIdentityStaking - .connect(userAccount) - .communityStake( - this.userAccounts[accountIdx + 1], - 100000, - 1703165387 - ); - - await gitcoinIdentityStaking - .connect(userAccount) - .communityStake( - this.userAccounts[ - accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 - ], - 100000, - 1703165387 - ); + for (const func of shuffleArray([ + () => + gitcoinIdentityStaking + .connect(userAccount) + .selfStake(100000, 1703165387), + + () => + gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[accountIdx + 1], + 100000, + 1703165387 + ), + + () => + gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[ + accountIdx + ? accountIdx - 1 + : this.userAccounts.length - 1 + ], + 100000, + 1703165387 + ) + ])) { + await func(); + } } else { - await gitcoinIdentityStaking - .connect(userAccount) - .selfStake(100000); + for (const func of shuffleArray([ + () => + gitcoinIdentityStaking.connect(userAccount).selfStake(100000), - await gitcoinIdentityStaking - .connect(userAccount) - .communityStake(this.userAccounts[accountIdx + 1], 100000); + () => + gitcoinIdentityStaking + .connect(userAccount) + .communityStake(this.userAccounts[accountIdx + 1], 100000), - await gitcoinIdentityStaking - .connect(userAccount) - .communityStake( - this.userAccounts[ - accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 - ], - 100000 - ); + () => + gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[ + accountIdx + ? accountIdx - 1 + : this.userAccounts.length - 1 + ], + 100000 + ) + ])) { + await func(); + } } slashAddresses.push( { From c9fd03312ab316ad72c01d55e0ef561f26aede6d Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Wed, 20 Dec 2023 09:18:19 -0700 Subject: [PATCH 08/18] continuing gas tests --- contracts/GitcoinIdentityStaking.sol | 148 +++++++++++++++++++++++++++ test/GitcoinIdentityStaking.ts | 10 ++ 2 files changed, 158 insertions(+) diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index 1bfa1a5..de429e4 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -1786,3 +1786,151 @@ contract GitcoinIdentityStaking12 is address ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} } + +// Tracking slashes explicitly in contract +// store amount as uint192 +// slash with slash IDs +contract GitcoinIdentityStaking13 is + Initializable, + UUPSUpgradeable, + AccessControlUpgradeable, + PausableUpgradeable +{ + using EnumerableSet for EnumerableSet.AddressSet; + + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); + + error OnlySlasher(); + error OnlyAdmin(); + + struct Stake { + uint192 amount; + uint64 unlockTime; + } + + struct Slash { + uint192 amount; + uint64 time; + uint256[] stakeIds; + } + + mapping(address => uint256[]) public selfStakeIds; + mapping(address => mapping(address => uint256[])) public communityStakeIds; + + mapping(uint256 stakeId => Stake) public stakes; + mapping(uint256 slashId => Slash) public slashes; + uint256 public stakeCount; + uint256 public slashCount; + + event SelfStake(address indexed staker, uint256 amount); + event CommunityStake( + address indexed staker, + address indexed stakee, + uint256 amount + ); + + event SlashEvent( + address indexed slasher, + uint64 slashedPercent, + uint256 slashCount + ); + + event Burn(address indexed burner); + + GTC public gtc; + + function initialize(address gtcAddress) public initializer { + _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); + + __AccessControl_init(); + __Pausable_init(); + + gtc = GTC(gtcAddress); + } + + function selfStake(uint192 amount, uint64 unlockTime) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + selfStakeIds[msg.sender].push(stakeId); + + gtc.transferFrom(msg.sender, address(this), uint256(amount)); + + emit SelfStake(msg.sender, amount); + } + + function communityStake( + address stakee, + uint192 amount, + uint64 unlockTime + ) external { + require(amount > 0, "Amount must be greater than 0"); + require(unlockTime > block.timestamp, "Unlock time must be in the future"); + + uint256 stakeId = ++stakeCount; + stakes[stakeId].amount = amount; + stakes[stakeId].unlockTime = unlockTime; + + communityStakeIds[msg.sender][stakee].push(stakeId); + + gtc.transferFrom(msg.sender, address(this), uint256(amount)); + + emit CommunityStake(msg.sender, stakee, amount); + } + + function slash( + uint256[] calldata stakeIds, + uint64 slashedPercent + ) external { + uint192 totalSlashed = 0; + uint256 numStakes = stakeIds.length; + + for (uint256 i = 0; i < numStakes; i++) { + uint256 stakeId = stakeIds[i]; + uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; + totalSlashed += slashedAmount; + stakes[stakeId].amount -= slashedAmount; + } + + slashes[slashCount].amount = totalSlashed; + slashes[slashCount].time = uint64(block.timestamp); + slashes[slashCount].stakeIds = stakeIds; + + slashCount++; + + emit SlashEvent(msg.sender, slashedPercent, slashCount); + } + + function burn(uint256[] calldata slashIds) external { + uint192 amountToBurn = 0; + + uint256 numIds = slashIds.length; + for (uint256 i = 0; i < numIds; i++) { + uint256 slashId = slashIds[i]; + if (slashes[slashId].time > 0) { + amountToBurn += slashes[slashId].amount; + delete slashes[slashId]; + } + } + + gtc.transfer(address(1), uint256(amountToBurn)); + + emit Burn(msg.sender); + } + + // Pseudocode + // function release(address, amount, slashId) external { + // require(msg.sender has Releaser role) + // require(slashed[slashId] exists) + // require(slashes[slashId].accounts.contains(address)) + // // release + // } + + function _authorizeUpgrade( + address + ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} +} diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index 288b1b0..3d05cbd 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -123,6 +123,15 @@ describe("GitcoinIdentityStaking", function () { .connect(this.owner) .initialize(gtcAddress); + const GitcoinIdentityStaking13 = await ethers.getContractFactory( + "GitcoinIdentityStaking13", + this.owner + ); + this.gitcoinIdentityStaking13 = await GitcoinIdentityStaking13.deploy(); + await this.gitcoinIdentityStaking13 + .connect(this.owner) + .initialize(gtcAddress); + for (let i = 0; i < this.userAccounts.length; i++) { await this.gtc .connect(this.owner) @@ -146,6 +155,7 @@ describe("GitcoinIdentityStaking", function () { // this.gitcoinIdentityStaking10, this.gitcoinIdentityStaking11, this.gitcoinIdentityStaking12 + // this.gitcoinIdentityStaking13 ].map(async (gitcoinIdentityStaking: any) => { const slashAddresses: { staker: string; stakee: string }[] = []; From 9cda7d9403dcb53743ec88b2b9e4734880224311 Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Wed, 20 Dec 2023 11:06:30 -0700 Subject: [PATCH 09/18] Squashed commit of the following: commit 9d15170c27cb65ad4df7d091c29a0a5f1dd8f8cd Author: Lucian Hymer Date: Wed Dec 20 11:04:13 2023 -0700 mob next [ci-skip] [ci skip] [skip ci] lastFile:test/GitcoinIdentityStaking.ts commit 63a0c7b416da81fdee4cd2b9377e06b992672eee Author: Lucian Hymer Date: Wed Dec 20 09:19:10 2023 -0700 mob start [ci-skip] [ci skip] [skip ci] --- contracts/GitcoinIdentityStaking.sol | 1819 +------------------------- test/GitcoinIdentityStaking.ts | 437 ++++--- 2 files changed, 253 insertions(+), 2003 deletions(-) diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index de429e4..bd6797f 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -24,1513 +24,15 @@ contract GitcoinIdentityStaking is using EnumerableSet for EnumerableSet.AddressSet; bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); - - struct Stake { - uint256 amount; - uint64 unlockTime; - } - - mapping(address => uint256[]) public selfStakeIds; - mapping(address => mapping(address => uint256[])) public communityStakeIds; - mapping(address => EnumerableSet.AddressSet) - private communityStakersForAddress; - mapping(address => EnumerableSet.AddressSet) - private communityStakeesForAddress; - - mapping(uint256 stakeId => Stake) public stakes; - uint256 public stakeCount; - - uint256 public currentBurnRound = 1; - - mapping(uint256 round => uint256 amount) public totalSlashed; - - // Used to permit unfreeze - mapping(uint256 => bool) public slashProofHashes; - - event SelfStake(address indexed staker, uint256 amount); - event CommunityStake( - address indexed staker, - address indexed stakee, - uint256 amount - ); - - event SlashEvent( - address indexed slasher, - uint64 slashedPercent, - uint256 slashProofHash - ); - - event Burn(uint256 indexed round, uint256 amount); - - GTC public gtc; - - function initialize(address gtcAddress) public initializer { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - - __AccessControl_init(); - __Pausable_init(); - - gtc = GTC(gtcAddress); - } - - function selfStake(uint256 amount, uint64 unlockTime) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - gtc.transferFrom(msg.sender, address(this), amount); - - selfStakeIds[msg.sender].push(stakeId); - - emit SelfStake(msg.sender, amount); - } - - function communityStake( - address stakee, - uint256 amount, - uint64 unlockTime - ) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - communityStakeIds[msg.sender][stakee].push(stakeId); - - gtc.transferFrom(msg.sender, address(this), amount); - - communityStakeesForAddress[msg.sender].add(stakee); - communityStakersForAddress[stakee].add(msg.sender); - - emit CommunityStake(msg.sender, stakee, amount); - } - - function slash( - address[] calldata accounts, - uint64 slashedPercent, - uint256 slashProofHash - ) external { - uint256 numAccounts = accounts.length; - - for (uint256 i = 0; i < numAccounts; i++) { - address account = accounts[i]; - uint256 numSelfStakes = selfStakeIds[account].length; - for (uint256 j = 0; j < numSelfStakes; j++) { - uint256 stakeId = selfStakeIds[account][j]; - uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; - totalSlashed[currentBurnRound] += slashedAmount; - stakes[stakeId].amount -= slashedAmount; - } - - uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); - for (uint256 j = 0; j < numStakedOnByMe; j++) { - address stakee = communityStakeesForAddress[account].at(j); - uint256 numStakes = communityStakeIds[account][stakee].length; - for (uint256 k = 0; k < numStakes; k++) { - uint256 stakeId = communityStakeIds[account][stakee][k]; - uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / - 100; - totalSlashed[currentBurnRound] += slashedAmount; - stakes[stakeId].amount -= slashedAmount; - } - } - - uint256 numOthersStakingMe = communityStakersForAddress[account].length(); - for (uint256 j = 0; j < numOthersStakingMe; j++) { - address staker = communityStakersForAddress[account].at(j); - uint256 numStakes = communityStakeIds[staker][account].length; - for (uint256 k = 0; k < numStakes; k++) { - uint256 stakeId = communityStakeIds[staker][account][k]; - uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / - 100; - totalSlashed[currentBurnRound] += slashedAmount; - stakes[stakeId].amount -= slashedAmount; - } - } - } - - slashProofHashes[slashProofHash] = true; - - emit SlashEvent(msg.sender, slashedPercent, slashProofHash); - } - - // Burn last round, start next round (locking this round) - // Rounds don't matter, this is just to time the slashing - function burn() external { - // TODO check that threshold has passed since last burn, save this timestamp - - gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); - - emit Burn(currentBurnRound - 1, totalSlashed[currentBurnRound - 1]); - - currentBurnRound++; - } - - // Pseudocode - // function release(address, amount, proof, slashProofHash) external { - // require(msg.sender has Releaser role) - // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); - // checkProof(proof, slashProofHash); // Probably merkle membership? - // // release - // } - - function _authorizeUpgrade( - address - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} - -// Tracking slashes explicitly in contract -contract GitcoinIdentityStaking2 is - Initializable, - UUPSUpgradeable, - AccessControlUpgradeable, - PausableUpgradeable -{ - using EnumerableSet for EnumerableSet.AddressSet; - - bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); - - struct Stake { - uint256 amount; - uint64 unlockTime; - } - - struct Slash { - uint256 amount; - uint64 time; - address[] accounts; - } - - mapping(address => uint256[]) public selfStakeIds; - mapping(address => mapping(address => uint256[])) public communityStakeIds; - mapping(address => EnumerableSet.AddressSet) - private communityStakersForAddress; - mapping(address => EnumerableSet.AddressSet) - private communityStakeesForAddress; - - mapping(uint256 stakeId => Stake) public stakes; - mapping(uint256 slashId => Slash) public slashes; - uint256 public stakeCount; - uint256 public slashCount; - - event SelfStake(address indexed staker, uint256 amount); - event CommunityStake( - address indexed staker, - address indexed stakee, - uint256 amount - ); - - event SlashEvent( - address indexed slasher, - uint64 slashedPercent, - uint256 slashCount - ); - - event Burn(address indexed burner); - - GTC public gtc; - - function initialize(address gtcAddress) public initializer { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - - __AccessControl_init(); - __Pausable_init(); - - gtc = GTC(gtcAddress); - } - - function selfStake(uint256 amount, uint64 unlockTime) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - selfStakeIds[msg.sender].push(stakeId); - - gtc.transferFrom(msg.sender, address(this), amount); - - emit SelfStake(msg.sender, amount); - } - - function communityStake( - address stakee, - uint256 amount, - uint64 unlockTime - ) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - communityStakeIds[msg.sender][stakee].push(stakeId); - - communityStakeesForAddress[msg.sender].add(stakee); - communityStakersForAddress[stakee].add(msg.sender); - - gtc.transferFrom(msg.sender, address(this), amount); - - emit CommunityStake(msg.sender, stakee, amount); - } - - function slash(address[] calldata accounts, uint64 slashedPercent) external { - uint256 totalSlashed = 0; - uint256 numAccounts = accounts.length; - for (uint256 i = 0; i < numAccounts; i++) { - address account = accounts[i]; - uint256 selfStakeCount = selfStakeIds[account].length; - for (uint256 j = 0; j < selfStakeCount; j++) { - uint256 stakeId = selfStakeIds[account][j]; - uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; - stakes[stakeId].amount -= slashedAmount; - totalSlashed += slashedAmount; - } - - uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); - for (uint256 j = 0; j < numStakedOnByMe; j++) { - address stakee = communityStakeesForAddress[account].at(j); - uint256 numStakes = communityStakeIds[account][stakee].length; - for (uint256 k = 0; k < numStakes; k++) { - uint256 stakeId = communityStakeIds[account][stakee][k]; - uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / - 100; - stakes[stakeId].amount -= slashedAmount; - totalSlashed += slashedAmount; - } - } - - uint256 numOthersStakingMe = communityStakersForAddress[account].length(); - for (uint256 j = 0; j < numOthersStakingMe; j++) { - address staker = communityStakersForAddress[account].at(j); - uint256 numStakes = communityStakeIds[staker][account].length; - for (uint256 k = 0; k < numStakes; k++) { - uint256 stakeId = communityStakeIds[staker][account][k]; - uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / - 100; - stakes[stakeId].amount -= slashedAmount; - totalSlashed += slashedAmount; - } - } - } - - slashes[slashCount].amount = totalSlashed; - slashes[slashCount].time = uint64(block.timestamp); - slashes[slashCount].accounts = accounts; - - slashCount++; - - emit SlashEvent(msg.sender, slashedPercent, slashCount); - } - - function burn(uint256[] calldata slashIds) external { - uint256 amountToBurn = 0; - - uint256 numIds = slashIds.length; - for (uint256 i = 0; i < numIds; i++) { - uint256 slashId = slashIds[i]; - if (slashes[slashId].time > 0) { - amountToBurn += slashes[slashId].amount; - } - - delete slashes[slashId]; - } - - gtc.transfer(address(1), uint256(amountToBurn)); - - emit Burn(msg.sender); - } - - // Pseudocode - // function release(address, amount, slashId) external { - // require(msg.sender has Releaser role) - // require(slashed[slashId] exists) - // require(slashes[slashId].accounts.contains(address)) - // // release - // } - - function _authorizeUpgrade( - address - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} - -// Track slashes explicitly, move gas usage to burn -contract GitcoinIdentityStaking3 is - Initializable, - UUPSUpgradeable, - AccessControlUpgradeable, - PausableUpgradeable -{ - using EnumerableSet for EnumerableSet.AddressSet; - - bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); - - struct Stake { - uint256 amount; - uint64 unlockTime; - } - - struct Slash { - uint64 percent; - uint64 time; - address[] accounts; - } - - mapping(address => uint256[]) public selfStakeIds; - mapping(address => mapping(address => uint256[])) public communityStakeIds; - mapping(address => EnumerableSet.AddressSet) - private communityStakersForAddress; - mapping(address => EnumerableSet.AddressSet) - private communityStakeesForAddress; - - mapping(uint256 stakeId => Stake) public stakes; - mapping(uint256 slashId => Slash) public slashes; - uint256 public stakeCount; - uint256 public slashCount; - - event SelfStake(address indexed staker, uint256 amount); - event CommunityStake( - address indexed staker, - address indexed stakee, - uint256 amount - ); - - event SlashEvent( - address indexed slasher, - uint64 slashedPercent, - uint256 slashCount - ); - - event Burn(address indexed burner); - - GTC public gtc; - - function initialize(address gtcAddress) public initializer { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - - __AccessControl_init(); - __Pausable_init(); - - gtc = GTC(gtcAddress); - } - - // For this one, getting self and community stake totals is - // WAY more complex, all the slashing calculations from the - // `burn` function must be executed for **any** read. But - // if we don't need to ever read this data as part of a - // transaction, that's fine - - function selfStake(uint256 amount, uint64 unlockTime) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - selfStakeIds[msg.sender].push(stakeId); - - gtc.transferFrom(msg.sender, address(this), amount); - - emit SelfStake(msg.sender, amount); - } - - function communityStake( - address stakee, - uint256 amount, - uint64 unlockTime - ) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - communityStakeIds[msg.sender][stakee].push(stakeId); - - communityStakeesForAddress[msg.sender].add(stakee); - communityStakersForAddress[stakee].add(msg.sender); - - gtc.transferFrom(msg.sender, address(this), amount); - - emit CommunityStake(msg.sender, stakee, amount); - } - - function slash(address[] calldata accounts, uint64 slashedPercent) external { - slashes[slashCount].percent = slashedPercent; - slashes[slashCount].time = uint64(block.timestamp); - slashes[slashCount].accounts = accounts; - - emit SlashEvent(msg.sender, slashedPercent, slashCount); - - slashCount++; - } - - function withdraw() external {} - - // This kind of sucks because if there are new community stakers - // after your slash but before the burn, they'll be slashed too - // So we need to store more info or something - function burn(uint256[] calldata slashIds) external { - uint256 amountToBurn = 0; - - uint256 numIds = slashIds.length; - for (uint256 i = 0; i < numIds; i++) { - uint64 slashedPercent = slashes[slashIds[i]].percent; - - for (uint256 j = 0; j < slashes[slashIds[i]].accounts.length; j++) { - address account = slashes[slashIds[i]].accounts[j]; - uint256 selfStakeCount = selfStakeIds[account].length; - for (uint256 k = 0; k < selfStakeCount; k++) { - uint256 stakeId = selfStakeIds[account][k]; - uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / - 100; - stakes[stakeId].amount -= slashedAmount; - amountToBurn += slashedAmount; - } - - uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); - for (uint256 k = 0; k < numStakedOnByMe; k++) { - address stakee = communityStakeesForAddress[account].at(k); - uint256 numStakes = communityStakeIds[account][stakee].length; - for (uint256 l = 0; l < numStakes; l++) { - uint256 stakeId = communityStakeIds[account][stakee][l]; - uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / - 100; - stakes[stakeId].amount -= slashedAmount; - amountToBurn += slashedAmount; - } - } - - uint256 numOthersStakingMe = communityStakersForAddress[account] - .length(); - for (uint256 k = 0; k < numOthersStakingMe; k++) { - address staker = communityStakersForAddress[account].at(k); - uint256 numStakes = communityStakeIds[staker][account].length; - for (uint256 l = 0; l < numStakes; l++) { - uint256 stakeId = communityStakeIds[staker][account][l]; - uint256 slashedAmount = (slashedPercent * stakes[stakeId].amount) / - 100; - stakes[stakeId].amount -= slashedAmount; - amountToBurn += slashedAmount; - } - } - } - - delete slashes[slashIds[i]]; - } - - gtc.transfer(address(1), amountToBurn); - - emit Burn(msg.sender); - } - - // Pseudocode - // function release(address, amount, slashId) external { - // require(msg.sender has Releaser role) - // } - - function _authorizeUpgrade( - address - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} - -// Only one stake per stakee:staker, lock period -contract GitcoinIdentityStaking4 is - Initializable, - UUPSUpgradeable, - AccessControlUpgradeable, - PausableUpgradeable -{ - using EnumerableSet for EnumerableSet.AddressSet; - - bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); - - mapping(address => uint256) public selfStakeAmount; - mapping(address => mapping(address => uint256)) public communityStakeAmounts; - - mapping(address staker => mapping(address stakee => bool)) - public unlockPending; - - mapping(address => EnumerableSet.AddressSet) - private communityStakersForAddress; - mapping(address => EnumerableSet.AddressSet) - private communityStakeesForAddress; - - uint256 public currentBurnRound = 1; - - mapping(uint256 round => uint256 amount) public totalSlashed; - - // Used to permit unfreeze - mapping(uint256 => bool) public slashProofHashes; - - event SelfStake(address indexed staker, uint256 amount); - event CommunityStake( - address indexed staker, - address indexed stakee, - uint256 amount - ); - - event SlashEvent( - address indexed slasher, - uint64 slashedPercent, - uint256 slashProofHash - ); - - event Burn(uint256 indexed round, uint256 amount); - - GTC public gtc; - - function initialize(address gtcAddress) public initializer { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - - __AccessControl_init(); - __Pausable_init(); - - gtc = GTC(gtcAddress); - } - - function selfStake(uint256 amount) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockPending[msg.sender][msg.sender] == false, "Unlock pending"); - - gtc.transferFrom(msg.sender, address(this), amount); - - selfStakeAmount[msg.sender] += amount; - - emit SelfStake(msg.sender, amount); - } - - function communityStake(address stakee, uint256 amount) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockPending[msg.sender][stakee] == false, "Unlock pending"); - - communityStakeAmounts[msg.sender][stakee] += amount; - - gtc.transferFrom(msg.sender, address(this), amount); - - communityStakeesForAddress[msg.sender].add(stakee); - communityStakersForAddress[stakee].add(msg.sender); - - emit CommunityStake(msg.sender, stakee, amount); - } - - function slash( - address[] calldata accounts, - uint64 slashedPercent, - uint256 slashProofHash - ) external { - uint256 numAccounts = accounts.length; - - for (uint256 i = 0; i < numAccounts; i++) { - address account = accounts[i]; - - uint256 selfSlashedAmount = (slashedPercent * selfStakeAmount[account]) / - 100; - totalSlashed[currentBurnRound] += selfSlashedAmount; - selfStakeAmount[account] -= selfSlashedAmount; - - uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); - for (uint256 j = 0; j < numStakedOnByMe; j++) { - address stakee = communityStakeesForAddress[account].at(j); - uint256 slashedAmount = (slashedPercent * - communityStakeAmounts[account][stakee]) / 100; - totalSlashed[currentBurnRound] += slashedAmount; - communityStakeAmounts[account][stakee] -= slashedAmount; - } - - uint256 numOthersStakingMe = communityStakersForAddress[account].length(); - for (uint256 j = 0; j < numOthersStakingMe; j++) { - address staker = communityStakersForAddress[account].at(j); - uint256 slashedAmount = (slashedPercent * - communityStakeAmounts[staker][account]) / 100; - totalSlashed[currentBurnRound] += slashedAmount; - communityStakeAmounts[staker][account] -= slashedAmount; - } - } - - slashProofHashes[slashProofHash] = true; - - emit SlashEvent(msg.sender, slashedPercent, slashProofHash); - } - - // Burn last round, start next round (locking this round) - // Rounds don't matter, this is just to time the slashing - function burn() external { - // TODO check that threshold has passed since last burn, save this timestamp - - gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); - - currentBurnRound++; - - emit Burn(currentBurnRound - 1, totalSlashed[currentBurnRound - 1]); - } - - // Pseudocode - // function release(address, amount, proof, slashProofHash) external { - // require(msg.sender has Releaser role) - // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); - // checkProof(proof, slashProofHash); // Probably merkle membership? - // // release - // } - - function _authorizeUpgrade( - address - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} - -// Only one stake per stakee:staker -contract GitcoinIdentityStaking5 is - Initializable, - UUPSUpgradeable, - AccessControlUpgradeable, - PausableUpgradeable -{ - using EnumerableSet for EnumerableSet.AddressSet; - - bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); - - struct Stake { - uint256 amount; - uint64 unlockTime; - } - - mapping(address => Stake) public selfStakeAmount; - mapping(address => mapping(address => Stake)) public communityStakeAmounts; - - mapping(address => EnumerableSet.AddressSet) - private communityStakersForAddress; - mapping(address => EnumerableSet.AddressSet) - private communityStakeesForAddress; - - uint256 public currentBurnRound = 1; - - mapping(uint256 round => uint256 amount) public totalSlashed; - - // Used to permit unfreeze - mapping(uint256 => bool) public slashProofHashes; - - event SelfStake(address indexed staker, uint256 amount); - event CommunityStake( - address indexed staker, - address indexed stakee, - uint256 amount - ); - - event SlashEvent( - address indexed slasher, - uint64 slashedPercent, - uint256 slashProofHash - ); - - event Burn(uint256 indexed round, uint256 amount); - - GTC public gtc; - - function initialize(address gtcAddress) public initializer { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - - __AccessControl_init(); - __Pausable_init(); - - gtc = GTC(gtcAddress); - } - - function selfStake(uint256 amount, uint64 unlockTime) external { - require(amount > 0, "Amount must be greater than 0"); - - gtc.transferFrom(msg.sender, address(this), amount); - - selfStakeAmount[msg.sender].amount += amount; - selfStakeAmount[msg.sender].unlockTime = unlockTime; - - emit SelfStake(msg.sender, amount); - } - - function communityStake( - address stakee, - uint256 amount, - uint64 unlockTime - ) external { - require(amount > 0, "Amount must be greater than 0"); - - communityStakeAmounts[msg.sender][stakee].amount += amount; - communityStakeAmounts[msg.sender][stakee].unlockTime = unlockTime; - - gtc.transferFrom(msg.sender, address(this), amount); - - communityStakeesForAddress[msg.sender].add(stakee); - communityStakersForAddress[stakee].add(msg.sender); - - emit CommunityStake(msg.sender, stakee, amount); - } - - function slash( - address[] calldata accounts, - uint64 slashedPercent, - uint256 slashProofHash - ) external { - uint256 numAccounts = accounts.length; - - for (uint256 i = 0; i < numAccounts; i++) { - address account = accounts[i]; - - uint256 selfSlashedAmount = (slashedPercent * - selfStakeAmount[account].amount) / 100; - totalSlashed[currentBurnRound] += selfSlashedAmount; - selfStakeAmount[account].amount -= selfSlashedAmount; - - uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); - for (uint256 j = 0; j < numStakedOnByMe; j++) { - address stakee = communityStakeesForAddress[account].at(j); - uint256 slashedAmount = (slashedPercent * - communityStakeAmounts[account][stakee].amount) / 100; - totalSlashed[currentBurnRound] += slashedAmount; - communityStakeAmounts[account][stakee].amount -= slashedAmount; - } - - uint256 numOthersStakingMe = communityStakersForAddress[account].length(); - for (uint256 j = 0; j < numOthersStakingMe; j++) { - address staker = communityStakersForAddress[account].at(j); - uint256 slashedAmount = (slashedPercent * - communityStakeAmounts[staker][account].amount) / 100; - totalSlashed[currentBurnRound] += slashedAmount; - communityStakeAmounts[staker][account].amount -= slashedAmount; - } - } - - slashProofHashes[slashProofHash] = true; - - emit SlashEvent(msg.sender, slashedPercent, slashProofHash); - } - - // Burn last round, start next round (locking this round) - // Rounds don't matter, this is just to time the slashing - function burn() external { - // TODO check that threshold has passed since last burn, save this timestamp - - gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); - - emit Burn(currentBurnRound - 1, totalSlashed[currentBurnRound - 1]); - - currentBurnRound++; - } - - // Pseudocode - // function release(address, amount, proof, slashProofHash) external { - // require(msg.sender has Releaser role) - // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); - // checkProof(proof, slashProofHash); // Probably merkle membership? - // // release - // } - - function _authorizeUpgrade( - address - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} - -// Only one stake per stakee:staker, store amount as uint192 -contract GitcoinIdentityStaking6 is - Initializable, - UUPSUpgradeable, - AccessControlUpgradeable, - PausableUpgradeable -{ - using EnumerableSet for EnumerableSet.AddressSet; - - bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); - - struct Stake { - uint192 amount; - uint64 unlockTime; - } - - mapping(address => Stake) public selfStakeAmount; - mapping(address => mapping(address => Stake)) public communityStakeAmounts; - - mapping(address => EnumerableSet.AddressSet) - private communityStakersForAddress; - mapping(address => EnumerableSet.AddressSet) - private communityStakeesForAddress; - - uint256 public currentBurnRound = 1; - - mapping(uint256 round => uint192 amount) public totalSlashed; - - // Used to permit unfreeze - mapping(uint256 => bool) public slashProofHashes; - - event SelfStake(address indexed staker, uint256 amount); - event CommunityStake( - address indexed staker, - address indexed stakee, - uint256 amount - ); - - event SlashEvent( - address indexed slasher, - uint64 slashedPercent, - uint256 slashProofHash - ); - - event SlashAddresses(address indexed slasher); - - event Burn(uint256 indexed round, uint256 amount); - - GTC public gtc; - - function initialize(address gtcAddress) public initializer { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - - __AccessControl_init(); - __Pausable_init(); - - gtc = GTC(gtcAddress); - } - - function selfStake(uint192 amount, uint64 unlockTime) external { - require(amount > 0, "Amount must be greater than 0"); - - gtc.transferFrom(msg.sender, address(this), uint256(amount)); - - selfStakeAmount[msg.sender].amount += amount; - selfStakeAmount[msg.sender].unlockTime = unlockTime; - - emit SelfStake(msg.sender, amount); - } - - function communityStake( - address stakee, - uint192 amount, - uint64 unlockTime - ) external { - require(amount > 0, "Amount must be greater than 0"); - - communityStakeAmounts[msg.sender][stakee].amount += amount; - communityStakeAmounts[msg.sender][stakee].unlockTime = unlockTime; - - gtc.transferFrom(msg.sender, address(this), uint256(amount)); - - communityStakeesForAddress[msg.sender].add(stakee); - communityStakersForAddress[stakee].add(msg.sender); - - emit CommunityStake(msg.sender, stakee, amount); - } - - function slash( - address[] calldata accounts, - uint64 slashedPercent, - uint256 slashProofHash - ) external { - uint256 numAccounts = accounts.length; - - for (uint256 i = 0; i < numAccounts; i++) { - address account = accounts[i]; - - uint192 selfSlashedAmount = (slashedPercent * - selfStakeAmount[account].amount) / 100; - totalSlashed[currentBurnRound] += selfSlashedAmount; - selfStakeAmount[account].amount -= selfSlashedAmount; - - uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); - for (uint256 j = 0; j < numStakedOnByMe; j++) { - address stakee = communityStakeesForAddress[account].at(j); - uint192 slashedAmount = (slashedPercent * - communityStakeAmounts[account][stakee].amount) / 100; - totalSlashed[currentBurnRound] += slashedAmount; - communityStakeAmounts[account][stakee].amount -= slashedAmount; - } - - uint256 numOthersStakingMe = communityStakersForAddress[account].length(); - for (uint256 j = 0; j < numOthersStakingMe; j++) { - address staker = communityStakersForAddress[account].at(j); - uint192 slashedAmount = (slashedPercent * - communityStakeAmounts[staker][account].amount) / 100; - totalSlashed[currentBurnRound] += slashedAmount; - communityStakeAmounts[staker][account].amount -= slashedAmount; - } - } - - slashProofHashes[slashProofHash] = true; - - emit SlashEvent(msg.sender, slashedPercent, slashProofHash); - } - - // Burn last round, start next round (locking this round) - // Rounds don't matter, this is just to time the slashing - function burn() external { - // TODO check that threshold has passed since last burn, save this timestamp - - gtc.transfer(address(1), uint256(totalSlashed[currentBurnRound - 1])); - - emit Burn( - currentBurnRound - 1, - uint256(totalSlashed[currentBurnRound - 1]) - ); - - currentBurnRound++; - } - - // Pseudocode - // function release(address, amount, proof, slashProofHash) external { - // require(msg.sender has Releaser role) - // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); - // checkProof(proof, slashProofHash); // Probably merkle membership? - // // release - // } - - function _authorizeUpgrade( - address - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} - -// store amount as uint192 -contract GitcoinIdentityStaking7 is - Initializable, - UUPSUpgradeable, - AccessControlUpgradeable, - PausableUpgradeable -{ - using EnumerableSet for EnumerableSet.AddressSet; - - bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); - - struct Stake { - uint192 amount; - uint64 unlockTime; - } - - mapping(address => uint256[]) public selfStakeIds; - mapping(address => mapping(address => uint256[])) public communityStakeIds; - mapping(address => EnumerableSet.AddressSet) - private communityStakersForAddress; - mapping(address => EnumerableSet.AddressSet) - private communityStakeesForAddress; - - mapping(uint256 stakeId => Stake) public stakes; - uint256 public stakeCount; - - uint256 public currentBurnRound = 1; - - mapping(uint256 round => uint192 amount) public totalSlashed; - - // Used to permit unfreeze - mapping(uint256 => bool) public slashProofHashes; - - event SelfStake(address indexed staker, uint256 amount); - event CommunityStake( - address indexed staker, - address indexed stakee, - uint256 amount - ); - - event SlashEvent( - address indexed slasher, - uint64 slashedPercent, - uint256 slashProofHash - ); - - event Burn(uint256 indexed round, uint256 amount); - - GTC public gtc; - - function initialize(address gtcAddress) public initializer { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - - __AccessControl_init(); - __Pausable_init(); - - gtc = GTC(gtcAddress); - } - - function selfStake(uint192 amount, uint64 unlockTime) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - gtc.transferFrom(msg.sender, address(this), amount); - - selfStakeIds[msg.sender].push(stakeId); - - emit SelfStake(msg.sender, amount); - } - - function communityStake( - address stakee, - uint192 amount, - uint64 unlockTime - ) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - communityStakeIds[msg.sender][stakee].push(stakeId); - - gtc.transferFrom(msg.sender, address(this), amount); - - communityStakeesForAddress[msg.sender].add(stakee); - communityStakersForAddress[stakee].add(msg.sender); - - emit CommunityStake(msg.sender, stakee, amount); - } - - function slash( - address[] calldata accounts, - uint64 slashedPercent, - uint256 slashProofHash - ) external { - uint256 numAccounts = accounts.length; - - for (uint256 i = 0; i < numAccounts; i++) { - address account = accounts[i]; - uint256 numSelfStakes = selfStakeIds[account].length; - for (uint256 j = 0; j < numSelfStakes; j++) { - uint256 stakeId = selfStakeIds[account][j]; - uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; - totalSlashed[currentBurnRound] += slashedAmount; - stakes[stakeId].amount -= slashedAmount; - } - - uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); - for (uint256 j = 0; j < numStakedOnByMe; j++) { - address stakee = communityStakeesForAddress[account].at(j); - uint256 numStakes = communityStakeIds[account][stakee].length; - for (uint256 k = 0; k < numStakes; k++) { - uint256 stakeId = communityStakeIds[account][stakee][k]; - uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / - 100; - totalSlashed[currentBurnRound] += slashedAmount; - stakes[stakeId].amount -= slashedAmount; - } - } - - uint256 numOthersStakingMe = communityStakersForAddress[account].length(); - for (uint256 j = 0; j < numOthersStakingMe; j++) { - address staker = communityStakersForAddress[account].at(j); - uint256 numStakes = communityStakeIds[staker][account].length; - for (uint256 k = 0; k < numStakes; k++) { - uint256 stakeId = communityStakeIds[staker][account][k]; - uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / - 100; - totalSlashed[currentBurnRound] += slashedAmount; - stakes[stakeId].amount -= slashedAmount; - } - } - } - - slashProofHashes[slashProofHash] = true; - - emit SlashEvent(msg.sender, slashedPercent, slashProofHash); - } - - // Burn last round, start next round (locking this round) - // Rounds don't matter, this is just to time the slashing - function burn() external { - // TODO check that threshold has passed since last burn, save this timestamp - - gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); - - emit Burn(currentBurnRound - 1, totalSlashed[currentBurnRound - 1]); - - currentBurnRound++; - } - - // Pseudocode - // function release(address, amount, proof, slashProofHash) external { - // require(msg.sender has Releaser role) - // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); - // checkProof(proof, slashProofHash); // Probably merkle membership? - // // release - // } - - function _authorizeUpgrade( - address - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} - -// Tracking slashes explicitly in contract -// store amount as uint192 -contract GitcoinIdentityStaking8 is - Initializable, - UUPSUpgradeable, - AccessControlUpgradeable, - PausableUpgradeable -{ - using EnumerableSet for EnumerableSet.AddressSet; - - bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); - - struct Stake { - uint192 amount; - uint64 unlockTime; - } - - struct Slash { - uint192 amount; - uint64 time; - address[] accounts; - } - - mapping(address => uint256[]) public selfStakeIds; - mapping(address => mapping(address => uint256[])) public communityStakeIds; - mapping(address => EnumerableSet.AddressSet) - private communityStakersForAddress; - mapping(address => EnumerableSet.AddressSet) - private communityStakeesForAddress; - - mapping(uint256 stakeId => Stake) public stakes; - mapping(uint256 slashId => Slash) public slashes; - uint256 public stakeCount; - uint256 public slashCount; - - event SelfStake(address indexed staker, uint256 amount); - event CommunityStake( - address indexed staker, - address indexed stakee, - uint256 amount - ); - - event SlashEvent( - address indexed slasher, - uint64 slashedPercent, - uint256 slashCount - ); - - event Burn(address indexed burner); - - GTC public gtc; - - function initialize(address gtcAddress) public initializer { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - - __AccessControl_init(); - __Pausable_init(); - - gtc = GTC(gtcAddress); - } - - function selfStake(uint192 amount, uint64 unlockTime) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - selfStakeIds[msg.sender].push(stakeId); - - gtc.transferFrom(msg.sender, address(this), uint256(amount)); - - emit SelfStake(msg.sender, amount); - } - - function communityStake( - address stakee, - uint192 amount, - uint64 unlockTime - ) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - communityStakeIds[msg.sender][stakee].push(stakeId); - - communityStakeesForAddress[msg.sender].add(stakee); - communityStakersForAddress[stakee].add(msg.sender); - - gtc.transferFrom(msg.sender, address(this), uint256(amount)); - - emit CommunityStake(msg.sender, stakee, amount); - } - - function slash(address[] calldata accounts, uint64 slashedPercent) external { - uint192 totalSlashed = 0; - uint256 numAccounts = accounts.length; - for (uint256 i = 0; i < numAccounts; i++) { - address account = accounts[i]; - uint256 selfStakeCount = selfStakeIds[account].length; - for (uint256 j = 0; j < selfStakeCount; j++) { - uint256 stakeId = selfStakeIds[account][j]; - uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; - stakes[stakeId].amount -= slashedAmount; - totalSlashed += slashedAmount; - } - - uint256 numStakedOnByMe = communityStakeesForAddress[account].length(); - for (uint256 j = 0; j < numStakedOnByMe; j++) { - address stakee = communityStakeesForAddress[account].at(j); - uint256 numStakes = communityStakeIds[account][stakee].length; - for (uint256 k = 0; k < numStakes; k++) { - uint256 stakeId = communityStakeIds[account][stakee][k]; - uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / - 100; - stakes[stakeId].amount -= slashedAmount; - totalSlashed += slashedAmount; - } - } - - uint256 numOthersStakingMe = communityStakersForAddress[account].length(); - for (uint256 j = 0; j < numOthersStakingMe; j++) { - address staker = communityStakersForAddress[account].at(j); - uint256 numStakes = communityStakeIds[staker][account].length; - for (uint256 k = 0; k < numStakes; k++) { - uint256 stakeId = communityStakeIds[staker][account][k]; - uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / - 100; - stakes[stakeId].amount -= slashedAmount; - totalSlashed += slashedAmount; - } - } - } - - slashes[slashCount].amount = totalSlashed; - slashes[slashCount].time = uint64(block.timestamp); - slashes[slashCount].accounts = accounts; - - slashCount++; - - emit SlashEvent(msg.sender, slashedPercent, slashCount); - } - - function burn(uint256[] calldata slashIds) external { - uint192 amountToBurn = 0; - - uint256 numIds = slashIds.length; - for (uint256 i = 0; i < numIds; i++) { - uint256 slashId = slashIds[i]; - if (slashes[slashId].time > 0) { - amountToBurn += slashes[slashId].amount; - delete slashes[slashId]; - } - } - - gtc.transfer(address(1), uint256(amountToBurn)); - - emit Burn(msg.sender); - } - - // Pseudocode - // function release(address, amount, slashId) external { - // require(msg.sender has Releaser role) - // require(slashed[slashId] exists) - // require(slashes[slashId].accounts.contains(address)) - // // release - // } - - function _authorizeUpgrade( - address - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} - -// Track slashes explicitly, move gas usage to burn -// use uint192 for amount -// use stakeIds for slashing -contract GitcoinIdentityStaking10 is - Initializable, - UUPSUpgradeable, - AccessControlUpgradeable, - PausableUpgradeable -{ - using EnumerableSet for EnumerableSet.AddressSet; - - bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); - - struct Stake { - uint192 amount; - uint64 unlockTime; - } - - struct Slash { - uint64 percent; - uint64 time; - uint256[] stakeIds; - } - - mapping(address => uint256[]) public selfStakeIds; - mapping(address => mapping(address => uint256[])) public communityStakeIds; - - mapping(uint256 stakeId => Stake) public stakes; - mapping(uint256 slashId => Slash) public slashes; - uint256 public stakeCount; - uint256 public slashCount; - - event SelfStake(address indexed staker, uint192 amount); - event CommunityStake( - address indexed staker, - address indexed stakee, - uint192 amount - ); - - event SlashEvent( - address indexed slasher, - uint64 slashedPercent, - uint256 slashCount - ); - - event Burn(address indexed burner); - - GTC public gtc; - - function initialize(address gtcAddress) public initializer { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - - __AccessControl_init(); - __Pausable_init(); - - gtc = GTC(gtcAddress); - } - - // For this one, getting self and community stake totals is - // WAY more complex, all the slashing calculations from the - // `burn` function must be executed for **any** read. But - // if we don't need to ever read this data as part of a - // transaction, that's fine - - function selfStake(uint192 amount, uint64 unlockTime) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - selfStakeIds[msg.sender].push(stakeId); - - gtc.transferFrom(msg.sender, address(this), amount); - - emit SelfStake(msg.sender, amount); - } - - function communityStake( - address stakee, - uint192 amount, - uint64 unlockTime - ) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - communityStakeIds[msg.sender][stakee].push(stakeId); - - gtc.transferFrom(msg.sender, address(this), amount); - - emit CommunityStake(msg.sender, stakee, amount); - } - - function slash(uint256[] calldata stakeIds, uint64 slashedPercent) external { - slashes[slashCount].percent = slashedPercent; - slashes[slashCount].time = uint64(block.timestamp); - slashes[slashCount].stakeIds = stakeIds; - - // include hash of stakeIds in event? - emit SlashEvent(msg.sender, slashedPercent, slashCount); - - slashCount++; - } - - function withdraw() external {} - - function burn(uint256[] calldata slashIds) external { - uint192 amountToBurn = 0; - - uint256 numIds = slashIds.length; - for (uint256 i = 0; i < numIds; i++) { - uint64 slashedPercent = slashes[slashIds[i]].percent; - - uint256 numStakes = slashes[slashIds[i]].stakeIds.length; - - for (uint256 j = 0; j < numStakes; j++) { - uint256 stakeId = slashes[slashIds[i]].stakeIds[j]; - uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; - stakes[stakeId].amount -= slashedAmount; - amountToBurn += slashedAmount; - } - - delete slashes[slashIds[i]]; - } - - gtc.transfer(address(1), uint256(amountToBurn)); - - emit Burn(msg.sender); - } - - // Pseudocode - // function release(address, amount, slashId) external { - // require(msg.sender has Releaser role) - // } - - function _authorizeUpgrade( - address - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} - -// store amount as uint192 -// slash with stake IDs -contract GitcoinIdentityStaking11 is - Initializable, - UUPSUpgradeable, - AccessControlUpgradeable, - PausableUpgradeable -{ - using EnumerableSet for EnumerableSet.AddressSet; - - bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); + bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); + bytes32 public constant RELEASER_ROLE = keccak256("RELEASER_ROLE"); struct Stake { uint192 amount; uint64 unlockTime; } + // TODO func selfStakeIdsLength(address) => uint256 mapping(address => uint256[]) public selfStakeIds; mapping(address => mapping(address => uint256[])) public communityStakeIds; @@ -1542,19 +44,20 @@ contract GitcoinIdentityStaking11 is mapping(uint256 round => uint192 amount) public totalSlashed; // Used to permit unfreeze - mapping(uint256 => bool) public slashProofHashes; + mapping(bytes32 => bool) public slashProofHashes; event SelfStake(address indexed staker, uint192 amount); + event CommunityStake( address indexed staker, address indexed stakee, uint192 amount ); - event SlashEvent( + event Slash( address indexed slasher, uint64 slashedPercent, - uint256 slashProofHash + bytes32 slashProofHash ); event Burn(uint256 indexed round, uint192 amount); @@ -1607,8 +110,8 @@ contract GitcoinIdentityStaking11 is function slash( uint256[] calldata stakeIds, uint64 slashedPercent, - uint256 slashProofHash - ) external { + bytes32 slashProofHash + ) external onlyRole(SLASHER_ROLE) { uint256 numStakes = stakeIds.length; for (uint256 i = 0; i < numStakes; i++) { @@ -1620,12 +123,12 @@ contract GitcoinIdentityStaking11 is slashProofHashes[slashProofHash] = true; - emit SlashEvent(msg.sender, slashedPercent, slashProofHash); + emit Slash(msg.sender, slashedPercent, slashProofHash); } // Burn last round, start next round (locking this round) // Rounds don't matter, this is just to time the slashing - function burn() external { + function burn() external onlyRole(BURNER_ROLE) { // TODO check that threshold has passed since last burn, save this timestamp gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); @@ -1635,301 +138,37 @@ contract GitcoinIdentityStaking11 is currentBurnRound++; } - // Pseudocode - // function release(address, amount, proof, slashProofHash) external { - // require(msg.sender has Releaser role) - // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); - // checkProof(proof, slashProofHash); // Probably merkle membership? - // // release - // } - - function _authorizeUpgrade( - address - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} - -// Only one stake per stakee:staker, store amount as uint192 -// slash with staker[], stakee[], percent -contract GitcoinIdentityStaking12 is - Initializable, - UUPSUpgradeable, - AccessControlUpgradeable, - PausableUpgradeable -{ - using EnumerableSet for EnumerableSet.AddressSet; - - bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); - - struct Stake { + struct SlashMember { + address account; uint192 amount; - uint64 unlockTime; - } - - mapping(address => Stake) public selfStakeAmount; - mapping(address => mapping(address => Stake)) public communityStakeAmounts; - - uint256 public currentBurnRound = 1; - - mapping(uint256 round => uint192 amount) public totalSlashed; - - // Used to permit unfreeze - mapping(uint256 => bool) public slashProofHashes; - - event SelfStake(address indexed staker, uint256 amount); - event CommunityStake( - address indexed staker, - address indexed stakee, - uint256 amount - ); - - event SlashEvent( - address indexed slasher, - uint64 slashedPercent, - uint256 slashProofHash - ); - - event SlashAddresses(address indexed slasher); - - event Burn(uint256 indexed round, uint256 amount); - - GTC public gtc; - - function initialize(address gtcAddress) public initializer { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - - __AccessControl_init(); - __Pausable_init(); - - gtc = GTC(gtcAddress); - } - - function selfStake(uint192 amount, uint64 unlockTime) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - gtc.transferFrom(msg.sender, address(this), uint256(amount)); - - selfStakeAmount[msg.sender].amount += amount; - selfStakeAmount[msg.sender].unlockTime = unlockTime; - - emit SelfStake(msg.sender, amount); - } - - function communityStake( - address stakee, - uint192 amount, - uint64 unlockTime - ) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - communityStakeAmounts[msg.sender][stakee].amount += amount; - communityStakeAmounts[msg.sender][stakee].unlockTime = unlockTime; - - gtc.transferFrom(msg.sender, address(this), uint256(amount)); - - emit CommunityStake(msg.sender, stakee, amount); - } - - function slashAddresses( - address[] calldata stakers, - address[] calldata stakees, - uint64 percent - ) external { - for (uint256 i = 0; i < stakers.length; i++) { - address staker = stakers[i]; - address stakee = stakees[i]; - - if (stakee == staker) { - uint192 slashedAmount = (percent * selfStakeAmount[staker].amount) / - 100; - totalSlashed[currentBurnRound] += slashedAmount; - selfStakeAmount[staker].amount -= slashedAmount; - } else { - uint192 slashedAmount = (percent * - communityStakeAmounts[staker][stakee].amount) / 100; - totalSlashed[currentBurnRound] += slashedAmount; - communityStakeAmounts[staker][stakee].amount -= slashedAmount; - } - } - - emit SlashAddresses(msg.sender); - } - - // Burn last round, start next round (locking this round) - // Rounds don't matter, this is just to time the slashing - function burn() external { - // TODO check that threshold has passed since last burn, save this timestamp - - gtc.transfer(address(1), uint256(totalSlashed[currentBurnRound - 1])); - - emit Burn( - currentBurnRound - 1, - uint256(totalSlashed[currentBurnRound - 1]) - ); - - currentBurnRound++; } // Pseudocode - // function release(address, amount, proof, slashProofHash) external { - // require(msg.sender has Releaser role) - // require(slashProofHashes[slashProofHash], "Slash proof hash not found"); - // checkProof(proof, slashProofHash); // Probably merkle membership? - // // release - // } - - function _authorizeUpgrade( - address - ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} -} - -// Tracking slashes explicitly in contract -// store amount as uint192 -// slash with slash IDs -contract GitcoinIdentityStaking13 is - Initializable, - UUPSUpgradeable, - AccessControlUpgradeable, - PausableUpgradeable -{ - using EnumerableSet for EnumerableSet.AddressSet; - - bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - - error OnlySlasher(); - error OnlyAdmin(); - - struct Stake { - uint192 amount; - uint64 unlockTime; - } - - struct Slash { - uint192 amount; - uint64 time; - uint256[] stakeIds; - } - - mapping(address => uint256[]) public selfStakeIds; - mapping(address => mapping(address => uint256[])) public communityStakeIds; - - mapping(uint256 stakeId => Stake) public stakes; - mapping(uint256 slashId => Slash) public slashes; - uint256 public stakeCount; - uint256 public slashCount; - - event SelfStake(address indexed staker, uint256 amount); - event CommunityStake( - address indexed staker, - address indexed stakee, - uint256 amount - ); - - event SlashEvent( - address indexed slasher, - uint64 slashedPercent, - uint256 slashCount - ); - - event Burn(address indexed burner); - - GTC public gtc; - - function initialize(address gtcAddress) public initializer { - _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); - - __AccessControl_init(); - __Pausable_init(); - - gtc = GTC(gtcAddress); - } - - function selfStake(uint192 amount, uint64 unlockTime) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - selfStakeIds[msg.sender].push(stakeId); - - gtc.transferFrom(msg.sender, address(this), uint256(amount)); - - emit SelfStake(msg.sender, amount); - } - - function communityStake( - address stakee, - uint192 amount, - uint64 unlockTime - ) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); - - uint256 stakeId = ++stakeCount; - stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; - - communityStakeIds[msg.sender][stakee].push(stakeId); - - gtc.transferFrom(msg.sender, address(this), uint256(amount)); - - emit CommunityStake(msg.sender, stakee, amount); - } - - function slash( - uint256[] calldata stakeIds, - uint64 slashedPercent - ) external { - uint192 totalSlashed = 0; - uint256 numStakes = stakeIds.length; - - for (uint256 i = 0; i < numStakes; i++) { - uint256 stakeId = stakeIds[i]; - uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; - totalSlashed += slashedAmount; - stakes[stakeId].amount -= slashedAmount; - } + function release( + SlashMember[] calldata slashMembers, + uint256 slashMemberIndex, + uint192 amountToRelease, + bytes32 slashProofHash + ) external onlyRole(RELEASER_ROLE) { + require(slashProofHashes[slashProofHash], "Slash proof hash not found"); + require(keccak256(abi.encode(slashMembers)) == slashProofHash, "Slash proof hash does not match"); - slashes[slashCount].amount = totalSlashed; - slashes[slashCount].time = uint64(block.timestamp); - slashes[slashCount].stakeIds = stakeIds; + SlashMember memory slashMemberToRelease = slashMembers[slashMemberIndex]; - slashCount++; + require(amountToRelease <= slashMemberToRelease.amount, "Amount to release must be less than or equal to amount slashed"); - emit SlashEvent(msg.sender, slashedPercent, slashCount); - } + SlashMember[] memory newSlashMembers = slashMembers; - function burn(uint256[] calldata slashIds) external { - uint192 amountToBurn = 0; + newSlashMembers[slashMemberIndex].amount -= amountToRelease; - uint256 numIds = slashIds.length; - for (uint256 i = 0; i < numIds; i++) { - uint256 slashId = slashIds[i]; - if (slashes[slashId].time > 0) { - amountToBurn += slashes[slashId].amount; - delete slashes[slashId]; - } - } + bytes32 newSlashProofHash = keccak256(abi.encode(newSlashMembers)); - gtc.transfer(address(1), uint256(amountToBurn)); + slashProofHashes[slashProofHash] = false; + slashProofHashes[newSlashProofHash] = true; - emit Burn(msg.sender); + gtc.transfer(slashMemberToRelease.account, amountToRelease); } - // Pseudocode - // function release(address, amount, slashId) external { - // require(msg.sender has Releaser role) - // require(slashed[slashId] exists) - // require(slashes[slashId].accounts.contains(address)) - // // release - // } - function _authorizeUpgrade( address ) internal override onlyRole(DEFAULT_ADMIN_ROLE) {} diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index 3d05cbd..b6aaaf7 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -33,104 +33,104 @@ describe("GitcoinIdentityStaking", function () { .connect(this.owner) .initialize(gtcAddress); - const GitcoinIdentityStaking2 = await ethers.getContractFactory( - "GitcoinIdentityStaking2", - this.owner - ); - this.gitcoinIdentityStaking2 = await GitcoinIdentityStaking2.deploy(); - await this.gitcoinIdentityStaking2 - .connect(this.owner) - .initialize(gtcAddress); - - const GitcoinIdentityStaking3 = await ethers.getContractFactory( - "GitcoinIdentityStaking3", - this.owner - ); - this.gitcoinIdentityStaking3 = await GitcoinIdentityStaking3.deploy(); - await this.gitcoinIdentityStaking3 - .connect(this.owner) - .initialize(gtcAddress); - - const GitcoinIdentityStaking4 = await ethers.getContractFactory( - "GitcoinIdentityStaking4", - this.owner - ); - this.gitcoinIdentityStaking4 = await GitcoinIdentityStaking4.deploy(); - await this.gitcoinIdentityStaking4 - .connect(this.owner) - .initialize(gtcAddress); - - const GitcoinIdentityStaking5 = await ethers.getContractFactory( - "GitcoinIdentityStaking5", - this.owner - ); - this.gitcoinIdentityStaking5 = await GitcoinIdentityStaking5.deploy(); - await this.gitcoinIdentityStaking5 - .connect(this.owner) - .initialize(gtcAddress); - - const GitcoinIdentityStaking6 = await ethers.getContractFactory( - "GitcoinIdentityStaking6", - this.owner - ); - this.gitcoinIdentityStaking6 = await GitcoinIdentityStaking6.deploy(); - await this.gitcoinIdentityStaking6 - .connect(this.owner) - .initialize(gtcAddress); - - const GitcoinIdentityStaking7 = await ethers.getContractFactory( - "GitcoinIdentityStaking7", - this.owner - ); - this.gitcoinIdentityStaking7 = await GitcoinIdentityStaking7.deploy(); - await this.gitcoinIdentityStaking7 - .connect(this.owner) - .initialize(gtcAddress); - - const GitcoinIdentityStaking8 = await ethers.getContractFactory( - "GitcoinIdentityStaking8", - this.owner - ); - this.gitcoinIdentityStaking8 = await GitcoinIdentityStaking8.deploy(); - await this.gitcoinIdentityStaking8 - .connect(this.owner) - .initialize(gtcAddress); - - const GitcoinIdentityStaking10 = await ethers.getContractFactory( - "GitcoinIdentityStaking10", - this.owner - ); - this.gitcoinIdentityStaking10 = await GitcoinIdentityStaking10.deploy(); - await this.gitcoinIdentityStaking10 - .connect(this.owner) - .initialize(gtcAddress); - - const GitcoinIdentityStaking11 = await ethers.getContractFactory( - "GitcoinIdentityStaking11", - this.owner - ); - this.gitcoinIdentityStaking11 = await GitcoinIdentityStaking11.deploy(); - await this.gitcoinIdentityStaking11 - .connect(this.owner) - .initialize(gtcAddress); - - const GitcoinIdentityStaking12 = await ethers.getContractFactory( - "GitcoinIdentityStaking12", - this.owner - ); - this.gitcoinIdentityStaking12 = await GitcoinIdentityStaking12.deploy(); - await this.gitcoinIdentityStaking12 - .connect(this.owner) - .initialize(gtcAddress); - - const GitcoinIdentityStaking13 = await ethers.getContractFactory( - "GitcoinIdentityStaking13", - this.owner - ); - this.gitcoinIdentityStaking13 = await GitcoinIdentityStaking13.deploy(); - await this.gitcoinIdentityStaking13 - .connect(this.owner) - .initialize(gtcAddress); + // const GitcoinIdentityStaking2 = await ethers.getContractFactory( + // "GitcoinIdentityStaking2", + // this.owner + // ); + // this.gitcoinIdentityStaking2 = await GitcoinIdentityStaking2.deploy(); + // await this.gitcoinIdentityStaking2 + // .connect(this.owner) + // .initialize(gtcAddress); + + // const GitcoinIdentityStaking3 = await ethers.getContractFactory( + // "GitcoinIdentityStaking3", + // this.owner + // ); + // this.gitcoinIdentityStaking3 = await GitcoinIdentityStaking3.deploy(); + // await this.gitcoinIdentityStaking3 + // .connect(this.owner) + // .initialize(gtcAddress); + + // const GitcoinIdentityStaking4 = await ethers.getContractFactory( + // "GitcoinIdentityStaking4", + // this.owner + // ); + // this.gitcoinIdentityStaking4 = await GitcoinIdentityStaking4.deploy(); + // await this.gitcoinIdentityStaking4 + // .connect(this.owner) + // .initialize(gtcAddress); + + // const GitcoinIdentityStaking5 = await ethers.getContractFactory( + // "GitcoinIdentityStaking5", + // this.owner + // ); + // this.gitcoinIdentityStaking5 = await GitcoinIdentityStaking5.deploy(); + // await this.gitcoinIdentityStaking5 + // .connect(this.owner) + // .initialize(gtcAddress); + + // const GitcoinIdentityStaking6 = await ethers.getContractFactory( + // "GitcoinIdentityStaking6", + // this.owner + // ); + // this.gitcoinIdentityStaking6 = await GitcoinIdentityStaking6.deploy(); + // await this.gitcoinIdentityStaking6 + // .connect(this.owner) + // .initialize(gtcAddress); + + // const GitcoinIdentityStaking7 = await ethers.getContractFactory( + // "GitcoinIdentityStaking7", + // this.owner + // ); + // this.gitcoinIdentityStaking7 = await GitcoinIdentityStaking7.deploy(); + // await this.gitcoinIdentityStaking7 + // .connect(this.owner) + // .initialize(gtcAddress); + + // const GitcoinIdentityStaking8 = await ethers.getContractFactory( + // "GitcoinIdentityStaking8", + // this.owner + // ); + // this.gitcoinIdentityStaking8 = await GitcoinIdentityStaking8.deploy(); + // await this.gitcoinIdentityStaking8 + // .connect(this.owner) + // .initialize(gtcAddress); + + // const GitcoinIdentityStaking10 = await ethers.getContractFactory( + // "GitcoinIdentityStaking10", + // this.owner + // ); + // this.gitcoinIdentityStaking10 = await GitcoinIdentityStaking10.deploy(); + // await this.gitcoinIdentityStaking10 + // .connect(this.owner) + // .initialize(gtcAddress); + + // const GitcoinIdentityStaking11 = await ethers.getContractFactory( + // "GitcoinIdentityStaking11", + // this.owner + // ); + // this.gitcoinIdentityStaking11 = await GitcoinIdentityStaking11.deploy(); + // await this.gitcoinIdentityStaking11 + // .connect(this.owner) + // .initialize(gtcAddress); + + // const GitcoinIdentityStaking12 = await ethers.getContractFactory( + // "GitcoinIdentityStaking12", + // this.owner + // ); + // this.gitcoinIdentityStaking12 = await GitcoinIdentityStaking12.deploy(); + // await this.gitcoinIdentityStaking12 + // .connect(this.owner) + // .initialize(gtcAddress); + + // const GitcoinIdentityStaking13 = await ethers.getContractFactory( + // "GitcoinIdentityStaking13", + // this.owner + // ); + // this.gitcoinIdentityStaking13 = await GitcoinIdentityStaking13.deploy(); + // await this.gitcoinIdentityStaking13 + // .connect(this.owner) + // .initialize(gtcAddress); for (let i = 0; i < this.userAccounts.length; i++) { await this.gtc @@ -144,84 +144,63 @@ describe("GitcoinIdentityStaking", function () { await Promise.all( [ - // this.gitcoinIdentityStaking, + this.gitcoinIdentityStaking // this.gitcoinIdentityStaking2, // this.gitcoinIdentityStaking3, // this.gitcoinIdentityStaking4 // this.gitcoinIdentityStaking5, - this.gitcoinIdentityStaking6, - this.gitcoinIdentityStaking7, + // this.gitcoinIdentityStaking6, + // this.gitcoinIdentityStaking7, // this.gitcoinIdentityStaking8 // this.gitcoinIdentityStaking10, - this.gitcoinIdentityStaking11, - this.gitcoinIdentityStaking12 + // this.gitcoinIdentityStaking11, + // this.gitcoinIdentityStaking12 // this.gitcoinIdentityStaking13 ].map(async (gitcoinIdentityStaking: any) => { + gitcoinIdentityStaking.grantRole( + await gitcoinIdentityStaking.SLASHER_ROLE(), + this.owner.address + ); + gitcoinIdentityStaking.grantRole( + await gitcoinIdentityStaking.BURNER_ROLE(), + this.owner.address + ); + gitcoinIdentityStaking.grantRole( + await gitcoinIdentityStaking.RELEASER_ROLE(), + this.owner.address + ); + const slashAddresses: { staker: string; stakee: string }[] = []; await Promise.all( userAccounts.map(async (userAccount: any, accountIdx: number) => { - let hasTimelock = true; - try { - gitcoinIdentityStaking["selfStake(uint256)"]; - hasTimelock = false; - } catch {} - - if (hasTimelock) { - for (const func of shuffleArray([ - () => - gitcoinIdentityStaking - .connect(userAccount) - .selfStake(100000, 1703165387), - - () => - gitcoinIdentityStaking - .connect(userAccount) - .communityStake( - this.userAccounts[accountIdx + 1], - 100000, - 1703165387 - ), - - () => - gitcoinIdentityStaking - .connect(userAccount) - .communityStake( - this.userAccounts[ - accountIdx - ? accountIdx - 1 - : this.userAccounts.length - 1 - ], - 100000, - 1703165387 - ) - ])) { - await func(); - } - } else { - for (const func of shuffleArray([ - () => - gitcoinIdentityStaking.connect(userAccount).selfStake(100000), - - () => - gitcoinIdentityStaking - .connect(userAccount) - .communityStake(this.userAccounts[accountIdx + 1], 100000), - - () => - gitcoinIdentityStaking - .connect(userAccount) - .communityStake( - this.userAccounts[ - accountIdx - ? accountIdx - 1 - : this.userAccounts.length - 1 - ], - 100000 - ) - ])) { - await func(); - } + for (const func of shuffleArray([ + () => + gitcoinIdentityStaking + .connect(userAccount) + .selfStake(100000, 1703165387), + + () => + gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[accountIdx + 1], + 100000, + 1703165387 + ), + + () => + gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[ + accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 + ], + 100000, + 1703165387 + ) + ])) { + await func(); } slashAddresses.push( { @@ -243,55 +222,87 @@ describe("GitcoinIdentityStaking", function () { }) ); - // expect(await gitcoinIdentityStaking.stakeCount()).to.equal( - // userAccounts.length * 3 - // ); - - const addresses = userAccounts - .slice(0, 20) - .map(({ address }: { address: string }) => address); - - const stakeIds = Array.from({ length: 60 }, (_, i) => i); - - for (const slashMethod of [ - ["slash(uint256[],uint64)", [stakeIds, 50]], - ["slash(uint256[],uint64,uint256)", [stakeIds, 50, 123]], - ["slash(address[],uint64)", [addresses, 50]], - ["slash(address[],uint64,uint256)", [addresses, 50, 123]] - ]) { - const [func, args]: any = slashMethod; - try { - gitcoinIdentityStaking[func]; - } catch { - continue; - } - await gitcoinIdentityStaking.connect(this.owner)[func](...args); - } - - let hasBurnArgs = false; - try { - gitcoinIdentityStaking["burn(uint256[])"]; - hasBurnArgs = true; - } catch {} - - if (hasBurnArgs) { - await gitcoinIdentityStaking.connect(this.owner).burn([0, 1]); - } else { - await gitcoinIdentityStaking.connect(this.owner).burn(); - } - - let hasSlashAddresses = false; - try { - gitcoinIdentityStaking.slashAddresses; - hasSlashAddresses = true; - } catch {} - if (hasSlashAddresses) { - await gitcoinIdentityStaking.connect(this.owner).slashAddresses( - slashAddresses.slice(0, 60).map(({ staker }) => staker), - slashAddresses.slice(0, 60).map(({ stakee }) => stakee), - 50 - ); - } + const stakeIds: number[] = []; + let slashMembers: any[][] = []; + + await Promise.all( + userAccounts.slice(0, 60).map(async (userAccount: any) => { + const stakeId = await gitcoinIdentityStaking.selfStakeIds( + userAccount.address, + 0 + ); + const amount = (await gitcoinIdentityStaking.stakes(stakeId))[0]; + slashMembers.push([userAccount.address, amount]); + stakeIds.push(stakeId); + }) + ); + slashMembers = slashMembers.sort((a, b) => (a[0] < b[0] ? -1 : 1)); + + const slashProof = ethers.keccak256( + ethers.AbiCoder.defaultAbiCoder().encode( + [ + { + type: "tuple[]", + name: "SlashMember", + components: [ + { + name: "account", + type: "address", + baseType: "address" + }, + { + name: "amount", + type: "uint192", + baseType: "uint192" + } + ] + } + ], + [slashMembers] + ) + ); + + await gitcoinIdentityStaking + .connect(this.owner) + .slash(stakeIds, 50, slashProof); + + const indexToRelease = 1; + + await gitcoinIdentityStaking + .connect(this.owner) + .release(slashMembers, indexToRelease, 500, slashProof); + + slashMembers[indexToRelease][1] -= BigInt(500); + + const newSlashProof = ethers.keccak256( + ethers.AbiCoder.defaultAbiCoder().encode( + [ + { + type: "tuple[]", + name: "SlashMember", + components: [ + { + name: "account", + type: "address", + baseType: "address" + }, + { + name: "amount", + type: "uint192", + baseType: "uint192" + } + ] + } + ], + [slashMembers] + ) + ); + + await gitcoinIdentityStaking + .connect(this.owner) + .release(slashMembers, 2, 1000, newSlashProof); + + await gitcoinIdentityStaking.connect(this.owner).burn(); }) ); }).timeout(1000000); From e71e1a1d2a3124a5329d861f40382747d40195a5 Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Wed, 20 Dec 2023 15:04:42 -0700 Subject: [PATCH 10/18] added thorough tests for stake/slash/release, added slash nonce --- contracts/GitcoinIdentityStaking.sol | 133 ++++-- contracts/mocks/GTC.sol | 1 - test/GitcoinIdentityStaking.ts | 594 +++++++++++++++++---------- 3 files changed, 492 insertions(+), 236 deletions(-) diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index bd6797f..ee702db 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -23,8 +23,17 @@ contract GitcoinIdentityStaking is { using EnumerableSet for EnumerableSet.AddressSet; + error SlashProofHashNotFound(); + error SlashProofHashNotValid(); + error SlashProofHashAlreadyUsed(); + error FundsNotAvailableToRelease(); + error MinimumBurnRoundDurationNotMet(); + error AmountMustBeGreaterThanZero(); + error UnlockTimeMustBeInTheFuture(); + error CannotStakeOnSelf(); + error FailedTransfer(); + bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); - bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE"); bytes32 public constant RELEASER_ROLE = keccak256("RELEASER_ROLE"); struct Stake { @@ -39,19 +48,32 @@ contract GitcoinIdentityStaking is mapping(uint256 stakeId => Stake) public stakes; uint256 public stakeCount; - uint256 public currentBurnRound = 1; + uint256 public currentSlashRound = 1; + + uint64 public burnRoundMinimumDuration = 90 days; + + uint256 public lastBurnTimestamp; + + address public burnAddress; mapping(uint256 round => uint192 amount) public totalSlashed; // Used to permit unfreeze mapping(bytes32 => bool) public slashProofHashes; - event SelfStake(address indexed staker, uint192 amount); + event SelfStake( + uint256 indexed id, + address indexed staker, + uint192 amount, + uint64 unlockTime + ); event CommunityStake( + uint256 indexed id, address indexed staker, address indexed stakee, - uint192 amount + uint192 amount, + uint64 unlockTime ); event Slash( @@ -64,28 +86,37 @@ contract GitcoinIdentityStaking is GTC public gtc; - function initialize(address gtcAddress) public initializer { + function initialize(address gtcAddress, address _burnAddress) public initializer { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); __AccessControl_init(); __Pausable_init(); gtc = GTC(gtcAddress); + burnAddress = _burnAddress; + + lastBurnTimestamp = block.timestamp; } function selfStake(uint192 amount, uint64 unlockTime) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); + if (unlockTime < block.timestamp) { + revert UnlockTimeMustBeInTheFuture(); + } + if (amount == 0) { + revert AmountMustBeGreaterThanZero(); + } uint256 stakeId = ++stakeCount; stakes[stakeId].amount = amount; stakes[stakeId].unlockTime = unlockTime; - gtc.transferFrom(msg.sender, address(this), amount); - selfStakeIds[msg.sender].push(stakeId); - emit SelfStake(msg.sender, amount); + if(!gtc.transferFrom(msg.sender, address(this), amount)) { + revert FailedTransfer(); + } + + emit SelfStake(stakeId, msg.sender, amount, unlockTime); } function communityStake( @@ -93,8 +124,15 @@ contract GitcoinIdentityStaking is uint192 amount, uint64 unlockTime ) external { - require(amount > 0, "Amount must be greater than 0"); - require(unlockTime > block.timestamp, "Unlock time must be in the future"); + if (unlockTime < block.timestamp) { + revert UnlockTimeMustBeInTheFuture(); + } + if (amount == 0) { + revert AmountMustBeGreaterThanZero(); + } + if (stakee == msg.sender) { + revert CannotStakeOnSelf(); + } uint256 stakeId = ++stakeCount; stakes[stakeId].amount = amount; @@ -102,9 +140,11 @@ contract GitcoinIdentityStaking is communityStakeIds[msg.sender][stakee].push(stakeId); - gtc.transferFrom(msg.sender, address(this), amount); + if(!gtc.transferFrom(msg.sender, address(this), amount)) { + revert FailedTransfer(); + } - emit CommunityStake(msg.sender, stakee, amount); + emit CommunityStake(stakeId, msg.sender, stakee, amount, unlockTime); } function slash( @@ -112,12 +152,16 @@ contract GitcoinIdentityStaking is uint64 slashedPercent, bytes32 slashProofHash ) external onlyRole(SLASHER_ROLE) { + if (slashProofHashes[slashProofHash]) { + revert SlashProofHashAlreadyUsed(); + } + uint256 numStakes = stakeIds.length; for (uint256 i = 0; i < numStakes; i++) { uint256 stakeId = stakeIds[i]; uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; - totalSlashed[currentBurnRound] += slashedAmount; + totalSlashed[currentSlashRound] += slashedAmount; stakes[stakeId].amount -= slashedAmount; } @@ -126,16 +170,36 @@ contract GitcoinIdentityStaking is emit Slash(msg.sender, slashedPercent, slashProofHash); } - // Burn last round, start next round (locking this round) - // Rounds don't matter, this is just to time the slashing - function burn() external onlyRole(BURNER_ROLE) { - // TODO check that threshold has passed since last burn, save this timestamp + // Burn last round and start next round (locking this round) + // + // Rounds don't matter for staking, this is just to + // ensure that slashes are aged before being burned + // + // On each call... + // - the current round contains all the slashes younger than the last + // burn (a minimum of the round mimimum duration, 0-90 days) + // - the previous round contains all the non-released slashes older + // than this (at least 90 days), and so it is burned + // - the current round becomes the previous round, and a new round + // is initiated + // On the very first call, nothing will be burned + function burn() external { + if (block.timestamp - lastBurnTimestamp < burnRoundMinimumDuration) { + revert MinimumBurnRoundDurationNotMet(); + } - gtc.transfer(address(1), totalSlashed[currentBurnRound - 1]); + uint192 amountToBurn = totalSlashed[currentSlashRound - 1]; - emit Burn(currentBurnRound - 1, totalSlashed[currentBurnRound - 1]); + if (amountToBurn > 0) { + if(!gtc.transfer(burnAddress, amountToBurn)) { + revert FailedTransfer(); + } + } + + emit Burn(currentSlashRound - 1, amountToBurn); - currentBurnRound++; + currentSlashRound++; + lastBurnTimestamp = block.timestamp; } struct SlashMember { @@ -143,30 +207,41 @@ contract GitcoinIdentityStaking is uint192 amount; } - // Pseudocode + // The nonce is used in the proof in case we need to + // do the exact same slash multiple times function release( SlashMember[] calldata slashMembers, uint256 slashMemberIndex, uint192 amountToRelease, - bytes32 slashProofHash + bytes32 slashProofHash, + bytes32 nonce, + bytes32 newNonce ) external onlyRole(RELEASER_ROLE) { - require(slashProofHashes[slashProofHash], "Slash proof hash not found"); - require(keccak256(abi.encode(slashMembers)) == slashProofHash, "Slash proof hash does not match"); + if (!slashProofHashes[slashProofHash]) { + revert SlashProofHashNotFound(); + } + if (keccak256(abi.encode(slashMembers, nonce)) != slashProofHash) { + revert SlashProofHashNotValid(); + } SlashMember memory slashMemberToRelease = slashMembers[slashMemberIndex]; - require(amountToRelease <= slashMemberToRelease.amount, "Amount to release must be less than or equal to amount slashed"); + if (amountToRelease > slashMemberToRelease.amount) { + revert FundsNotAvailableToRelease(); + } SlashMember[] memory newSlashMembers = slashMembers; newSlashMembers[slashMemberIndex].amount -= amountToRelease; - bytes32 newSlashProofHash = keccak256(abi.encode(newSlashMembers)); + bytes32 newSlashProofHash = keccak256(abi.encode(newSlashMembers, newNonce)); slashProofHashes[slashProofHash] = false; slashProofHashes[newSlashProofHash] = true; - gtc.transfer(slashMemberToRelease.account, amountToRelease); + if(!gtc.transfer(slashMemberToRelease.account, amountToRelease)) { + revert FailedTransfer(); + } } function _authorizeUpgrade( diff --git a/contracts/mocks/GTC.sol b/contracts/mocks/GTC.sol index 1a18cee..a19e1eb 100644 --- a/contracts/mocks/GTC.sol +++ b/contracts/mocks/GTC.sol @@ -88,7 +88,6 @@ contract GTC { * @param mintingAllowedAfter_ The timestamp after which minting may occur */ constructor(address account, address minter_, uint mintingAllowedAfter_) public { - require(mintingAllowedAfter_ >= block.timestamp, "GTC::constructor: minting can only begin after deployment"); balances[account] = uint96(totalSupply); emit Transfer(address(0), account, totalSupply); minter = minter_; diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index b6aaaf7..8e9625b 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -1,5 +1,7 @@ import { expect } from "chai"; import { ethers } from "hardhat"; +import { time } from "@nomicfoundation/hardhat-network-helpers"; +import { keccak256 } from "ethers"; function shuffleArray(array: any[]) { for (let i = array.length - 1; i > 0; i--) { @@ -9,6 +11,35 @@ function shuffleArray(array: any[]) { return array; } +function makeSlashProof(slashMembers: any[][], slashNonce: string) { + const slashProof = ethers.keccak256( + ethers.AbiCoder.defaultAbiCoder().encode( + [ + { + type: "tuple[]", + name: "SlashMember", + components: [ + { + name: "account", + type: "address", + baseType: "address" + }, + { + name: "amount", + type: "uint192", + baseType: "uint192" + } + ] + }, + "bytes32" + ], + [slashMembers, slashNonce] + ) + ); + + return slashProof; +} + describe("GitcoinIdentityStaking", function () { this.beforeEach(async function () { const [ownerAccount, ...userAccounts] = await ethers.getSigners(); @@ -20,7 +51,7 @@ describe("GitcoinIdentityStaking", function () { this.gtc = await GTC.deploy( this.owner.address, this.owner.address, - Math.floor(new Date().getTime() / 1000) + 2 + Math.floor(new Date().getTime() / 1000) + 4 ); const gtcAddress = await this.gtc.getAddress(); @@ -31,106 +62,7 @@ describe("GitcoinIdentityStaking", function () { this.gitcoinIdentityStaking = await GitcoinIdentityStaking.deploy(); await this.gitcoinIdentityStaking .connect(this.owner) - .initialize(gtcAddress); - - // const GitcoinIdentityStaking2 = await ethers.getContractFactory( - // "GitcoinIdentityStaking2", - // this.owner - // ); - // this.gitcoinIdentityStaking2 = await GitcoinIdentityStaking2.deploy(); - // await this.gitcoinIdentityStaking2 - // .connect(this.owner) - // .initialize(gtcAddress); - - // const GitcoinIdentityStaking3 = await ethers.getContractFactory( - // "GitcoinIdentityStaking3", - // this.owner - // ); - // this.gitcoinIdentityStaking3 = await GitcoinIdentityStaking3.deploy(); - // await this.gitcoinIdentityStaking3 - // .connect(this.owner) - // .initialize(gtcAddress); - - // const GitcoinIdentityStaking4 = await ethers.getContractFactory( - // "GitcoinIdentityStaking4", - // this.owner - // ); - // this.gitcoinIdentityStaking4 = await GitcoinIdentityStaking4.deploy(); - // await this.gitcoinIdentityStaking4 - // .connect(this.owner) - // .initialize(gtcAddress); - - // const GitcoinIdentityStaking5 = await ethers.getContractFactory( - // "GitcoinIdentityStaking5", - // this.owner - // ); - // this.gitcoinIdentityStaking5 = await GitcoinIdentityStaking5.deploy(); - // await this.gitcoinIdentityStaking5 - // .connect(this.owner) - // .initialize(gtcAddress); - - // const GitcoinIdentityStaking6 = await ethers.getContractFactory( - // "GitcoinIdentityStaking6", - // this.owner - // ); - // this.gitcoinIdentityStaking6 = await GitcoinIdentityStaking6.deploy(); - // await this.gitcoinIdentityStaking6 - // .connect(this.owner) - // .initialize(gtcAddress); - - // const GitcoinIdentityStaking7 = await ethers.getContractFactory( - // "GitcoinIdentityStaking7", - // this.owner - // ); - // this.gitcoinIdentityStaking7 = await GitcoinIdentityStaking7.deploy(); - // await this.gitcoinIdentityStaking7 - // .connect(this.owner) - // .initialize(gtcAddress); - - // const GitcoinIdentityStaking8 = await ethers.getContractFactory( - // "GitcoinIdentityStaking8", - // this.owner - // ); - // this.gitcoinIdentityStaking8 = await GitcoinIdentityStaking8.deploy(); - // await this.gitcoinIdentityStaking8 - // .connect(this.owner) - // .initialize(gtcAddress); - - // const GitcoinIdentityStaking10 = await ethers.getContractFactory( - // "GitcoinIdentityStaking10", - // this.owner - // ); - // this.gitcoinIdentityStaking10 = await GitcoinIdentityStaking10.deploy(); - // await this.gitcoinIdentityStaking10 - // .connect(this.owner) - // .initialize(gtcAddress); - - // const GitcoinIdentityStaking11 = await ethers.getContractFactory( - // "GitcoinIdentityStaking11", - // this.owner - // ); - // this.gitcoinIdentityStaking11 = await GitcoinIdentityStaking11.deploy(); - // await this.gitcoinIdentityStaking11 - // .connect(this.owner) - // .initialize(gtcAddress); - - // const GitcoinIdentityStaking12 = await ethers.getContractFactory( - // "GitcoinIdentityStaking12", - // this.owner - // ); - // this.gitcoinIdentityStaking12 = await GitcoinIdentityStaking12.deploy(); - // await this.gitcoinIdentityStaking12 - // .connect(this.owner) - // .initialize(gtcAddress); - - // const GitcoinIdentityStaking13 = await ethers.getContractFactory( - // "GitcoinIdentityStaking13", - // this.owner - // ); - // this.gitcoinIdentityStaking13 = await GitcoinIdentityStaking13.deploy(); - // await this.gitcoinIdentityStaking13 - // .connect(this.owner) - // .initialize(gtcAddress); + .initialize(gtcAddress, "0x0000000000000000000000000000000000000001"); for (let i = 0; i < this.userAccounts.length; i++) { await this.gtc @@ -139,46 +71,34 @@ describe("GitcoinIdentityStaking", function () { } }); - it.only("self stake gas tests", async function () { - const userAccounts = this.userAccounts.slice(0, 200); + it("gas tests", async function () { + // const numUsers = 200; + const numUsers = 20; + const userAccounts = this.userAccounts.slice(0, numUsers); await Promise.all( - [ - this.gitcoinIdentityStaking - // this.gitcoinIdentityStaking2, - // this.gitcoinIdentityStaking3, - // this.gitcoinIdentityStaking4 - // this.gitcoinIdentityStaking5, - // this.gitcoinIdentityStaking6, - // this.gitcoinIdentityStaking7, - // this.gitcoinIdentityStaking8 - // this.gitcoinIdentityStaking10, - // this.gitcoinIdentityStaking11, - // this.gitcoinIdentityStaking12 - // this.gitcoinIdentityStaking13 - ].map(async (gitcoinIdentityStaking: any) => { + [this.gitcoinIdentityStaking].map(async (gitcoinIdentityStaking: any) => { gitcoinIdentityStaking.grantRole( await gitcoinIdentityStaking.SLASHER_ROLE(), this.owner.address ); - gitcoinIdentityStaking.grantRole( - await gitcoinIdentityStaking.BURNER_ROLE(), - this.owner.address - ); gitcoinIdentityStaking.grantRole( await gitcoinIdentityStaking.RELEASER_ROLE(), this.owner.address ); - const slashAddresses: { staker: string; stakee: string }[] = []; + const unlockTime = Math.floor(new Date().getTime() / 1000) + 1000; await Promise.all( userAccounts.map(async (userAccount: any, accountIdx: number) => { + // This changes the order of the transactions + // which can affect gas. Randomizing to get an + // average gas cost. for (const func of shuffleArray([ () => gitcoinIdentityStaking .connect(userAccount) - .selfStake(100000, 1703165387), + .selfStake(100000, unlockTime), () => gitcoinIdentityStaking @@ -186,7 +106,7 @@ describe("GitcoinIdentityStaking", function () { .communityStake( this.userAccounts[accountIdx + 1], 100000, - 1703165387 + unlockTime + 1000 ), () => @@ -197,28 +117,11 @@ describe("GitcoinIdentityStaking", function () { accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 ], 100000, - 1703165387 + unlockTime + 2000 ) ])) { await func(); } - slashAddresses.push( - { - staker: userAccount.address, - stakee: userAccount.address - }, - { - staker: userAccount.address, - stakee: this.userAccounts[accountIdx + 1].address - }, - { - staker: userAccount.address, - stakee: - this.userAccounts[ - accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 - ].address - } - ); }) ); @@ -226,84 +129,363 @@ describe("GitcoinIdentityStaking", function () { let slashMembers: any[][] = []; await Promise.all( - userAccounts.slice(0, 60).map(async (userAccount: any) => { - const stakeId = await gitcoinIdentityStaking.selfStakeIds( - userAccount.address, - 0 - ); - const amount = (await gitcoinIdentityStaking.stakes(stakeId))[0]; - slashMembers.push([userAccount.address, amount]); - stakeIds.push(stakeId); - }) + userAccounts + .slice(0, Math.floor((numUsers * 3) / 10)) + .map(async (userAccount: any) => { + const stakeId = await gitcoinIdentityStaking.selfStakeIds( + userAccount.address, + 0 + ); + const amount = (await gitcoinIdentityStaking.stakes(stakeId))[0]; + slashMembers.push([userAccount.address, amount]); + stakeIds.push(stakeId); + }) ); slashMembers = slashMembers.sort((a, b) => (a[0] < b[0] ? -1 : 1)); - const slashProof = ethers.keccak256( - ethers.AbiCoder.defaultAbiCoder().encode( - [ - { - type: "tuple[]", - name: "SlashMember", - components: [ - { - name: "account", - type: "address", - baseType: "address" - }, - { - name: "amount", - type: "uint192", - baseType: "uint192" - } - ] - } - ], - [slashMembers] - ) - ); + const slashNonce = keccak256(Buffer.from(Math.random().toString())); + + const slashProof = makeSlashProof(slashMembers, slashNonce); await gitcoinIdentityStaking .connect(this.owner) .slash(stakeIds, 50, slashProof); - const indexToRelease = 1; - await gitcoinIdentityStaking .connect(this.owner) - .release(slashMembers, indexToRelease, 500, slashProof); - - slashMembers[indexToRelease][1] -= BigInt(500); - - const newSlashProof = ethers.keccak256( - ethers.AbiCoder.defaultAbiCoder().encode( - [ - { - type: "tuple[]", - name: "SlashMember", - components: [ - { - name: "account", - type: "address", - baseType: "address" - }, - { - name: "amount", - type: "uint192", - baseType: "uint192" - } - ] - } - ], - [slashMembers] - ) - ); + .release( + slashMembers, + 1, + 500, + slashProof, + slashNonce, + ethers.keccak256(Buffer.from(Math.random().toString())) + ); - await gitcoinIdentityStaking - .connect(this.owner) - .release(slashMembers, 2, 1000, newSlashProof); + await time.increase(60 * 60 * 24 * 91); await gitcoinIdentityStaking.connect(this.owner).burn(); }) ); }).timeout(1000000); + + it("should reject burns too close together", async function () { + await time.increase(60 * 60 * 24 * 91); + await this.gitcoinIdentityStaking.connect(this.owner).burn(); + await expect( + this.gitcoinIdentityStaking.connect(this.owner).burn() + ).to.be.revertedWithCustomError( + this.gitcoinIdentityStaking, + "MinimumBurnRoundDurationNotMet" + ); + }); + + describe("failed stake tests", function () { + it("should reject self stake with invalid unlock time", async function () { + const unlockTime = Math.floor(new Date().getTime() / 1000) - 1000; + + await expect( + this.gitcoinIdentityStaking + .connect(this.userAccounts[0]) + .selfStake(100000, unlockTime) + ).to.be.revertedWithCustomError( + this.gitcoinIdentityStaking, + "UnlockTimeMustBeInTheFuture" + ); + }); + + it("should reject community stake with invalid unlock time", async function () { + const unlockTime = Math.floor(new Date().getTime() / 1000) - 1000; + + await expect( + this.gitcoinIdentityStaking + .connect(this.userAccounts[0]) + .communityStake(this.userAccounts[1], 100000, unlockTime) + ).to.be.revertedWithCustomError( + this.gitcoinIdentityStaking, + "UnlockTimeMustBeInTheFuture" + ); + }); + + it("should reject self stake with amount 0", async function () { + const unlockTime = Math.floor(new Date().getTime() / 1000) + 1000000000; + + await expect( + this.gitcoinIdentityStaking + .connect(this.userAccounts[0]) + .selfStake(0, unlockTime) + ).to.be.revertedWithCustomError( + this.gitcoinIdentityStaking, + "AmountMustBeGreaterThanZero" + ); + }); + + it("should reject community stake with amount 0", async function () { + const unlockTime = Math.floor(new Date().getTime() / 1000) + 1000000000; + + await expect( + this.gitcoinIdentityStaking + .connect(this.userAccounts[0]) + .communityStake(this.userAccounts[1], 0, unlockTime) + ).to.be.revertedWithCustomError( + this.gitcoinIdentityStaking, + "AmountMustBeGreaterThanZero" + ); + }); + + it("should reject community stake on self", async function () { + const unlockTime = Math.floor(new Date().getTime() / 1000) + 1000000000; + + await expect( + this.gitcoinIdentityStaking + .connect(this.userAccounts[0]) + .communityStake(this.userAccounts[0], 100000, unlockTime) + ).to.be.revertedWithCustomError( + this.gitcoinIdentityStaking, + "CannotStakeOnSelf" + ); + }); + }); + + describe("standard tests", function () { + beforeEach(async function () { + const userAccounts = this.userAccounts.slice(0, 5); + this.gitcoinIdentityStaking.grantRole( + await this.gitcoinIdentityStaking.SLASHER_ROLE(), + this.owner.address + ); + this.gitcoinIdentityStaking.grantRole( + await this.gitcoinIdentityStaking.RELEASER_ROLE(), + this.owner.address + ); + + this.unlockDelay = 100000000; + + await Promise.all( + userAccounts.map(async (userAccount: any, accountIdx: number) => { + const unlockTime = + Math.floor(new Date().getTime() / 1000) + this.unlockDelay; + + await this.gitcoinIdentityStaking + .connect(userAccount) + .selfStake(100000, unlockTime); + await this.gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[accountIdx + 1], + 100000, + unlockTime + 1000 + ); + }) + ); + }); + + it("should slash stakes", async function () { + const stakeIds = [1, 2, 3]; + + const startingStakeAmount = ( + await this.gitcoinIdentityStaking.stakes(stakeIds[0]) + )[0]; + + await this.gitcoinIdentityStaking + .connect(this.owner) + .slash(stakeIds, 50, ethers.keccak256(Buffer.from("notARealProof"))); + + const afterSlashStakeAmount = ( + await this.gitcoinIdentityStaking.stakes(stakeIds[0]) + )[0]; + + expect(afterSlashStakeAmount).to.equal(startingStakeAmount / BigInt(2)); + expect(afterSlashStakeAmount).to.equal(BigInt(50000)); + + await this.gitcoinIdentityStaking + .connect(this.owner) + .slash(stakeIds, 80, ethers.keccak256(Buffer.from("anotherFakeProof"))); + + const afterDoubleSlashStakeAmount = ( + await this.gitcoinIdentityStaking.stakes(stakeIds[0]) + )[0]; + + expect(afterDoubleSlashStakeAmount).to.equal( + startingStakeAmount / BigInt(2) / BigInt(5) + ); + expect(afterDoubleSlashStakeAmount).to.equal(BigInt(10000)); + }); + + it("should reject slash with already used proof", async function () { + const stakeIds = [1, 2, 3]; + + const proof = ethers.keccak256(Buffer.from("notARealProof")); + + await this.gitcoinIdentityStaking + .connect(this.owner) + .slash(stakeIds, 50, proof); + + await expect( + this.gitcoinIdentityStaking + .connect(this.owner) + .slash(stakeIds, 50, proof) + ).to.be.revertedWithCustomError( + this.gitcoinIdentityStaking, + "SlashProofHashAlreadyUsed" + ); + }); + + describe("with valid slashMembers", function () { + beforeEach(async function () { + const stakeIds: number[] = []; + let slashMembers: any[][] = []; + + await Promise.all( + this.userAccounts + .slice(0, 3) + .map(async (userAccount: any, index: number) => { + const selfStakeId = + await this.gitcoinIdentityStaking.selfStakeIds( + userAccount.address, + 0 + ); + const selfStakeAmount = ( + await this.gitcoinIdentityStaking.stakes(selfStakeId) + )[0]; + + slashMembers.push([userAccount.address, selfStakeAmount]); + stakeIds.push(selfStakeId); + + const communityStakeId = + await this.gitcoinIdentityStaking.communityStakeIds( + userAccount.address, + this.userAccounts[index + 1].address, + 0 + ); + + const communityStakeAmount = ( + await this.gitcoinIdentityStaking.stakes(communityStakeId) + )[0]; + + slashMembers.push([ + this.userAccounts[index + 1].address, + communityStakeAmount + ]); + stakeIds.push(communityStakeId); + }) + ); + + slashMembers = slashMembers.sort((a, b) => (a[0] < b[0] ? -1 : 1)); + + this.slashMembers = slashMembers; + this.stakeIds = stakeIds; + this.slashNonce = keccak256(Buffer.from(Math.random().toString())); + this.slashProof = makeSlashProof(this.slashMembers, this.slashNonce); + }); + + it("should release given a valid proof", async function () { + await this.gitcoinIdentityStaking + .connect(this.owner) + .slash(this.stakeIds, 50, this.slashProof); + + const indexToRelease = 1; + + const newNonce = keccak256(Buffer.from(Math.random().toString())); + + await this.gitcoinIdentityStaking + .connect(this.owner) + .release( + this.slashMembers, + indexToRelease, + 500, + this.slashProof, + this.slashNonce, + newNonce + ); + + this.slashMembers[indexToRelease][1] -= BigInt(500); + + const newSlashProof = makeSlashProof(this.slashMembers, newNonce); + + await this.gitcoinIdentityStaking + .connect(this.owner) + .release( + this.slashMembers, + 2, + 1000, + newSlashProof, + newNonce, + keccak256(Buffer.from(Math.random().toString())) + ); + }); + + it("should reject release with an invalid proof", async function () { + await this.gitcoinIdentityStaking + .connect(this.owner) + .slash(this.stakeIds, 50, this.slashProof); + + [this.slashMembers[0], this.slashMembers[1]] = [ + this.slashMembers[1], + this.slashMembers[0] + ]; + + await expect( + this.gitcoinIdentityStaking + .connect(this.owner) + .release( + this.slashMembers, + 1, + 500, + this.slashProof, + this.slashNonce, + keccak256(Buffer.from(Math.random().toString())) + ) + ).to.be.revertedWithCustomError( + this.gitcoinIdentityStaking, + "SlashProofHashNotValid" + ); + }); + + it("should reject release for too high of an amount", async function () { + await this.gitcoinIdentityStaking + .connect(this.owner) + .slash(this.stakeIds, 50, this.slashProof); + + const indexToRelease = 1; + + await expect( + this.gitcoinIdentityStaking + .connect(this.owner) + .release( + this.slashMembers, + indexToRelease, + this.slashMembers[indexToRelease][1] + BigInt(1), + this.slashProof, + this.slashNonce, + keccak256(Buffer.from(Math.random().toString())) + ) + ).to.be.revertedWithCustomError( + this.gitcoinIdentityStaking, + "FundsNotAvailableToRelease" + ); + }); + }); + + it("should reject release with an unregistered proof", async function () { + const slashNonce = keccak256(Buffer.from(Math.random().toString())); + const slashProof = keccak256(Buffer.from("notARealProof")); + + await expect( + this.gitcoinIdentityStaking + .connect(this.owner) + .release( + [], + 1, + 500, + slashProof, + slashNonce, + ethers.keccak256(Buffer.from(Math.random().toString())) + ) + ).to.be.revertedWithCustomError( + this.gitcoinIdentityStaking, + "SlashProofHashNotFound" + ); + }); + }); }); From e8a0dcc74db759aeba91294a52480a6b729fc224 Mon Sep 17 00:00:00 2001 From: schultztimothy Date: Wed, 20 Dec 2023 15:18:44 -0700 Subject: [PATCH 11/18] chore: resolved conflicts --- contracts/GitcoinIdentityStaking.sol | 65 +++++++++++++++++++++------- package.json | 2 +- test/GitcoinIdentityStaking.ts | 64 +++++++++++++++++++++++++++ yarn.lock | 8 ++-- 4 files changed, 118 insertions(+), 21 deletions(-) diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index ee702db..2ea6e37 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -32,6 +32,8 @@ contract GitcoinIdentityStaking is error UnlockTimeMustBeInTheFuture(); error CannotStakeOnSelf(); error FailedTransfer(); + error InvalidLockTime(); + error StakeIsLocked(); bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); bytes32 public constant RELEASER_ROLE = keccak256("RELEASER_ROLE"); @@ -86,7 +88,10 @@ contract GitcoinIdentityStaking is GTC public gtc; - function initialize(address gtcAddress, address _burnAddress) public initializer { + function initialize( + address gtcAddress, + address _burnAddress + ) public initializer { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); __AccessControl_init(); @@ -98,49 +103,75 @@ contract GitcoinIdentityStaking is lastBurnTimestamp = block.timestamp; } - function selfStake(uint192 amount, uint64 unlockTime) external { - if (unlockTime < block.timestamp) { - revert UnlockTimeMustBeInTheFuture(); - } + function selfStake(uint192 amount, uint64 duration) external { + // revert if amount is 0. Since this value is unsigned integer if (amount == 0) { revert AmountMustBeGreaterThanZero(); } + uint64 unlockTime = duration + uint64(block.timestamp); + + if ( + unlockTime < block.timestamp + 12 weeks || + unlockTime > block.timestamp + 104 weeks + ) { + revert InvalidLockTime(); + } + uint256 stakeId = ++stakeCount; stakes[stakeId].amount = amount; + // double check conversion stakes[stakeId].unlockTime = unlockTime; selfStakeIds[msg.sender].push(stakeId); - if(!gtc.transferFrom(msg.sender, address(this), amount)) { + if (!gtc.transferFrom(msg.sender, address(this), amount)) { revert FailedTransfer(); } emit SelfStake(stakeId, msg.sender, amount, unlockTime); } + function withdrawSelfStake(uint256 stakeId) external { + if (stakes[stakeId].unlockTime < block.timestamp) { + revert StakeIsLocked(); + } + + uint192 amount = stakes[stakeId].amount; + + delete stakes[stakeId]; + + gtc.transfer(msg.sender, amount); + } + function communityStake( address stakee, uint192 amount, - uint64 unlockTime + uint64 duration ) external { - if (unlockTime < block.timestamp) { - revert UnlockTimeMustBeInTheFuture(); + if (stakee == msg.sender) { + revert CannotStakeOnSelf(); } if (amount == 0) { revert AmountMustBeGreaterThanZero(); } - if (stakee == msg.sender) { - revert CannotStakeOnSelf(); + + uint64 unlockTime = duration + uint64(block.timestamp); + + if ( + unlockTime < block.timestamp + 12 weeks || + unlockTime > block.timestamp + 104 weeks + ) { + revert InvalidLockTime(); } uint256 stakeId = ++stakeCount; stakes[stakeId].amount = amount; - stakes[stakeId].unlockTime = unlockTime; + stakes[stakeId].unlockTime = uint64(unlockTime); communityStakeIds[msg.sender][stakee].push(stakeId); - if(!gtc.transferFrom(msg.sender, address(this), amount)) { + if (!gtc.transferFrom(msg.sender, address(this), amount)) { revert FailedTransfer(); } @@ -191,7 +222,7 @@ contract GitcoinIdentityStaking is uint192 amountToBurn = totalSlashed[currentSlashRound - 1]; if (amountToBurn > 0) { - if(!gtc.transfer(burnAddress, amountToBurn)) { + if (!gtc.transfer(burnAddress, amountToBurn)) { revert FailedTransfer(); } } @@ -234,12 +265,14 @@ contract GitcoinIdentityStaking is newSlashMembers[slashMemberIndex].amount -= amountToRelease; - bytes32 newSlashProofHash = keccak256(abi.encode(newSlashMembers, newNonce)); + bytes32 newSlashProofHash = keccak256( + abi.encode(newSlashMembers, newNonce) + ); slashProofHashes[slashProofHash] = false; slashProofHashes[newSlashProofHash] = true; - if(!gtc.transfer(slashMemberToRelease.account, amountToRelease)) { + if (!gtc.transfer(slashMemberToRelease.account, amountToRelease)) { revert FailedTransfer(); } } diff --git a/package.json b/package.json index a28bbb3..ca55aaa 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "@ethereum-attestation-service/eas-contracts": "^1.3.1", "@ethereum-attestation-service/eas-sdk": "^0.29.1", "@nomicfoundation/hardhat-chai-matchers": "^2.0.1", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.10", "@nomicfoundation/hardhat-toolbox": "^3.0.0", "@nomiclabs/hardhat-etherscan": "^3.0.0", "@openzeppelin/hardhat-upgrades": "^2.0.1", diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index 8e9625b..5780c63 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -488,4 +488,68 @@ describe("GitcoinIdentityStaking", function () { ); }); }); + const fiveMinutes = 5 * 60; + const twelveWeeksInSeconds = 12 * 7 * 24 * 60 * 60 + 1; // 12 weeks in seconds + describe.only("Self and Community Staking", function () { + it("should allow self staking", async function () { + const fiveMinutes = 5 * 60; // 5 minutes in seconds + const unlockTime = + twelveWeeksInSeconds + Math.floor(new Date().getTime() / 1000); + await this.gitcoinIdentityStaking + .connect(this.userAccounts[0]) + .selfStake(100000n, twelveWeeksInSeconds); + + const userStake = await this.gitcoinIdentityStaking.selfStakeIds( + this.userAccounts[0], + 0 + ); + + const stake = await this.gitcoinIdentityStaking.stakes(userStake); + + expect(stake[0]).to.deep.equal(100000n); + expect(stake[1]).to.be.closeTo(unlockTime, fiveMinutes); + }); + it("should allow withdrawal of self stake", async function () { + await this.gitcoinIdentityStaking + .connect(this.userAccounts[0]) + .selfStake(100000n, twelveWeeksInSeconds); + await time.increaseTo( + twelveWeeksInSeconds + Math.floor(new Date().getTime() / 1000) + ); + + await this.gitcoinIdentityStaking + .connect(this.userAccounts[0]) + .withdrawSelfStake(1); + }); + it("should allow community staking", async function () { + const unlockTime = + twelveWeeksInSeconds + Math.floor(new Date().getTime() / 1000); + await this.gitcoinIdentityStaking + .connect(this.userAccounts[0]) + .communityStake(this.userAccounts[1], 100000n, twelveWeeksInSeconds); + const communityStake = + await this.gitcoinIdentityStaking.communityStakeIds( + this.userAccounts[0], + this.userAccounts[1], + 0 + ); + + const stake = await this.gitcoinIdentityStaking.stakes(communityStake); + + expect(stake[0]).to.deep.equal(100000n); + expect(stake[1]).to.be.closeTo(unlockTime, fiveMinutes); + }); + it("should allow withdrawal of self stake", async function () { + await this.gitcoinIdentityStaking + .connect(this.userAccounts[0]) + .selfStake(100000n, twelveWeeksInSeconds); + await time.increaseTo( + twelveWeeksInSeconds + Math.floor(new Date().getTime() / 1000) + ); + + await this.gitcoinIdentityStaking + .connect(this.userAccounts[0]) + .withdrawSelfStake(1); + }); + }); }); diff --git a/yarn.lock b/yarn.lock index a8fe8ff..5cd7a4a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -830,10 +830,10 @@ debug "^4.1.1" lodash.isequal "^4.5.0" -"@nomicfoundation/hardhat-network-helpers@^1.0.0": - version "1.0.8" - resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz" - integrity sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q== +"@nomicfoundation/hardhat-network-helpers@^1.0.10": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.10.tgz#c61042ceb104fdd6c10017859fdef6529c1d6585" + integrity sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ== dependencies: ethereumjs-util "^7.1.4" From eab4f33fe8251c7ce7cba804536b4669f0ca2424 Mon Sep 17 00:00:00 2001 From: Lucian Hymer Date: Wed, 20 Dec 2023 15:38:25 -0700 Subject: [PATCH 12/18] fix tests after merge --- test/GitcoinIdentityStaking.ts | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index 5780c63..81cc987 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -11,6 +11,9 @@ function shuffleArray(array: any[]) { return array; } +const fiveMinutes = 5 * 60; +const twelveWeeksInSeconds = 12 * 7 * 24 * 60 * 60 + 1; // 12 weeks in seconds + function makeSlashProof(slashMembers: any[][], slashNonce: string) { const slashProof = ethers.keccak256( ethers.AbiCoder.defaultAbiCoder().encode( @@ -87,8 +90,6 @@ describe("GitcoinIdentityStaking", function () { this.owner.address ); - const unlockTime = Math.floor(new Date().getTime() / 1000) + 1000; - await Promise.all( userAccounts.map(async (userAccount: any, accountIdx: number) => { // This changes the order of the transactions @@ -98,7 +99,7 @@ describe("GitcoinIdentityStaking", function () { () => gitcoinIdentityStaking .connect(userAccount) - .selfStake(100000, unlockTime), + .selfStake(100000, twelveWeeksInSeconds), () => gitcoinIdentityStaking @@ -106,7 +107,7 @@ describe("GitcoinIdentityStaking", function () { .communityStake( this.userAccounts[accountIdx + 1], 100000, - unlockTime + 1000 + twelveWeeksInSeconds ), () => @@ -117,7 +118,7 @@ describe("GitcoinIdentityStaking", function () { accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 ], 100000, - unlockTime + 2000 + twelveWeeksInSeconds ) ])) { await func(); @@ -190,7 +191,7 @@ describe("GitcoinIdentityStaking", function () { .selfStake(100000, unlockTime) ).to.be.revertedWithCustomError( this.gitcoinIdentityStaking, - "UnlockTimeMustBeInTheFuture" + "InvalidLockTime" ); }); @@ -203,7 +204,7 @@ describe("GitcoinIdentityStaking", function () { .communityStake(this.userAccounts[1], 100000, unlockTime) ).to.be.revertedWithCustomError( this.gitcoinIdentityStaking, - "UnlockTimeMustBeInTheFuture" + "InvalidLockTime" ); }); @@ -259,22 +260,17 @@ describe("GitcoinIdentityStaking", function () { this.owner.address ); - this.unlockDelay = 100000000; - await Promise.all( userAccounts.map(async (userAccount: any, accountIdx: number) => { - const unlockTime = - Math.floor(new Date().getTime() / 1000) + this.unlockDelay; - await this.gitcoinIdentityStaking .connect(userAccount) - .selfStake(100000, unlockTime); + .selfStake(100000, twelveWeeksInSeconds); await this.gitcoinIdentityStaking .connect(userAccount) .communityStake( this.userAccounts[accountIdx + 1], 100000, - unlockTime + 1000 + twelveWeeksInSeconds ); }) ); @@ -488,9 +484,8 @@ describe("GitcoinIdentityStaking", function () { ); }); }); - const fiveMinutes = 5 * 60; - const twelveWeeksInSeconds = 12 * 7 * 24 * 60 * 60 + 1; // 12 weeks in seconds - describe.only("Self and Community Staking", function () { + + describe.skip("Self and Community Staking", function () { it("should allow self staking", async function () { const fiveMinutes = 5 * 60; // 5 minutes in seconds const unlockTime = From 68c16be610271595438e771ed703028082fd3b8a Mon Sep 17 00:00:00 2001 From: schultztimothy Date: Wed, 20 Dec 2023 16:09:17 -0700 Subject: [PATCH 13/18] fix: reset time manipulation after tests --- contracts/GitcoinIdentityStaking.sol | 1 - test/GitcoinIdentityStaking.ts | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index 2ea6e37..f6cb342 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -120,7 +120,6 @@ contract GitcoinIdentityStaking is uint256 stakeId = ++stakeCount; stakes[stakeId].amount = amount; - // double check conversion stakes[stakeId].unlockTime = unlockTime; selfStakeIds[msg.sender].push(stakeId); diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index 81cc987..3ea3063 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -1,6 +1,6 @@ import { expect } from "chai"; import { ethers } from "hardhat"; -import { time } from "@nomicfoundation/hardhat-network-helpers"; +import { time, reset } from "@nomicfoundation/hardhat-network-helpers"; import { keccak256 } from "ethers"; function shuffleArray(array: any[]) { @@ -45,6 +45,7 @@ function makeSlashProof(slashMembers: any[][], slashNonce: string) { describe("GitcoinIdentityStaking", function () { this.beforeEach(async function () { + await reset(); const [ownerAccount, ...userAccounts] = await ethers.getSigners(); this.owner = ownerAccount; @@ -485,7 +486,7 @@ describe("GitcoinIdentityStaking", function () { }); }); - describe.skip("Self and Community Staking", function () { + describe("Self and Community Staking", function () { it("should allow self staking", async function () { const fiveMinutes = 5 * 60; // 5 minutes in seconds const unlockTime = From 6d9e960b9a106c9447c84c6e5ba4d64e055fed1e Mon Sep 17 00:00:00 2001 From: schultztimothy Date: Wed, 20 Dec 2023 20:57:46 -0700 Subject: [PATCH 14/18] ownership checks --- contracts/GitcoinIdentityStaking.sol | 66 ++++++++++++++++++++++++++++ test/GitcoinIdentityStaking.ts | 14 ++++++ 2 files changed, 80 insertions(+) diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index f6cb342..1acf06d 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -34,6 +34,7 @@ contract GitcoinIdentityStaking is error FailedTransfer(); error InvalidLockTime(); error StakeIsLocked(); + error NotOwnerOfStake(); bytes32 public constant SLASHER_ROLE = keccak256("SLASHER_ROLE"); bytes32 public constant RELEASER_ROLE = keccak256("RELEASER_ROLE"); @@ -78,6 +79,19 @@ contract GitcoinIdentityStaking is uint64 unlockTime ); + event SelfStakeWithdrawn( + uint256 indexed id, + address indexed staker, + uint192 amount + ); + + event CommunityStakeWithdrawn( + uint256 indexed id, + address indexed staker, + address indexed stakee, + uint192 amount + ); + event Slash( address indexed slasher, uint64 slashedPercent, @@ -131,16 +145,36 @@ contract GitcoinIdentityStaking is emit SelfStake(stakeId, msg.sender, amount, unlockTime); } + function ownerOfStake(address staker, uint value) public view returns (bool) { + uint[] memory currentStakes = selfStakeIds[staker]; + for (uint i = 0; i < currentStakes.length; i++) { + if (currentStakes[i] == value) { + return true; + } + } + return false; + } + function withdrawSelfStake(uint256 stakeId) external { + if (!ownerOfStake(msg.sender, stakeId)) { + revert NotOwnerOfStake(); + } + if (stakes[stakeId].unlockTime < block.timestamp) { revert StakeIsLocked(); } + if (selfStakeIds[msg.sender].length == 0) { + revert CannotStakeOnSelf(); + } + uint192 amount = stakes[stakeId].amount; delete stakes[stakeId]; gtc.transfer(msg.sender, amount); + + emit SelfStakeWithdrawn(stakeId, msg.sender, amount); } function communityStake( @@ -177,6 +211,38 @@ contract GitcoinIdentityStaking is emit CommunityStake(stakeId, msg.sender, stakee, amount, unlockTime); } + function ownerOfCommunityStake( + address staker, + address stakee, + uint value + ) public view returns (bool) { + uint[] memory currentStakes = communityStakeIds[staker][stakee]; + for (uint i = 0; i < currentStakes.length; i++) { + if (currentStakes[i] == value) { + return true; + } + } + return false; + } + + function withdrawCommunityStake(address stakee, uint256 stakeId) external { + if (!ownerOfCommunityStake(msg.sender, stakee, stakeId)) { + revert NotOwnerOfStake(); + } + + if (stakes[stakeId].unlockTime < block.timestamp) { + revert StakeIsLocked(); + } + + uint192 amount = stakes[stakeId].amount; + + delete stakes[stakeId]; + + gtc.transfer(msg.sender, amount); + + emit SelfStakeWithdrawn(stakeId, msg.sender, amount); + } + function slash( uint256[] calldata stakeIds, uint64 slashedPercent, diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index 3ea3063..43501ff 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -547,5 +547,19 @@ describe("GitcoinIdentityStaking", function () { .connect(this.userAccounts[0]) .withdrawSelfStake(1); }); + // it("should not allow withdrawal of self stake before unlock time", async function () { + // await this.gitcoinIdentityStaking + // .connect(this.userAccounts[0]) + // .selfStake(100000n, twelveWeeksInSeconds); + // await time.increaseTo(10000 + Math.floor(new Date().getTime() / 1000)); + // await expect( + // this.gitcoinIdentityStaking + // .connect(this.userAccounts[0]) + // .withdrawSelfStake(1) + // ).to.be.revertedWithCustomError( + // this.gitcoinIdentityStaking, + // "StakeIsLocked" + // ); + // }); }); }); From ec689567aad60cd85a54a3e1d9e462bda9f47df8 Mon Sep 17 00:00:00 2001 From: schultztimothy Date: Fri, 22 Dec 2023 16:53:51 -0700 Subject: [PATCH 15/18] feat: slash using merkle proof --- contracts/GitcoinIdentityStaking.sol | 38 +++-- package.json | 1 + slashMerkleTree.json | 1 + test/GitcoinIdentityStaking.ts | 1 + test/GitcoinIdentityStakingMerkle.ts | 229 +++++++++++++++++++++++++++ yarn.lock | 10 +- 6 files changed, 264 insertions(+), 16 deletions(-) create mode 100644 slashMerkleTree.json create mode 100644 test/GitcoinIdentityStakingMerkle.ts diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index 1acf06d..7aaa280 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -7,6 +7,8 @@ import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; import {GTC} from "./mocks/GTC.sol"; +import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; + import "hardhat/console.sol"; /** @@ -64,6 +66,11 @@ contract GitcoinIdentityStaking is // Used to permit unfreeze mapping(bytes32 => bool) public slashProofHashes; + mapping(bytes32 => bool) public slashMerkleRoots; + mapping(bytes32 => uint192) public slashTotals; + + bytes32 public slashMerkleRoot; + event SelfStake( uint256 indexed id, address indexed staker, @@ -94,8 +101,8 @@ contract GitcoinIdentityStaking is event Slash( address indexed slasher, - uint64 slashedPercent, - bytes32 slashProofHash + bytes32 slashProofHash, + uint192 slashAmount ); event Burn(uint256 indexed round, uint192 amount); @@ -243,27 +250,28 @@ contract GitcoinIdentityStaking is emit SelfStakeWithdrawn(stakeId, msg.sender, amount); } + error InvalidSlashProof(); + function slash( - uint256[] calldata stakeIds, - uint64 slashedPercent, - bytes32 slashProofHash + bytes32 slashMerkleRoot, + uint192 slashTotal, + bytes32[] memory slashTotalProof ) external onlyRole(SLASHER_ROLE) { - if (slashProofHashes[slashProofHash]) { + if (slashMerkleRoots[slashMerkleRoot]) { revert SlashProofHashAlreadyUsed(); } - uint256 numStakes = stakeIds.length; - - for (uint256 i = 0; i < numStakes; i++) { - uint256 stakeId = stakeIds[i]; - uint192 slashedAmount = (slashedPercent * stakes[stakeId].amount) / 100; - totalSlashed[currentSlashRound] += slashedAmount; - stakes[stakeId].amount -= slashedAmount; + bytes32 leaf = keccak256( + bytes.concat(keccak256(abi.encode(address(0), slashTotal, uint192(0)))) + ); + if (!MerkleProof.verify(slashTotalProof, slashMerkleRoot, leaf)) { + revert InvalidSlashProof(); } - slashProofHashes[slashProofHash] = true; + slashMerkleRoots[slashMerkleRoot] = true; + slashTotals[slashMerkleRoot] = slashTotal; - emit Slash(msg.sender, slashedPercent, slashProofHash); + emit Slash(msg.sender, slashMerkleRoot, slashTotal); } // Burn last round and start next round (locking this round) diff --git a/package.json b/package.json index ca55aaa..2c906ac 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@nomicfoundation/hardhat-verify": "^1.0.4", "@openzeppelin/contracts": "^4.8.2", "@openzeppelin/contracts-upgradeable": "^4.9.2", + "@openzeppelin/merkle-tree": "^1.0.5", "@openzeppelin/upgrades-core": "^1.27.3", "@typechain/ethers-v6": "^0.4.0", "ethers": "^6.6.3", diff --git a/slashMerkleTree.json b/slashMerkleTree.json new file mode 100644 index 0000000..4643cc1 --- /dev/null +++ b/slashMerkleTree.json @@ -0,0 +1 @@ +{"format":"standard-v1","tree":["0x4f877cffb2709592deca3a72a33440484a64095fe0d09c5f87ee8622fc96718a","0x8be1224c703767fee1beb186ffe08e72b529757dfd6308df1f530c1fd7814390","0x5ad71921b3aeca509e281b90615a929601cad9595c341b36ea281d076e03bad5","0xddf6422d67bf41ea9468d58bcf3bd3ad0909dfd16041101a38e961470e0e909a","0xa4337c634a57c9aa1a77a9c7a13f32ac379d01b9b761fc6d84f8263ff61e5586","0x06c6d7db9e9b656aeb0c4b2d17e2a3b1d99aeb990a613f58e8833c30e5436c3c","0x54f7e48b4c09d22f942bb28788f347cb54efe793e64f65a6f5a97f5e73a8335f","0x193063e00117d8e22e9d0f2b7f61be2d05a799eefa443f92b61ee57576a19ef0","0xa351ca8e8eb29156f8a152efb71f5a9d7e6f1b8f467b95077b3edc748a6ac582","0x89aafbc9a9d5f5408663aaa162d3adf798216021f362a2a8ec8f0b52121e1574","0xe281568e4e77b4f0d09d2e247c6ecda7262a1124f393a14ede2f1760a10e4148","0xf3f80cb230960b6a4a2d66f2c48dc0bc272356282e36c5c6b94dc81c2e0e9a9e","0x95e486825ad565e024580b7fda1c5ef33dd74536ac51da0d9ba609710d00d902","0x11953ff786bce3e2a88108c7d566260f5c35df7fd462d439f918d829bcd90178","0xc8a25efc79d3df44fee547f0b62110662664fa9445713923aec803fbaf52c4ce","0xee287f1a95345fc35813e33e590fcf8eda6873881d0d68b017262b1b7bad5669","0xad9c800666f685b25183231ef3059f0714996e73ed506325b9f1691bc9416ca1","0x0a800c12ae6388dab4e5613543026e8dee883e5696597f3daf344e614ddd3d04","0x8a39e49fc4156ce309a5576bf6370cbfbaa15e1e077d17d895163212bd557faa","0xcbf5f82e7ed5bac466a00ca32c5c06de401ec2e2ead0c4493b52c03e9cdd4a7a","0xe0fde44d3a79e4eecf1cf4747047c87f45411750fb7de44f8071267e46f62ca5","0xca9596fd0de882c21968943eadbf7595a9a81ca049554275044411692179f72d","0xc87297026d3ae783196832019a3204f37bb975dc1f39c7e85189b6181993b671","0xc5f551333777b56475407ebdeed8ca04688a5c42d869b28cdadf7c3bac5ef04a","0xbaf858b434337fa7328ff3a8ef41176162d040857cec461907c4ee0066bcd965","0xba5e9e192770cf00f6c99f9d34a932ac7dfe432795a0a51c44b3f03baa57f428","0x9961b5a4d33dd9405b6b1c8b20494f1735c8b6368189f7d18b47804275613d8e","0x932a5f5383c6bde4cbe15f59519fcc8c394dc31a5306fe88e1df70ed862d696f","0x8b630b791e607962327da75209de2b7fc1ff35dc8fe584328e50761a7297d87f","0x8a9409fd67656ad4f293fe5de79b5909f7aa9e8e4431fda03f583d8e55d22a24","0x81b1bfdf32d35d2ac6f537d3d39d7d8c469d2f8233fe0b22802f520706b49356","0x699ed57b0eb389399b3754571a6b37034f4be7a35dd0487328fcdd2abbd82c9a","0x5efd71fecc81621162106db439d740683c6dafb70935dee6d2afdd0c315a0026","0x5021bafaa69301b1ec904b8765e6c971a36e8866f8f2b7fcf57edc54fc1fa503","0x3808c4c956a940f51d0d8bc8085d0b772d4031c281331ce1dc7f68db9329aaa3","0x372b0e66a371d035e9f444679e17831ccf2a0d52a2979d35a46f447cf4451b98","0x2d1d7f2e8dbace7f3b393d97cf46473f20aa91917454f00d8058b86a98fe2dfc","0x114d3aa1bd9b9205a0eb004d03dfa5ec12474119e890da1b2d580518c0a90415","0x068df22d64c10593baec852aaf59456c2b999f91c9d5ee300c2fd2540687248e","0x057f92e8be0df7960e634f8168e4c0bfdae3eb68b0c73cd4122692d8c2653dc4","0x0409608e419428f15b50adc8bd1283be789d74cda3eb0a6e247e6de3c3cb1dfb"],"values":[{"value":["0x0000000000000000000000000000000000000000","650000","0"],"treeIndex":38},{"value":["0x70997970C51812dc3A010C7d01b50e0d17dc79C8","0","43"],"treeIndex":28},{"value":["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC","0","44"],"treeIndex":35},{"value":["0x90F79bf6EB2c4f870365E785982E1f101E93b906","0","25"],"treeIndex":36},{"value":["0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65","0","46"],"treeIndex":30},{"value":["0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc","0","47"],"treeIndex":34},{"value":["0x976EA74026E726554dB657fA54763abd0C3a0aa9","0","28"],"treeIndex":33},{"value":["0x14dC79964da2C08b23698B3D3cc7Ca32193d9955","0","49"],"treeIndex":25},{"value":["0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f","0","30"],"treeIndex":20},{"value":["0xa0Ee7A142d267C1f36714E4a8F75612F20a79720","0","31"],"treeIndex":26},{"value":["0xBcd4042DE499D14e55001CcbB24a551F3b954096","0","32"],"treeIndex":21},{"value":["0x71bE63f3384f5fb98995898A86B02Fb2426c5788","0","53"],"treeIndex":32},{"value":["0xFABB0ac9d68B0B445fB7357272Ff202C5651694a","0","34"],"treeIndex":37},{"value":["0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec","0","1"],"treeIndex":40},{"value":["0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097","0","35"],"treeIndex":27},{"value":["0xcd3B766CCDd6AE721141F452C550Ca635964ce71","0","36"],"treeIndex":22},{"value":["0x2546BcD3c84621e976D8185a91A922aE77ECEc30","0","37"],"treeIndex":31},{"value":["0xbDA5747bFD65F08deb54cb465eB87D40e51B197E","0","38"],"treeIndex":39},{"value":["0xdD2FD4581271e230360230F9337D5c0430Bf44C0","0","2"],"treeIndex":23},{"value":["0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199","0","59"],"treeIndex":29},{"value":["0x09DB0a93B389bEF724429898f539AEB7ac2Dd55f","0","40"],"treeIndex":24}],"leafEncoding":["address","uint192","uint192"]} \ No newline at end of file diff --git a/test/GitcoinIdentityStaking.ts b/test/GitcoinIdentityStaking.ts index 43501ff..f05ff34 100644 --- a/test/GitcoinIdentityStaking.ts +++ b/test/GitcoinIdentityStaking.ts @@ -15,6 +15,7 @@ const fiveMinutes = 5 * 60; const twelveWeeksInSeconds = 12 * 7 * 24 * 60 * 60 + 1; // 12 weeks in seconds function makeSlashProof(slashMembers: any[][], slashNonce: string) { + debugger; const slashProof = ethers.keccak256( ethers.AbiCoder.defaultAbiCoder().encode( [ diff --git a/test/GitcoinIdentityStakingMerkle.ts b/test/GitcoinIdentityStakingMerkle.ts new file mode 100644 index 0000000..91cee60 --- /dev/null +++ b/test/GitcoinIdentityStakingMerkle.ts @@ -0,0 +1,229 @@ +import { expect } from "chai"; +import { ethers } from "hardhat"; +import { time, reset } from "@nomicfoundation/hardhat-network-helpers"; +import { keccak256 } from "ethers"; +import { StandardMerkleTree } from "@openzeppelin/merkle-tree"; +import { HardhatEthersSigner } from "@nomicfoundation/hardhat-ethers/signers"; +import fs from "fs"; +import { ZERO_ADDRESS } from "@ethereum-attestation-service/eas-sdk"; + +type StakeMember = { + address: string; + amount: string; + stakeId: number; +}; + +// https://github.com/OpenZeppelin/merkle-tree +const buildMerkleTree = ( + users: StakeMember[], + numUsers: number +): { + merkleRoot: string; + slashTotal: number; +} => { + const slashedUsers = []; + let slashTotal = 0; + const values: [string, string, string][] = users.map((user, i) => { + const shouldSlash = i > Math.floor((numUsers * 3) / 10); + let slashAmount = 0; + if (shouldSlash) { + slashedUsers.push(user); + slashAmount += Number(user.amount) / 2; + } + slashTotal += slashAmount; + return [ + user.address, + // if shouldSlash, Slash half of the users stake + shouldSlash ? BigInt(0).toString() : BigInt(slashAmount).toString(), + BigInt(user.stakeId).toString() + ]; + }); + + // Put slash total at the beginning of the merkle tree + values.unshift([ZERO_ADDRESS, BigInt(slashTotal).toString(), "0"]); + + const merkleTree = StandardMerkleTree.of(values, [ + "address", + "uint192", + "uint192" + ]); + + const merkleRoot = merkleTree.root; + + fs.writeFileSync("slashMerkleTree.json", JSON.stringify(merkleTree.dump())); + + return { merkleRoot, slashTotal }; +}; + +const getMerkleProof = (address: string) => { + const merkleTree = StandardMerkleTree.load( + JSON.parse(fs.readFileSync("slashMerkleTree.json", "utf8")) + ); + + let proof: any = null; + for (const [i, v] of merkleTree.entries()) { + if (v[0] === address) { + // (3) + proof = merkleTree.getProof(i); + console.log("Value:", v); + console.log("Proof:", proof); + } + } + + return proof; +}; + +function shuffleArray(array: any[]) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array; +} + +const fiveMinutes = 5 * 60; +const twelveWeeksInSeconds = 12 * 7 * 24 * 60 * 60 + 1; // 12 weeks in seconds + +describe.only("GitcoinIdentityStaking Merkle Slashing", function () { + this.beforeEach(async function () { + await reset(); + const [ownerAccount, ...userAccounts] = await ethers.getSigners(); + + this.owner = ownerAccount; + this.userAccounts = userAccounts; + + const GTC = await ethers.getContractFactory("GTC", this.owner); + this.gtc = await GTC.deploy( + this.owner.address, + this.owner.address, + Math.floor(new Date().getTime() / 1000) + 4 + ); + const gtcAddress = await this.gtc.getAddress(); + + const GitcoinIdentityStaking = await ethers.getContractFactory( + "GitcoinIdentityStaking", + this.owner + ); + this.gitcoinIdentityStaking = await GitcoinIdentityStaking.deploy(); + await this.gitcoinIdentityStaking + .connect(this.owner) + .initialize(gtcAddress, "0x0000000000000000000000000000000000000001"); + + for (let i = 0; i < this.userAccounts.length; i++) { + await this.gtc + .connect(this.owner) + .mint(userAccounts[i].address, 100000000000); + } + }); + it("should stake each user", async function () { + // const numUsers = 200; + const numUsers = 20; + const userAccounts = this.userAccounts.slice(0, numUsers); + + await Promise.all( + [this.gitcoinIdentityStaking].map(async (gitcoinIdentityStaking: any) => { + gitcoinIdentityStaking.grantRole( + await gitcoinIdentityStaking.SLASHER_ROLE(), + this.owner.address + ); + gitcoinIdentityStaking.grantRole( + await gitcoinIdentityStaking.RELEASER_ROLE(), + this.owner.address + ); + + await Promise.all( + userAccounts.map(async (userAccount: any, accountIdx: number) => { + // This changes the order of the transactions + // which can affect gas. Randomizing to get an + // average gas cost. + for (const func of shuffleArray([ + () => + gitcoinIdentityStaking + .connect(userAccount) + .selfStake(100000, twelveWeeksInSeconds), + + () => + gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[accountIdx + 1], + 100000, + twelveWeeksInSeconds + ), + + () => + gitcoinIdentityStaking + .connect(userAccount) + .communityStake( + this.userAccounts[ + accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 + ], + 100000, + twelveWeeksInSeconds + ) + ])) { + await func(); + } + }) + ); + + // let slashMembers: { + // address: string; + // amount: string; + // stakeId: number; + // }[] = []; + + const allStakeMembers: StakeMember[] = await Promise.all( + userAccounts.map(async (userAccount: any) => { + const stakeId = await gitcoinIdentityStaking.selfStakeIds( + userAccount.address, + 0 + ); + const amount = (await gitcoinIdentityStaking.stakes(stakeId))[0]; + return { + address: userAccount.address, + amount, + stakeId + }; + }) + ); + + const { merkleRoot, slashTotal } = buildMerkleTree( + allStakeMembers, + numUsers + ); + + const slashTotalProof = getMerkleProof(ZERO_ADDRESS); + + await gitcoinIdentityStaking + .connect(this.owner) + .slash(merkleRoot, slashTotal, slashTotalProof); + + debugger; + + // const slashNonce = keccak256(Buffer.from(Math.random().toString())); + + // const slashProof = makeSlashProof(slashMembers, slashNonce); + + // await gitcoinIdentityStaking + // .connect(this.owner) + // .slash(stakeIds, 50, slashProof); + + // await gitcoinIdentityStaking + // .connect(this.owner) + // .release( + // slashMembers, + // 1, + // 500, + // slashProof, + // slashNonce, + // ethers.keccak256(Buffer.from(Math.random().toString())) + // ); + + // await time.increase(60 * 60 * 24 * 91); + + // await gitcoinIdentityStaking.connect(this.owner).burn(); + }) + ); + }); +}); diff --git a/yarn.lock b/yarn.lock index 5cd7a4a..532430a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -973,6 +973,14 @@ proper-lockfile "^4.1.1" undici "^5.14.0" +"@openzeppelin/merkle-tree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@openzeppelin/merkle-tree/-/merkle-tree-1.0.5.tgz#4836d377777a7e39f31674f06ec3d6909def7913" + integrity sha512-JkwG2ysdHeIphrScNxYagPy6jZeNONgDRyqU6lbFgE8HKCZFSkcP8r6AjZs+3HZk4uRNV0kNBBzuWhKQ3YV7Kw== + dependencies: + "@ethersproject/abi" "^5.7.0" + ethereum-cryptography "^1.1.2" + "@openzeppelin/platform-deploy-client@^0.9.0": version "0.9.0" resolved "https://registry.npmjs.org/@openzeppelin/platform-deploy-client/-/platform-deploy-client-0.9.0.tgz" @@ -2411,7 +2419,7 @@ ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" -ethereum-cryptography@^1.0.3: +ethereum-cryptography@^1.0.3, ethereum-cryptography@^1.1.2: version "1.2.0" resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz" integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== From 2e710f56c21274202f66a48b2680ef35bc49b953 Mon Sep 17 00:00:00 2001 From: schultztimothy Date: Fri, 22 Dec 2023 18:12:32 -0700 Subject: [PATCH 16/18] feat: withdraw based on merkle proof --- contracts/GitcoinIdentityStaking.sol | 44 ++++++++++----- slashMerkleTree.json | 2 +- test/GitcoinIdentityStakingMerkle.ts | 84 ++++++++++++++++++---------- 3 files changed, 87 insertions(+), 43 deletions(-) diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index 7aaa280..693e26d 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -162,25 +162,40 @@ contract GitcoinIdentityStaking is return false; } - function withdrawSelfStake(uint256 stakeId) external { - if (!ownerOfStake(msg.sender, stakeId)) { - revert NotOwnerOfStake(); - } + error InvalidWithdrawProof(); + + function withdrawSelfStake( + uint256 stakeId, + uint192 slashAmnt, + bytes32[] memory stakeProof + ) external { + // not really needed anymore since withdraws are dependent on a valid proof that contains msg.sender + // if (!ownerOfStake(msg.sender, stakeId)) { + // revert NotOwnerOfStake(); + // } if (stakes[stakeId].unlockTime < block.timestamp) { revert StakeIsLocked(); } - if (selfStakeIds[msg.sender].length == 0) { - revert CannotStakeOnSelf(); - } + console.log("slashAmnt", slashAmnt); + console.log("stakes[stakeId].amount", stakes[stakeId].amount); + bytes32 leaf = keccak256( + bytes.concat(keccak256(abi.encode(msg.sender, slashAmnt, stakeId))) + ); - uint192 amount = stakes[stakeId].amount; + console.logBytes32(slashMerkleRoot); + if (!MerkleProof.verify(stakeProof, slashMerkleRoot, leaf)) { + revert InvalidWithdrawProof(); + } - delete stakes[stakeId]; + // For good users this will always be zero. For bad users this will be the slash amount + uint192 amount = stakes[stakeId].amount - slashAmnt; gtc.transfer(msg.sender, amount); + delete stakes[stakeId]; + emit SelfStakeWithdrawn(stakeId, msg.sender, amount); } @@ -253,23 +268,24 @@ contract GitcoinIdentityStaking is error InvalidSlashProof(); function slash( - bytes32 slashMerkleRoot, + bytes32 currentSlashMerkleRoot, uint192 slashTotal, bytes32[] memory slashTotalProof ) external onlyRole(SLASHER_ROLE) { - if (slashMerkleRoots[slashMerkleRoot]) { + if (slashMerkleRoots[currentSlashMerkleRoot]) { revert SlashProofHashAlreadyUsed(); } bytes32 leaf = keccak256( bytes.concat(keccak256(abi.encode(address(0), slashTotal, uint192(0)))) ); - if (!MerkleProof.verify(slashTotalProof, slashMerkleRoot, leaf)) { + if (!MerkleProof.verify(slashTotalProof, currentSlashMerkleRoot, leaf)) { revert InvalidSlashProof(); } - slashMerkleRoots[slashMerkleRoot] = true; - slashTotals[slashMerkleRoot] = slashTotal; + slashMerkleRoots[currentSlashMerkleRoot] = true; + slashTotals[currentSlashMerkleRoot] = slashTotal; + slashMerkleRoot = currentSlashMerkleRoot; emit Slash(msg.sender, slashMerkleRoot, slashTotal); } diff --git a/slashMerkleTree.json b/slashMerkleTree.json index 4643cc1..97b7c72 100644 --- a/slashMerkleTree.json +++ b/slashMerkleTree.json @@ -1 +1 @@ -{"format":"standard-v1","tree":["0x4f877cffb2709592deca3a72a33440484a64095fe0d09c5f87ee8622fc96718a","0x8be1224c703767fee1beb186ffe08e72b529757dfd6308df1f530c1fd7814390","0x5ad71921b3aeca509e281b90615a929601cad9595c341b36ea281d076e03bad5","0xddf6422d67bf41ea9468d58bcf3bd3ad0909dfd16041101a38e961470e0e909a","0xa4337c634a57c9aa1a77a9c7a13f32ac379d01b9b761fc6d84f8263ff61e5586","0x06c6d7db9e9b656aeb0c4b2d17e2a3b1d99aeb990a613f58e8833c30e5436c3c","0x54f7e48b4c09d22f942bb28788f347cb54efe793e64f65a6f5a97f5e73a8335f","0x193063e00117d8e22e9d0f2b7f61be2d05a799eefa443f92b61ee57576a19ef0","0xa351ca8e8eb29156f8a152efb71f5a9d7e6f1b8f467b95077b3edc748a6ac582","0x89aafbc9a9d5f5408663aaa162d3adf798216021f362a2a8ec8f0b52121e1574","0xe281568e4e77b4f0d09d2e247c6ecda7262a1124f393a14ede2f1760a10e4148","0xf3f80cb230960b6a4a2d66f2c48dc0bc272356282e36c5c6b94dc81c2e0e9a9e","0x95e486825ad565e024580b7fda1c5ef33dd74536ac51da0d9ba609710d00d902","0x11953ff786bce3e2a88108c7d566260f5c35df7fd462d439f918d829bcd90178","0xc8a25efc79d3df44fee547f0b62110662664fa9445713923aec803fbaf52c4ce","0xee287f1a95345fc35813e33e590fcf8eda6873881d0d68b017262b1b7bad5669","0xad9c800666f685b25183231ef3059f0714996e73ed506325b9f1691bc9416ca1","0x0a800c12ae6388dab4e5613543026e8dee883e5696597f3daf344e614ddd3d04","0x8a39e49fc4156ce309a5576bf6370cbfbaa15e1e077d17d895163212bd557faa","0xcbf5f82e7ed5bac466a00ca32c5c06de401ec2e2ead0c4493b52c03e9cdd4a7a","0xe0fde44d3a79e4eecf1cf4747047c87f45411750fb7de44f8071267e46f62ca5","0xca9596fd0de882c21968943eadbf7595a9a81ca049554275044411692179f72d","0xc87297026d3ae783196832019a3204f37bb975dc1f39c7e85189b6181993b671","0xc5f551333777b56475407ebdeed8ca04688a5c42d869b28cdadf7c3bac5ef04a","0xbaf858b434337fa7328ff3a8ef41176162d040857cec461907c4ee0066bcd965","0xba5e9e192770cf00f6c99f9d34a932ac7dfe432795a0a51c44b3f03baa57f428","0x9961b5a4d33dd9405b6b1c8b20494f1735c8b6368189f7d18b47804275613d8e","0x932a5f5383c6bde4cbe15f59519fcc8c394dc31a5306fe88e1df70ed862d696f","0x8b630b791e607962327da75209de2b7fc1ff35dc8fe584328e50761a7297d87f","0x8a9409fd67656ad4f293fe5de79b5909f7aa9e8e4431fda03f583d8e55d22a24","0x81b1bfdf32d35d2ac6f537d3d39d7d8c469d2f8233fe0b22802f520706b49356","0x699ed57b0eb389399b3754571a6b37034f4be7a35dd0487328fcdd2abbd82c9a","0x5efd71fecc81621162106db439d740683c6dafb70935dee6d2afdd0c315a0026","0x5021bafaa69301b1ec904b8765e6c971a36e8866f8f2b7fcf57edc54fc1fa503","0x3808c4c956a940f51d0d8bc8085d0b772d4031c281331ce1dc7f68db9329aaa3","0x372b0e66a371d035e9f444679e17831ccf2a0d52a2979d35a46f447cf4451b98","0x2d1d7f2e8dbace7f3b393d97cf46473f20aa91917454f00d8058b86a98fe2dfc","0x114d3aa1bd9b9205a0eb004d03dfa5ec12474119e890da1b2d580518c0a90415","0x068df22d64c10593baec852aaf59456c2b999f91c9d5ee300c2fd2540687248e","0x057f92e8be0df7960e634f8168e4c0bfdae3eb68b0c73cd4122692d8c2653dc4","0x0409608e419428f15b50adc8bd1283be789d74cda3eb0a6e247e6de3c3cb1dfb"],"values":[{"value":["0x0000000000000000000000000000000000000000","650000","0"],"treeIndex":38},{"value":["0x70997970C51812dc3A010C7d01b50e0d17dc79C8","0","43"],"treeIndex":28},{"value":["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC","0","44"],"treeIndex":35},{"value":["0x90F79bf6EB2c4f870365E785982E1f101E93b906","0","25"],"treeIndex":36},{"value":["0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65","0","46"],"treeIndex":30},{"value":["0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc","0","47"],"treeIndex":34},{"value":["0x976EA74026E726554dB657fA54763abd0C3a0aa9","0","28"],"treeIndex":33},{"value":["0x14dC79964da2C08b23698B3D3cc7Ca32193d9955","0","49"],"treeIndex":25},{"value":["0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f","0","30"],"treeIndex":20},{"value":["0xa0Ee7A142d267C1f36714E4a8F75612F20a79720","0","31"],"treeIndex":26},{"value":["0xBcd4042DE499D14e55001CcbB24a551F3b954096","0","32"],"treeIndex":21},{"value":["0x71bE63f3384f5fb98995898A86B02Fb2426c5788","0","53"],"treeIndex":32},{"value":["0xFABB0ac9d68B0B445fB7357272Ff202C5651694a","0","34"],"treeIndex":37},{"value":["0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec","0","1"],"treeIndex":40},{"value":["0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097","0","35"],"treeIndex":27},{"value":["0xcd3B766CCDd6AE721141F452C550Ca635964ce71","0","36"],"treeIndex":22},{"value":["0x2546BcD3c84621e976D8185a91A922aE77ECEc30","0","37"],"treeIndex":31},{"value":["0xbDA5747bFD65F08deb54cb465eB87D40e51B197E","0","38"],"treeIndex":39},{"value":["0xdD2FD4581271e230360230F9337D5c0430Bf44C0","0","2"],"treeIndex":23},{"value":["0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199","0","59"],"treeIndex":29},{"value":["0x09DB0a93B389bEF724429898f539AEB7ac2Dd55f","0","40"],"treeIndex":24}],"leafEncoding":["address","uint192","uint192"]} \ No newline at end of file +{"format":"standard-v1","tree":["0x4ee0e62a2cc42e69d7b74961fe8320cf1580848f43320b76d8a03933a1f7c8fc","0x8323c7d86c07f29854575281c5f16c47b387d02feb24c83644fbe9d488c4899e","0xf55f9821f3235c89b46b07751e3c7cdb502f99db2222635e8e37e733ab5d2528","0x11a9b913398e7c657e1bcc97b6f57d861f07e3b6c804eb28b2625474716412c5","0x324a7b9be36df5d73500a45b3a66e9c3530d98d21462fdc5151d4bbf718bfffa","0x2d4739bd2b944ec6073782ff29feb9dfa737081ba59aa45a80eccc8f5854a4fa","0xcda86ecc928b658d794e56a5213723f0f718f4e82d2b1f83367754e14d7ebef7","0x16c2ef6adad215df17f02741b8a4f2b21b41b7904f5f012abe1e1a6bd41fcd7d","0x4873070130a66645fe24223a37d419a2a8fdb1858ec36c080c0cfd0a80c184c2","0x70514ed0adba34172b28ede23fd2927777bf86d875fef87a3c355d8e6b979117","0x4eef34fc2f824340501c2c65d8e19516ca5dccb2cac6e919cbe9a6e73fa69e86","0xbd9a9076da4806251be845d3aba1b19d9bf0810ac0fcd4e41d010c6c2033f99d","0x99723565eff183ba2a035ada6589c357e9da2e3d0de1ab6c518c9fdd902d7596","0xbe823efd7036e2c33170aa2bd67e499e71f712cff80dc072fa806d5cfcf0adf2","0xb62067165cf8c042547204e4925805c3b03af35d62308d63003ac70eb094d2f1","0x80bf88d3f3a80af488a128a67a73822624f19627fa320d0a289cc01de6a8c999","0x31c890297d81c2bb34d75f17d0b355e865781a439959ac8d2b97c364db553603","0x7996ec04c8b264c0dadf78516b8f1d41684c173389263d44a5423f45f4ff7acb","0xa30dd3da77d9042b4e53bc6dc23ff1d7552c9d9600e21fc3fe88d7eee4f98d1a","0x05f8ad915cb48176d876a726d71d3b6db8f32064ab48e8671b1122cb4b0270a8","0xfe286186fb17876649842d203691c58cd4ef93595bc1e3e065919b6f162f15c4","0xf9375388c6178546dc9b37d9d6862918ecd225c2a5512b6d8f8fb84e2a162fea","0xf819a12e0152964fe8065cf9909c25ebcbfcf96c0117775bbd3fc742b6b81343","0xeb5379dbcacfaac6e05c2d0235ab78dfc57d5caacd64d2bcb26efac28ebf2d9e","0xe9add2aca9557434bfce6f8616377c7b75c1f0f80a3c784e658aedc9a6b7f591","0xe12af4d92f6cbc6c4921c93159f7ebfd4f9e648923fd155bfe4eec531b686d4f","0xcec27422d16d21859906848470a7c8bbf5db3f0ebdc41307ac0bfcefa05797db","0xc8b8fcb61f1fd429aa619d0c85d75514268a6ee63577610f7d431bf28048280e","0xad5ad727323b4eda84d2b0f2ce09ba900609d9c23a3c9197f9a6518c93bf7961","0xaca37f2d909546e2ec3b5a8f67d7ff9d2b35f082720e470385c98deefd686a44","0xa685b3c3a8e57601e53256b16f0f682d78f3d8419e6d7d3eb950a803329aaa0c","0x9ce536d2c2bd3274a6b426dfe8fb7df524c2e9df994de502388981f227030430","0x7ecc8061980e6ccbaa440a41d34195a201cbab90b0e26a16a6c089f44d32d3cf","0x7bd950b882c12e9952fe58bd1165dbda1425938a79596268985e8dd65a59c9df","0x75a2858f1ce917f9fa881b49d94a937e98189e7f987ddbb36e7065ea68a46ce9","0x71ee9bb72b40b9c33d1e32858a0578e4bcf4232d6be0b28d36fe49a3d7b7d625","0x5e12ec5e25664139c07927d3e51dfe6b931d79122717f48083245258618fce04","0x435bfa871444d66299d112bab86394ce026474c597382357a4372e183836c5ab","0x29d86a5493a2a367f5c2d69652a03b229991da446cfac02eae2f3c225c29cc1b","0x1e59d7e06dd084e9357c0dd424a6d60422cd8acbfaf18abfeca3f7849751dc41","0x068df22d64c10593baec852aaf59456c2b999f91c9d5ee300c2fd2540687248e"],"values":[{"value":["0x0000000000000000000000000000000000000000","650000","0"],"treeIndex":40},{"value":["0x70997970C51812dc3A010C7d01b50e0d17dc79C8","0","1"],"treeIndex":26},{"value":["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC","0","2"],"treeIndex":34},{"value":["0x90F79bf6EB2c4f870365E785982E1f101E93b906","0","3"],"treeIndex":27},{"value":["0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65","0","4"],"treeIndex":22},{"value":["0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc","0","5"],"treeIndex":31},{"value":["0x976EA74026E726554dB657fA54763abd0C3a0aa9","0","6"],"treeIndex":32},{"value":["0x14dC79964da2C08b23698B3D3cc7Ca32193d9955","0","7"],"treeIndex":33},{"value":["0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f","50000","8"],"treeIndex":28},{"value":["0xa0Ee7A142d267C1f36714E4a8F75612F20a79720","50000","9"],"treeIndex":23},{"value":["0xBcd4042DE499D14e55001CcbB24a551F3b954096","50000","10"],"treeIndex":30},{"value":["0x71bE63f3384f5fb98995898A86B02Fb2426c5788","50000","11"],"treeIndex":36},{"value":["0xFABB0ac9d68B0B445fB7357272Ff202C5651694a","50000","12"],"treeIndex":25},{"value":["0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec","50000","13"],"treeIndex":37},{"value":["0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097","50000","14"],"treeIndex":21},{"value":["0xcd3B766CCDd6AE721141F452C550Ca635964ce71","50000","15"],"treeIndex":35},{"value":["0x2546BcD3c84621e976D8185a91A922aE77ECEc30","50000","16"],"treeIndex":38},{"value":["0xbDA5747bFD65F08deb54cb465eB87D40e51B197E","50000","17"],"treeIndex":24},{"value":["0xdD2FD4581271e230360230F9337D5c0430Bf44C0","50000","18"],"treeIndex":20},{"value":["0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199","50000","19"],"treeIndex":39},{"value":["0x09DB0a93B389bEF724429898f539AEB7ac2Dd55f","50000","20"],"treeIndex":29}],"leafEncoding":["address","uint192","uint192"]} \ No newline at end of file diff --git a/test/GitcoinIdentityStakingMerkle.ts b/test/GitcoinIdentityStakingMerkle.ts index 91cee60..b26ffef 100644 --- a/test/GitcoinIdentityStakingMerkle.ts +++ b/test/GitcoinIdentityStakingMerkle.ts @@ -20,21 +20,22 @@ const buildMerkleTree = ( ): { merkleRoot: string; slashTotal: number; + slashedUsers: string[]; } => { - const slashedUsers = []; + const slashedUsers: string[] = []; let slashTotal = 0; const values: [string, string, string][] = users.map((user, i) => { const shouldSlash = i > Math.floor((numUsers * 3) / 10); let slashAmount = 0; if (shouldSlash) { - slashedUsers.push(user); + slashedUsers.push(user.address); slashAmount += Number(user.amount) / 2; } slashTotal += slashAmount; return [ user.address, // if shouldSlash, Slash half of the users stake - shouldSlash ? BigInt(0).toString() : BigInt(slashAmount).toString(), + shouldSlash ? BigInt(slashAmount).toString() : BigInt(0).toString(), BigInt(user.stakeId).toString() ]; }); @@ -52,7 +53,7 @@ const buildMerkleTree = ( fs.writeFileSync("slashMerkleTree.json", JSON.stringify(merkleTree.dump())); - return { merkleRoot, slashTotal }; + return { merkleRoot, slashTotal, slashedUsers }; }; const getMerkleProof = (address: string) => { @@ -115,7 +116,7 @@ describe.only("GitcoinIdentityStaking Merkle Slashing", function () { .mint(userAccounts[i].address, 100000000000); } }); - it("should stake each user", async function () { + it("should self stake each user", async function () { // const numUsers = 200; const numUsers = 20; const userAccounts = this.userAccounts.slice(0, numUsers); @@ -140,27 +141,27 @@ describe.only("GitcoinIdentityStaking Merkle Slashing", function () { () => gitcoinIdentityStaking .connect(userAccount) - .selfStake(100000, twelveWeeksInSeconds), - - () => - gitcoinIdentityStaking - .connect(userAccount) - .communityStake( - this.userAccounts[accountIdx + 1], - 100000, - twelveWeeksInSeconds - ), - - () => - gitcoinIdentityStaking - .connect(userAccount) - .communityStake( - this.userAccounts[ - accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 - ], - 100000, - twelveWeeksInSeconds - ) + .selfStake(100000, twelveWeeksInSeconds) + + // () => + // gitcoinIdentityStaking + // .connect(userAccount) + // .communityStake( + // this.userAccounts[accountIdx + 1], + // 100000, + // twelveWeeksInSeconds + // ), + + // () => + // gitcoinIdentityStaking + // .connect(userAccount) + // .communityStake( + // this.userAccounts[ + // accountIdx ? accountIdx - 1 : this.userAccounts.length - 1 + // ], + // 100000, + // twelveWeeksInSeconds + // ) ])) { await func(); } @@ -188,7 +189,7 @@ describe.only("GitcoinIdentityStaking Merkle Slashing", function () { }) ); - const { merkleRoot, slashTotal } = buildMerkleTree( + const { merkleRoot, slashTotal, slashedUsers } = buildMerkleTree( allStakeMembers, numUsers ); @@ -199,7 +200,33 @@ describe.only("GitcoinIdentityStaking Merkle Slashing", function () { .connect(this.owner) .slash(merkleRoot, slashTotal, slashTotalProof); - debugger; + await time.increaseTo( + twelveWeeksInSeconds + Math.floor(new Date().getTime() / 1000) + ); + + // withdraw funds for each user + userAccounts.map(async (userAccount: any) => { + const stakeId = await gitcoinIdentityStaking.selfStakeIds( + userAccount.address, + 0 + ); + let amount = (await gitcoinIdentityStaking.stakes(stakeId))[0]; + if (slashedUsers.includes(userAccount.address)) { + amount = Number(amount) / 2; + } else { + amount = 0; + } + + try { + const proof = getMerkleProof(userAccount.address); + const withdrawTx = await gitcoinIdentityStaking + .connect(userAccount) + .withdrawSelfStake(stakeId, BigInt(amount), proof); + } catch (e) { + // debugger; + console.log(e); + } + }); // const slashNonce = keccak256(Buffer.from(Math.random().toString())); @@ -226,4 +253,5 @@ describe.only("GitcoinIdentityStaking Merkle Slashing", function () { }) ); }); + // it("should withdraw each user", async function () {}); }); From b7ef2b7da7692b7ab34cc195442e3dda12f691d5 Mon Sep 17 00:00:00 2001 From: schultztimothy Date: Tue, 26 Dec 2023 18:34:15 -0700 Subject: [PATCH 17/18] WIP bad list merkle tree --- badList.json | 1 + contracts/GitcoinIdentityStaking.sol | 28 +++++------ slashMerkleTree.json | 2 +- test/GitcoinIdentityStakingMerkle.ts | 70 ++++++++++++++++++++++------ 4 files changed, 74 insertions(+), 27 deletions(-) create mode 100644 badList.json diff --git a/badList.json b/badList.json new file mode 100644 index 0000000..a9b1cb1 --- /dev/null +++ b/badList.json @@ -0,0 +1 @@ +{"format":"standard-v1","tree":["0x25848b65aede00ffec0b06e883ff20b2010d96bff66fb33f994128cf4c78cbc1","0x49128a401834f23fd22af717548e79c2583695e0a57ad12c2a55a3626efe04d9","0x8aedbbb99621f2187785624f974561ce3ae9e242dba3688ba15a54e78e598ad6","0xd5e4f054036f8fa2dbd47d5b67a1827e5ab031b7f72a75db56b4b52065ce5020","0xaf8144ed290171ca2e0cad7209f3fbdf411fd95f51558971adcfdcb0c7a91e94","0x49c46890c25712bff52fed8e82bf617d9fd19ffea13bcd3b38ddf2870e6f0ad9","0xa88ee9dd12d90d750e8fd3d4b69d904347eb968e3c9ac07aba4d33718e0ddf40","0x606bebfcd627cd8b9096628647546b12e729e2f1d7a1080dd15e27abdba6d3a9","0x99fef1403ea327b68f922415ff8abfd2ae974262a89aef7ce2c4f12c782f120b","0x8b111e51863ab787d2d056f3dae4faf3bdf89406b14ff7f5959b5fd7f1c13f51","0xcb10f8c26e9f8666702320df512444520fab7011dcf2e6f648683a5a8ba77c8d","0xb25aca321477cf82000f263fac30f5b5ee4ed03c4b71460759021932be8cbc54","0xd190b963cc81f18160e45e60bafc2c761d4645612a4de3c6e70553da0f33c12a","0xe7b22412ba272615a32a6c5ed10830afc2d85ed864f055cfee2c1a84b28142f4","0xcc90100726c91d4b545a44f81fe5b2dc887bfa5e611f99680949a74c4d5052a3","0xb674253972c8251412104b3b84ab690e612db8fccd3e6cc6412a589f4fca24fc","0xb050d730564f43a280b743000405215f5be04a742e33073d7c2f236a2b7eb5ff","0xa309e317e76779dc870a45c53abf83edbf027ba8656b55e028a10bd5026e08d8","0x7a5f2e5518852d93a37c5955f7b6d052798c830f03751df0a5324156720487fb","0x76d9bb1247c370d6d9d250aec68f8763414190eaa2521d8c56490c05ada65a29","0x720819e85beb14c5eeffda6b410cff9e04c7415f8686a6114adf4ad043e1ddf4","0x5be3d8ed7b491d378222fd5698443f20c4636e20d960c70ead915d88eb40cbff","0x3916c54a2082cc81e11c7d20beb22f9a966c1fb399dabe69086dcea0a70af5cc","0x367e04de763579f6e1df281c1a665173d63c2fff47357b935a7516db23d9c548","0x27c2bcbfc6f7a44cd2d5cfb6607048a99d8269b100fd590e97c1badc0838daec","0x1a2e8320d23f16ac0c0ff3161c91cb70d0ada5d59693896995221cd3df7122de","0x0722b34488e17d83e1b8a6770fb49ab1d3238c88fb6542cbbe581e3c0117f509"],"values":[{"value":["0x14dC79964da2C08b23698B3D3cc7Ca32193d9955","119096571092301921719253721560231391405901977941"],"treeIndex":20},{"value":["0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f","201990263407130541861732429012178345511141645967"],"treeIndex":17},{"value":["0xa0Ee7A142d267C1f36714E4a8F75612F20a79720","918756735253610709936507276127632253845124912928"],"treeIndex":26},{"value":["0xBcd4042DE499D14e55001CcbB24a551F3b954096","1078018386962683210833080912426859325347918594198"],"treeIndex":19},{"value":["0x71bE63f3384f5fb98995898A86B02Fb2426c5788","649361805570585991432183860154126180479862069128"],"treeIndex":21},{"value":["0xFABB0ac9d68B0B445fB7357272Ff202C5651694a","1431418871862876925181802361878557621142999361866"],"treeIndex":15},{"value":["0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec","164071735471096495022318073447543169725534292460"],"treeIndex":14},{"value":["0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097","1274489751712037608509761039581936044807219343511"],"treeIndex":24},{"value":["0xcd3B766CCDd6AE721141F452C550Ca635964ce71","1171669168259442413243860206195356130559412981361"],"treeIndex":16},{"value":["0x2546BcD3c84621e976D8185a91A922aE77ECEc30","212810159859923545014459052809686498143686683696"],"treeIndex":22},{"value":["0xbDA5747bFD65F08deb54cb465eB87D40e51B197E","1082689025860186422301062612148899595711925655934"],"treeIndex":25},{"value":["0xdD2FD4581271e230360230F9337D5c0430Bf44C0","1262753593150382717471430831644857192119478994112"],"treeIndex":18},{"value":["0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199","765873671610919835980981505307059354946689044889"],"treeIndex":23},{"value":["0x09DB0a93B389bEF724429898f539AEB7ac2Dd55f","56265701518907046320037230111460041352924747103"],"treeIndex":13}],"leafEncoding":["address","uint192"]} \ No newline at end of file diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index 693e26d..7f2f8b5 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -67,9 +67,12 @@ contract GitcoinIdentityStaking is mapping(bytes32 => bool) public slashProofHashes; mapping(bytes32 => bool) public slashMerkleRoots; + mapping(bytes32 => bool) public slashUserMerkleRoots; + mapping(bytes32 => uint192) public slashTotals; bytes32 public slashMerkleRoot; + bytes32 public slashUserMerkleRoot; event SelfStake( uint256 indexed id, @@ -167,25 +170,17 @@ contract GitcoinIdentityStaking is function withdrawSelfStake( uint256 stakeId, uint192 slashAmnt, - bytes32[] memory stakeProof + bytes32[] memory slashUserProof ) external { - // not really needed anymore since withdraws are dependent on a valid proof that contains msg.sender - // if (!ownerOfStake(msg.sender, stakeId)) { - // revert NotOwnerOfStake(); - // } - if (stakes[stakeId].unlockTime < block.timestamp) { revert StakeIsLocked(); } - console.log("slashAmnt", slashAmnt); - console.log("stakes[stakeId].amount", stakes[stakeId].amount); - bytes32 leaf = keccak256( - bytes.concat(keccak256(abi.encode(msg.sender, slashAmnt, stakeId))) - ); + bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(msg.sender)))); - console.logBytes32(slashMerkleRoot); - if (!MerkleProof.verify(stakeProof, slashMerkleRoot, leaf)) { + console.logBytes32(leaf); + console.logBytes32(slashUserMerkleRoot); + if (!MerkleProof.verify(slashUserProof, slashUserMerkleRoot, leaf)) { revert InvalidWithdrawProof(); } @@ -269,6 +264,7 @@ contract GitcoinIdentityStaking is function slash( bytes32 currentSlashMerkleRoot, + bytes32 currentSlashUserMerkleRoot, uint192 slashTotal, bytes32[] memory slashTotalProof ) external onlyRole(SLASHER_ROLE) { @@ -276,6 +272,10 @@ contract GitcoinIdentityStaking is revert SlashProofHashAlreadyUsed(); } + if (slashUserMerkleRoots[slashUserMerkleRoot]) { + revert SlashProofHashAlreadyUsed(); + } + bytes32 leaf = keccak256( bytes.concat(keccak256(abi.encode(address(0), slashTotal, uint192(0)))) ); @@ -283,9 +283,11 @@ contract GitcoinIdentityStaking is revert InvalidSlashProof(); } + slashUserMerkleRoots[slashUserMerkleRoot] = true; slashMerkleRoots[currentSlashMerkleRoot] = true; slashTotals[currentSlashMerkleRoot] = slashTotal; slashMerkleRoot = currentSlashMerkleRoot; + slashUserMerkleRoot = currentSlashUserMerkleRoot; emit Slash(msg.sender, slashMerkleRoot, slashTotal); } diff --git a/slashMerkleTree.json b/slashMerkleTree.json index 97b7c72..fe0bfa0 100644 --- a/slashMerkleTree.json +++ b/slashMerkleTree.json @@ -1 +1 @@ -{"format":"standard-v1","tree":["0x4ee0e62a2cc42e69d7b74961fe8320cf1580848f43320b76d8a03933a1f7c8fc","0x8323c7d86c07f29854575281c5f16c47b387d02feb24c83644fbe9d488c4899e","0xf55f9821f3235c89b46b07751e3c7cdb502f99db2222635e8e37e733ab5d2528","0x11a9b913398e7c657e1bcc97b6f57d861f07e3b6c804eb28b2625474716412c5","0x324a7b9be36df5d73500a45b3a66e9c3530d98d21462fdc5151d4bbf718bfffa","0x2d4739bd2b944ec6073782ff29feb9dfa737081ba59aa45a80eccc8f5854a4fa","0xcda86ecc928b658d794e56a5213723f0f718f4e82d2b1f83367754e14d7ebef7","0x16c2ef6adad215df17f02741b8a4f2b21b41b7904f5f012abe1e1a6bd41fcd7d","0x4873070130a66645fe24223a37d419a2a8fdb1858ec36c080c0cfd0a80c184c2","0x70514ed0adba34172b28ede23fd2927777bf86d875fef87a3c355d8e6b979117","0x4eef34fc2f824340501c2c65d8e19516ca5dccb2cac6e919cbe9a6e73fa69e86","0xbd9a9076da4806251be845d3aba1b19d9bf0810ac0fcd4e41d010c6c2033f99d","0x99723565eff183ba2a035ada6589c357e9da2e3d0de1ab6c518c9fdd902d7596","0xbe823efd7036e2c33170aa2bd67e499e71f712cff80dc072fa806d5cfcf0adf2","0xb62067165cf8c042547204e4925805c3b03af35d62308d63003ac70eb094d2f1","0x80bf88d3f3a80af488a128a67a73822624f19627fa320d0a289cc01de6a8c999","0x31c890297d81c2bb34d75f17d0b355e865781a439959ac8d2b97c364db553603","0x7996ec04c8b264c0dadf78516b8f1d41684c173389263d44a5423f45f4ff7acb","0xa30dd3da77d9042b4e53bc6dc23ff1d7552c9d9600e21fc3fe88d7eee4f98d1a","0x05f8ad915cb48176d876a726d71d3b6db8f32064ab48e8671b1122cb4b0270a8","0xfe286186fb17876649842d203691c58cd4ef93595bc1e3e065919b6f162f15c4","0xf9375388c6178546dc9b37d9d6862918ecd225c2a5512b6d8f8fb84e2a162fea","0xf819a12e0152964fe8065cf9909c25ebcbfcf96c0117775bbd3fc742b6b81343","0xeb5379dbcacfaac6e05c2d0235ab78dfc57d5caacd64d2bcb26efac28ebf2d9e","0xe9add2aca9557434bfce6f8616377c7b75c1f0f80a3c784e658aedc9a6b7f591","0xe12af4d92f6cbc6c4921c93159f7ebfd4f9e648923fd155bfe4eec531b686d4f","0xcec27422d16d21859906848470a7c8bbf5db3f0ebdc41307ac0bfcefa05797db","0xc8b8fcb61f1fd429aa619d0c85d75514268a6ee63577610f7d431bf28048280e","0xad5ad727323b4eda84d2b0f2ce09ba900609d9c23a3c9197f9a6518c93bf7961","0xaca37f2d909546e2ec3b5a8f67d7ff9d2b35f082720e470385c98deefd686a44","0xa685b3c3a8e57601e53256b16f0f682d78f3d8419e6d7d3eb950a803329aaa0c","0x9ce536d2c2bd3274a6b426dfe8fb7df524c2e9df994de502388981f227030430","0x7ecc8061980e6ccbaa440a41d34195a201cbab90b0e26a16a6c089f44d32d3cf","0x7bd950b882c12e9952fe58bd1165dbda1425938a79596268985e8dd65a59c9df","0x75a2858f1ce917f9fa881b49d94a937e98189e7f987ddbb36e7065ea68a46ce9","0x71ee9bb72b40b9c33d1e32858a0578e4bcf4232d6be0b28d36fe49a3d7b7d625","0x5e12ec5e25664139c07927d3e51dfe6b931d79122717f48083245258618fce04","0x435bfa871444d66299d112bab86394ce026474c597382357a4372e183836c5ab","0x29d86a5493a2a367f5c2d69652a03b229991da446cfac02eae2f3c225c29cc1b","0x1e59d7e06dd084e9357c0dd424a6d60422cd8acbfaf18abfeca3f7849751dc41","0x068df22d64c10593baec852aaf59456c2b999f91c9d5ee300c2fd2540687248e"],"values":[{"value":["0x0000000000000000000000000000000000000000","650000","0"],"treeIndex":40},{"value":["0x70997970C51812dc3A010C7d01b50e0d17dc79C8","0","1"],"treeIndex":26},{"value":["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC","0","2"],"treeIndex":34},{"value":["0x90F79bf6EB2c4f870365E785982E1f101E93b906","0","3"],"treeIndex":27},{"value":["0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65","0","4"],"treeIndex":22},{"value":["0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc","0","5"],"treeIndex":31},{"value":["0x976EA74026E726554dB657fA54763abd0C3a0aa9","0","6"],"treeIndex":32},{"value":["0x14dC79964da2C08b23698B3D3cc7Ca32193d9955","0","7"],"treeIndex":33},{"value":["0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f","50000","8"],"treeIndex":28},{"value":["0xa0Ee7A142d267C1f36714E4a8F75612F20a79720","50000","9"],"treeIndex":23},{"value":["0xBcd4042DE499D14e55001CcbB24a551F3b954096","50000","10"],"treeIndex":30},{"value":["0x71bE63f3384f5fb98995898A86B02Fb2426c5788","50000","11"],"treeIndex":36},{"value":["0xFABB0ac9d68B0B445fB7357272Ff202C5651694a","50000","12"],"treeIndex":25},{"value":["0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec","50000","13"],"treeIndex":37},{"value":["0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097","50000","14"],"treeIndex":21},{"value":["0xcd3B766CCDd6AE721141F452C550Ca635964ce71","50000","15"],"treeIndex":35},{"value":["0x2546BcD3c84621e976D8185a91A922aE77ECEc30","50000","16"],"treeIndex":38},{"value":["0xbDA5747bFD65F08deb54cb465eB87D40e51B197E","50000","17"],"treeIndex":24},{"value":["0xdD2FD4581271e230360230F9337D5c0430Bf44C0","50000","18"],"treeIndex":20},{"value":["0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199","50000","19"],"treeIndex":39},{"value":["0x09DB0a93B389bEF724429898f539AEB7ac2Dd55f","50000","20"],"treeIndex":29}],"leafEncoding":["address","uint192","uint192"]} \ No newline at end of file +{"format":"standard-v1","tree":["0x0fd23867dbae0b631522cfad62e31597494b2291af42c7e047a5a4334f3c3961","0x9ae840d5e31aaf9ee91afcc7ccc4b06630fc958af21096efd594eb80fdcd9f60","0xac79d6ab821354424a5e680b5b9087ccdf34585c7dd60e898c0d95822a6562d0","0x8870eae1b1a85ef71509c712b623bd521e5a20de005bcd10ec41e0c4f69fc830","0xa81173be06ff83a2b241cf4c779b4aa27cda031d8983b03a93275a6c8cde3887","0x27f2446de87c63e6a300efcf47c21d70831f50dbc8c50140513e10d3b5c79081","0x9452bead4f4ddb7edb2b9b112fef81611d790e48d818727d916eeebdf510b970","0x706d04443bf204cc62c51358ce64f06979c4240d095083b3f60deb3c11365a20","0x67b871df8ce226966472d3d1c68c6c435deb3d5aa8860513dcb7d81bde59cd6f","0xcef85fbe4e8d2a70825fbe8ef9ad5df51a4855321245eb2a1848655760cd2789","0xab33cdb1e0d19f6f215adb12660848fff48b194b4340b48bd35128904e8e8fcd","0xeb32d5dc7b24272f24264bc71d03fa7b4557d5be6de5044e8bdff0e1c3a85c92","0x4862604ab4551fd8ca089fbb9e21ae76855114725a4adeec3c93ef79067fb308","0x4a4628be48c4f2b7a2030a8306a39c6edef21911a1b3bde73bf3299f7bd5b307","0x53c1d3d8a74ee0f54e107d925bd4bdba59d0927a59a2eea8d91fa01e28dabcf5","0x19ab028af0df0d5cf9658500b87a3657f81c4f136f8ae20035eabce05922eb86","0xdde4a18cb4723555224698b4002492fab808dc3936b3d107e684351044bd3941","0x9beb233cefa94e708746d032102856d32f65a504a4f94e2706f46c14bba954f5","0x16b822fed8d57b6ca17e581da2d5f76b02798713491b107c12fb06843eb968d1","0xc2fa4de8016e94b714df00e578a2a86d7601cc07391b3506bf729e5af9272d56","0xf8f9124cabf063747e34c7357595250cca8843b1885176d0c92873f49d318839","0xf6d7c8514e204df386fca82db338a046aa91f6adb01f71ce1986d8a71ed1c8e7","0xea7484ac482aa26a7cc8560cebed48f6511ecb6b94d58a67ebd08a6885e5a36c","0xe9948773748f540d3d0821fd8fd464077fcb32c9592544a684257b2eb039bba1","0xe554f268c3b34ab82109539975ff5bc0f18f1bffa4a194b761fffa3362caa653","0xdf2ccdb77387732af23cd1aa34c571f27887235596584dceb485f0e59aacff5e","0xd3edc9c344e45d2e63c68963c79bd7cb3cc2511b0d7f7181fda334ccbacc2848","0xb69cf2e874a4e124e21494c480b38163fd6d1dcb14bef4821a234f2d21a05041","0xb1094a480f37dd39fda1b442611a5a681ff6242a130a067e874c35179c6115de","0x95c81eb40745d9f746ba46bf9722b0f5d8bed0a9bc328f834d7e6717814c8436","0x7e6e99181aa5020e820b3b0dfdcb83089a3a2d6ea3eaf104ec7147f1a021ad81","0x7bd950b882c12e9952fe58bd1165dbda1425938a79596268985e8dd65a59c9df","0x77ddf606f3a461d9754741a05626ccbf9446dac2dc5efcec219c4aab3a5f7fd4","0x758cd02d07a4972f1614b4af15fa6dcb79db75dcb31685a425e969ca5897c994","0x425bc4c902f9551e0690829f2301a11fc0f882237af64f52098ba1013a217613","0x41f76e9ce69c3e131a6dafe6aae5531c8f4f01c973ff205ec9f1ac2e1b8b0928","0x3f426ca50b366e7480195c4234d136ba52284dc9256e43a584b8658158951fca","0x3843d7c39ab02c8fe9f70d6a4dd6c935fe77c21e019f32b5c35f9cd5e9388644","0x2cbfd076ee7acebea5c39d7c66ce85826def56b9093f248ce5010419be079d20","0x0812391cc516bd82fa4e1a5fc5718f183a4b6606a88be2a4bfad3579b2c67974","0x03be185b0207af753e3431ea579bc5037e5c434cd3f3149ab20b199e2f4d23cf"],"values":[{"value":["0x0000000000000000000000000000000000000000","300000","0"],"treeIndex":37},{"value":["0x70997970C51812dc3A010C7d01b50e0d17dc79C8","50000","1"],"treeIndex":33},{"value":["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC","50000","2"],"treeIndex":39},{"value":["0x90F79bf6EB2c4f870365E785982E1f101E93b906","50000","3"],"treeIndex":29},{"value":["0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65","50000","4"],"treeIndex":26},{"value":["0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc","50000","5"],"treeIndex":28},{"value":["0x976EA74026E726554dB657fA54763abd0C3a0aa9","50000","6"],"treeIndex":25},{"value":["0x14dC79964da2C08b23698B3D3cc7Ca32193d9955","0","7"],"treeIndex":31},{"value":["0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f","0","8"],"treeIndex":20},{"value":["0xa0Ee7A142d267C1f36714E4a8F75612F20a79720","0","9"],"treeIndex":30},{"value":["0xBcd4042DE499D14e55001CcbB24a551F3b954096","0","10"],"treeIndex":22},{"value":["0x71bE63f3384f5fb98995898A86B02Fb2426c5788","0","11"],"treeIndex":21},{"value":["0xFABB0ac9d68B0B445fB7357272Ff202C5651694a","0","12"],"treeIndex":32},{"value":["0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec","0","13"],"treeIndex":40},{"value":["0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097","0","14"],"treeIndex":24},{"value":["0xcd3B766CCDd6AE721141F452C550Ca635964ce71","0","15"],"treeIndex":38},{"value":["0x2546BcD3c84621e976D8185a91A922aE77ECEc30","0","16"],"treeIndex":34},{"value":["0xbDA5747bFD65F08deb54cb465eB87D40e51B197E","0","17"],"treeIndex":23},{"value":["0xdD2FD4581271e230360230F9337D5c0430Bf44C0","0","18"],"treeIndex":35},{"value":["0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199","0","19"],"treeIndex":27},{"value":["0x09DB0a93B389bEF724429898f539AEB7ac2Dd55f","0","20"],"treeIndex":36}],"leafEncoding":["address","uint192","uint192"]} \ No newline at end of file diff --git a/test/GitcoinIdentityStakingMerkle.ts b/test/GitcoinIdentityStakingMerkle.ts index b26ffef..d313e14 100644 --- a/test/GitcoinIdentityStakingMerkle.ts +++ b/test/GitcoinIdentityStakingMerkle.ts @@ -13,8 +13,34 @@ type StakeMember = { stakeId: number; }; +const shouldSlash = (numUsers: number, i: number): boolean => + i < Math.floor((numUsers * 3) / 10); + +const buildBadListMerkleTree = ( + users: StakeMember[], + numUsers: number +): { + merkleRoot: string; + slashTotal: number; + slashedUsers: string[]; +} => { + const slashedUsers: string[] = []; + let slashTotal = 0; + const values: [string, string][] = users + .filter((user, i) => !shouldSlash(numUsers, i)) + .map((user) => [user.address, BigInt(user.address).toString()]); + + const merkleTree = StandardMerkleTree.of(values, ["address", "uint192"]); + + const merkleRoot = merkleTree.root; + + fs.writeFileSync("badList.json", JSON.stringify(merkleTree.dump())); + + return { merkleRoot, slashTotal, slashedUsers }; +}; + // https://github.com/OpenZeppelin/merkle-tree -const buildMerkleTree = ( +const buildSlashMerkleTree = ( users: StakeMember[], numUsers: number ): { @@ -25,9 +51,9 @@ const buildMerkleTree = ( const slashedUsers: string[] = []; let slashTotal = 0; const values: [string, string, string][] = users.map((user, i) => { - const shouldSlash = i > Math.floor((numUsers * 3) / 10); + const slash = shouldSlash(numUsers, i); let slashAmount = 0; - if (shouldSlash) { + if (slash) { slashedUsers.push(user.address); slashAmount += Number(user.amount) / 2; } @@ -35,7 +61,7 @@ const buildMerkleTree = ( return [ user.address, // if shouldSlash, Slash half of the users stake - shouldSlash ? BigInt(slashAmount).toString() : BigInt(0).toString(), + slash ? BigInt(slashAmount).toString() : BigInt(0).toString(), BigInt(user.stakeId).toString() ]; }); @@ -56,15 +82,15 @@ const buildMerkleTree = ( return { merkleRoot, slashTotal, slashedUsers }; }; -const getMerkleProof = (address: string) => { +const getMerkleProof = (address: string, isBadList: boolean) => { + const fileName = isBadList ? "badList.json" : "slashMerkleTree.json"; const merkleTree = StandardMerkleTree.load( - JSON.parse(fs.readFileSync("slashMerkleTree.json", "utf8")) + JSON.parse(fs.readFileSync(fileName, "utf8")) ); - let proof: any = null; + let proof: any = []; for (const [i, v] of merkleTree.entries()) { if (v[0] === address) { - // (3) proof = merkleTree.getProof(i); console.log("Value:", v); console.log("Proof:", proof); @@ -85,6 +111,19 @@ function shuffleArray(array: any[]) { const fiveMinutes = 5 * 60; const twelveWeeksInSeconds = 12 * 7 * 24 * 60 * 60 + 1; // 12 weeks in seconds +// Two merkle proofs one that has slash ids +// one that has all slashed amounts and stake ids. + +// In order to withdrawal you just need to verify that the stake id is not on a bad list + +// If on bad list amount will be withdrawn to the bad list. + +// You wouldn't need to do the second one if you just did the first one. + +// Need round associated for each merkle proof + +// Associate round with merkle proof, merkle proof can be updated with a release. + describe.only("GitcoinIdentityStaking Merkle Slashing", function () { this.beforeEach(async function () { await reset(); @@ -117,7 +156,6 @@ describe.only("GitcoinIdentityStaking Merkle Slashing", function () { } }); it("should self stake each user", async function () { - // const numUsers = 200; const numUsers = 20; const userAccounts = this.userAccounts.slice(0, numUsers); @@ -189,16 +227,21 @@ describe.only("GitcoinIdentityStaking Merkle Slashing", function () { }) ); - const { merkleRoot, slashTotal, slashedUsers } = buildMerkleTree( + const { merkleRoot, slashTotal, slashedUsers } = buildSlashMerkleTree( + allStakeMembers, + numUsers + ); + + const { merkleRoot: badListMerkleRoot } = buildBadListMerkleTree( allStakeMembers, numUsers ); - const slashTotalProof = getMerkleProof(ZERO_ADDRESS); + const slashTotalProof = getMerkleProof(ZERO_ADDRESS, false); await gitcoinIdentityStaking .connect(this.owner) - .slash(merkleRoot, slashTotal, slashTotalProof); + .slash(merkleRoot, badListMerkleRoot, slashTotal, slashTotalProof); await time.increaseTo( twelveWeeksInSeconds + Math.floor(new Date().getTime() / 1000) @@ -218,7 +261,8 @@ describe.only("GitcoinIdentityStaking Merkle Slashing", function () { } try { - const proof = getMerkleProof(userAccount.address); + const proof = getMerkleProof(userAccount.address, true); + console.log("Proof:", proof); const withdrawTx = await gitcoinIdentityStaking .connect(userAccount) .withdrawSelfStake(stakeId, BigInt(amount), proof); From e7623d3ed1c122104969eafff68035db6cc5e161 Mon Sep 17 00:00:00 2001 From: schultztimothy Date: Tue, 26 Dec 2023 18:50:08 -0700 Subject: [PATCH 18/18] fix proof params --- badList.json | 2 +- contracts/GitcoinIdentityStaking.sol | 4 +++- test/GitcoinIdentityStakingMerkle.ts | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/badList.json b/badList.json index a9b1cb1..77f6dda 100644 --- a/badList.json +++ b/badList.json @@ -1 +1 @@ -{"format":"standard-v1","tree":["0x25848b65aede00ffec0b06e883ff20b2010d96bff66fb33f994128cf4c78cbc1","0x49128a401834f23fd22af717548e79c2583695e0a57ad12c2a55a3626efe04d9","0x8aedbbb99621f2187785624f974561ce3ae9e242dba3688ba15a54e78e598ad6","0xd5e4f054036f8fa2dbd47d5b67a1827e5ab031b7f72a75db56b4b52065ce5020","0xaf8144ed290171ca2e0cad7209f3fbdf411fd95f51558971adcfdcb0c7a91e94","0x49c46890c25712bff52fed8e82bf617d9fd19ffea13bcd3b38ddf2870e6f0ad9","0xa88ee9dd12d90d750e8fd3d4b69d904347eb968e3c9ac07aba4d33718e0ddf40","0x606bebfcd627cd8b9096628647546b12e729e2f1d7a1080dd15e27abdba6d3a9","0x99fef1403ea327b68f922415ff8abfd2ae974262a89aef7ce2c4f12c782f120b","0x8b111e51863ab787d2d056f3dae4faf3bdf89406b14ff7f5959b5fd7f1c13f51","0xcb10f8c26e9f8666702320df512444520fab7011dcf2e6f648683a5a8ba77c8d","0xb25aca321477cf82000f263fac30f5b5ee4ed03c4b71460759021932be8cbc54","0xd190b963cc81f18160e45e60bafc2c761d4645612a4de3c6e70553da0f33c12a","0xe7b22412ba272615a32a6c5ed10830afc2d85ed864f055cfee2c1a84b28142f4","0xcc90100726c91d4b545a44f81fe5b2dc887bfa5e611f99680949a74c4d5052a3","0xb674253972c8251412104b3b84ab690e612db8fccd3e6cc6412a589f4fca24fc","0xb050d730564f43a280b743000405215f5be04a742e33073d7c2f236a2b7eb5ff","0xa309e317e76779dc870a45c53abf83edbf027ba8656b55e028a10bd5026e08d8","0x7a5f2e5518852d93a37c5955f7b6d052798c830f03751df0a5324156720487fb","0x76d9bb1247c370d6d9d250aec68f8763414190eaa2521d8c56490c05ada65a29","0x720819e85beb14c5eeffda6b410cff9e04c7415f8686a6114adf4ad043e1ddf4","0x5be3d8ed7b491d378222fd5698443f20c4636e20d960c70ead915d88eb40cbff","0x3916c54a2082cc81e11c7d20beb22f9a966c1fb399dabe69086dcea0a70af5cc","0x367e04de763579f6e1df281c1a665173d63c2fff47357b935a7516db23d9c548","0x27c2bcbfc6f7a44cd2d5cfb6607048a99d8269b100fd590e97c1badc0838daec","0x1a2e8320d23f16ac0c0ff3161c91cb70d0ada5d59693896995221cd3df7122de","0x0722b34488e17d83e1b8a6770fb49ab1d3238c88fb6542cbbe581e3c0117f509"],"values":[{"value":["0x14dC79964da2C08b23698B3D3cc7Ca32193d9955","119096571092301921719253721560231391405901977941"],"treeIndex":20},{"value":["0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f","201990263407130541861732429012178345511141645967"],"treeIndex":17},{"value":["0xa0Ee7A142d267C1f36714E4a8F75612F20a79720","918756735253610709936507276127632253845124912928"],"treeIndex":26},{"value":["0xBcd4042DE499D14e55001CcbB24a551F3b954096","1078018386962683210833080912426859325347918594198"],"treeIndex":19},{"value":["0x71bE63f3384f5fb98995898A86B02Fb2426c5788","649361805570585991432183860154126180479862069128"],"treeIndex":21},{"value":["0xFABB0ac9d68B0B445fB7357272Ff202C5651694a","1431418871862876925181802361878557621142999361866"],"treeIndex":15},{"value":["0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec","164071735471096495022318073447543169725534292460"],"treeIndex":14},{"value":["0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097","1274489751712037608509761039581936044807219343511"],"treeIndex":24},{"value":["0xcd3B766CCDd6AE721141F452C550Ca635964ce71","1171669168259442413243860206195356130559412981361"],"treeIndex":16},{"value":["0x2546BcD3c84621e976D8185a91A922aE77ECEc30","212810159859923545014459052809686498143686683696"],"treeIndex":22},{"value":["0xbDA5747bFD65F08deb54cb465eB87D40e51B197E","1082689025860186422301062612148899595711925655934"],"treeIndex":25},{"value":["0xdD2FD4581271e230360230F9337D5c0430Bf44C0","1262753593150382717471430831644857192119478994112"],"treeIndex":18},{"value":["0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199","765873671610919835980981505307059354946689044889"],"treeIndex":23},{"value":["0x09DB0a93B389bEF724429898f539AEB7ac2Dd55f","56265701518907046320037230111460041352924747103"],"treeIndex":13}],"leafEncoding":["address","uint192"]} \ No newline at end of file +{"format":"standard-v1","tree":["0x1b1fdea6d6a5ee187c3097d3bad61bcd9a27170e4cb6aebb1b24a03e6ad50e69","0x94a013fbf2bc50579e7a03a8aa876ed2653fe1e6d760390da6198a78a7ff5a99","0x3d55e655b268948132c11a40de6c000c4286b1c3bf409e14a8d4e67153f5f23e","0xf3c9e73362f19f1862e5084557b94ed67a049d129f056fb427eb0ba6851128ff","0x5f79db879af91d8a048e0939cbbd392e7992564fa04b5ffff814edeeaeed5e51","0xcc364facb706a7e2b9f4f8c31e68d2aaa1a8ee0cdfca73e1c7933f2fa4050b4e","0xe26c1b79a170caaad55fc0fd199819f5e46aea591ef83df932c638b317f81d40","0xbe7256b8b1584c49d47a9a0267704f22c1582aa2da6964f54a36c4acfd9ecd29","0x462e2414f21c7142c1362f783f76f22c55f7abc23d9f17dfe88b8c677f94cfac","0x656cf1dc90777feed0afa7593b28b5b604c742ced4d13f7bcf8584f0e7d1830d","0x227774b3c57a2f290ef708939678e77b8c0f65c009d32497610b26b021cef146","0x2d27e03c02d8e9f64286fc897e586e3d1685595b27f4a0286f150704932cea2e","0x1ab98fa97241523fdf1f772a633e0107190eda734a4a72574cabc906891b4170","0xf2d8af966361250fc02bba28ca978692434f705725b7b761630173c39ca27fd0","0xf112f7c045fd440dcb057a4bd4be38b3126b47b1659eaf9053d56fc0a51e20bf","0xef5f225309b09c1bcfd94fbdaeaeb34ed15496a9514239fd2b0d1c521bee3a30","0xe2e0f1ced9c27c486eab7fafb37be2ae62ceb3c0e9609f0e41dababe40214ea4","0xaefd3a9fa38f6a6e00be2867e5d5661736fdf1cbb06346466734dad61af7499a","0xabb45fa36a9a98a1b01bbe5a2fe3897acb5d748f2cb46b40147aa2741191c6ac","0xa7b42dd23b5e3fc86ad961c05d69a4ee7eaf5e98158bf6b6ea82b8f4155cdb00","0xa0165f79b9d65c93e44649f5e90dcd3d579f01c6d0a411d7b560b14f5e9ca2ee","0x9e621119d5797394a8ecc07dafe27e8776772a12a4c4c9dd1e600025acbf1be5","0x82da5ad1c7f11d007d4f286cb0a7dc601d14634b879154f0f61f03d1ce4ca0b8","0x6f5229bfb64fd205775623f238dbfc185b433eef86dc91bf672d4932043a9e82","0x6d53293066987d900cdd1d37d4d7956b0d28b4e19538e7a590b34c524ae2d0c3","0x65f5e5ecfb080abe7dafdb614d25e453e6f6ddd10d74d66396535eb833a82f61","0x21beff03bec6f1aeed05639ca75f8350bbb259b79393d3b6c090d00f7c652996"],"values":[{"value":["0x14dC79964da2C08b23698B3D3cc7Ca32193d9955","7"],"treeIndex":17},{"value":["0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f","8"],"treeIndex":19},{"value":["0xa0Ee7A142d267C1f36714E4a8F75612F20a79720","9"],"treeIndex":24},{"value":["0xBcd4042DE499D14e55001CcbB24a551F3b954096","10"],"treeIndex":14},{"value":["0x71bE63f3384f5fb98995898A86B02Fb2426c5788","11"],"treeIndex":16},{"value":["0xFABB0ac9d68B0B445fB7357272Ff202C5651694a","12"],"treeIndex":23},{"value":["0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec","13"],"treeIndex":25},{"value":["0xdF3e18d64BC6A983f673Ab319CCaE4f1a57C7097","14"],"treeIndex":15},{"value":["0xcd3B766CCDd6AE721141F452C550Ca635964ce71","15"],"treeIndex":18},{"value":["0x2546BcD3c84621e976D8185a91A922aE77ECEc30","16"],"treeIndex":26},{"value":["0xbDA5747bFD65F08deb54cb465eB87D40e51B197E","17"],"treeIndex":22},{"value":["0xdD2FD4581271e230360230F9337D5c0430Bf44C0","18"],"treeIndex":13},{"value":["0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199","19"],"treeIndex":21},{"value":["0x09DB0a93B389bEF724429898f539AEB7ac2Dd55f","20"],"treeIndex":20}],"leafEncoding":["address","uint192"]} \ No newline at end of file diff --git a/contracts/GitcoinIdentityStaking.sol b/contracts/GitcoinIdentityStaking.sol index 7f2f8b5..1cea5fb 100644 --- a/contracts/GitcoinIdentityStaking.sol +++ b/contracts/GitcoinIdentityStaking.sol @@ -176,7 +176,9 @@ contract GitcoinIdentityStaking is revert StakeIsLocked(); } - bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(msg.sender)))); + bytes32 leaf = keccak256( + bytes.concat(keccak256(abi.encode(msg.sender, stakeId))) + ); console.logBytes32(leaf); console.logBytes32(slashUserMerkleRoot); diff --git a/test/GitcoinIdentityStakingMerkle.ts b/test/GitcoinIdentityStakingMerkle.ts index d313e14..5a41567 100644 --- a/test/GitcoinIdentityStakingMerkle.ts +++ b/test/GitcoinIdentityStakingMerkle.ts @@ -28,7 +28,7 @@ const buildBadListMerkleTree = ( let slashTotal = 0; const values: [string, string][] = users .filter((user, i) => !shouldSlash(numUsers, i)) - .map((user) => [user.address, BigInt(user.address).toString()]); + .map((user) => [user.address, BigInt(user.stakeId).toString()]); const merkleTree = StandardMerkleTree.of(values, ["address", "uint192"]);