diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..c6a7e4da --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "packages/hardhat/lib/forge-std"] + path = packages/hardhat/lib/forge-std + url = https://github.com/foundry-rs/forge-std \ No newline at end of file diff --git a/packages/hardhat/cache_forge/solidity-files-cache.json b/packages/hardhat/cache_forge/solidity-files-cache.json new file mode 100644 index 00000000..3a10063e --- /dev/null +++ b/packages/hardhat/cache_forge/solidity-files-cache.json @@ -0,0 +1 @@ +{"_format":"ethers-rs-sol-cache-3","paths":{"artifacts":"out","build_infos":"out/build-info","sources":"contracts","tests":"test","scripts":"script","libraries":["lib","node_modules"]},"files":{"contracts/YourContract.sol":{"lastModificationDate":1716934796769,"contentHash":"e19adf732fe3e81135b1f9a6ae499f35","sourceName":"contracts/YourContract.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/hardhat/console.sol"],"versionRequirement":">=0.8.0, <0.9.0","artifacts":{"YourContract":{"0.8.21+commit.d9974bed.Darwin.appleclang":"YourContract.sol/YourContract.json"}}},"contracts/claim/BasicDistributor.sol":{"lastModificationDate":1716911465661,"contentHash":"47daea7c4d4b89f5e21253ae7c51b832","sourceName":"contracts/claim/BasicDistributor.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IVoting.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"BasicDistributor":{"0.8.21+commit.d9974bed.Darwin.appleclang":"BasicDistributor.sol/BasicDistributor.json"}}},"contracts/claim/ContinuousVestingMerkle.sol":{"lastModificationDate":1716911465661,"contentHash":"4b7a5cc24d68e20942dddb1e737be352","sourceName":"contracts/claim/ContinuousVestingMerkle.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/ContinuousVesting.sol","contracts/claim/abstract/Distributor.sol","contracts/claim/abstract/MerkleSet.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IContinuousVesting.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/IVoting.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"ContinuousVestingMerkle":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ContinuousVestingMerkle.sol/ContinuousVestingMerkle.json"}}},"contracts/claim/CrosschainContinuousVestingMerkle.sol":{"lastModificationDate":1712343847634,"contentHash":"3932c11e1465c7007543713b3b049da4","sourceName":"contracts/claim/CrosschainContinuousVestingMerkle.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/ContinuousVesting.sol","contracts/claim/abstract/CrosschainDistributor.sol","contracts/claim/abstract/CrosschainMerkleDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/claim/abstract/MerkleSet.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IConnext.sol","contracts/interfaces/IContinuousVesting.sol","contracts/interfaces/ICrosschain.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/IVoting.sol","contracts/interfaces/IXReceiver.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"CrosschainContinuousVestingMerkle":{"0.8.21+commit.d9974bed.Darwin.appleclang":"CrosschainContinuousVestingMerkle.sol/CrosschainContinuousVestingMerkle.json"}}},"contracts/claim/CrosschainTrancheVestingMerkle.sol":{"lastModificationDate":1712343847634,"contentHash":"e7ff8b672c8df0d4817c0b8629fe6bec","sourceName":"contracts/claim/CrosschainTrancheVestingMerkle.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/CrosschainDistributor.sol","contracts/claim/abstract/CrosschainMerkleDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/claim/abstract/MerkleSet.sol","contracts/claim/abstract/TrancheVesting.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IConnext.sol","contracts/interfaces/ICrosschain.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/ITrancheVesting.sol","contracts/interfaces/IVoting.sol","contracts/interfaces/IXReceiver.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol","node_modules/hardhat/console.sol"],"versionRequirement":"=0.8.21","artifacts":{"CrosschainTrancheVestingMerkle":{"0.8.21+commit.d9974bed.Darwin.appleclang":"CrosschainTrancheVestingMerkle.sol/CrosschainTrancheVestingMerkle.json"}}},"contracts/claim/PriceTierVestingMerkle.sol":{"lastModificationDate":1716911465661,"contentHash":"605fade0222a651e4e588d3236b279db","sourceName":"contracts/claim/PriceTierVestingMerkle.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/claim/abstract/MerkleSet.sol","contracts/claim/abstract/PriceTierVesting.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","contracts/interfaces/IPriceTierVesting.sol","contracts/interfaces/IVoting.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"PriceTierVestingMerkle":{"0.8.21+commit.d9974bed.Darwin.appleclang":"PriceTierVestingMerkle.sol/PriceTierVestingMerkle.json"}}},"contracts/claim/PriceTierVestingSale_2_0.sol":{"lastModificationDate":1716911465661,"contentHash":"e8150a1663d3531fc50825ab0d2dddbd","sourceName":"contracts/claim/PriceTierVestingSale_2_0.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/claim/abstract/MerkleSet.sol","contracts/claim/abstract/PriceTierVesting.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","contracts/interfaces/IPriceTierVesting.sol","contracts/interfaces/IVoting.sol","contracts/sale/v2/FlatPriceSale.sol","contracts/sale/v2/Sale.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol","node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/PullPaymentUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/escrow/EscrowUpgradeable.sol"],"versionRequirement":"=0.8.21","artifacts":{"PriceTierVestingSale_2_0":{"0.8.21+commit.d9974bed.Darwin.appleclang":"PriceTierVestingSale_2_0.sol/PriceTierVestingSale_2_0.json"}}},"contracts/claim/Satellite.sol":{"lastModificationDate":1712343847634,"contentHash":"e076aaae88c7b9ef3e90244a3aaef014","sourceName":"contracts/claim/Satellite.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/MerkleSet.sol","contracts/interfaces/IConnext.sol","contracts/interfaces/ICrosschain.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/IXReceiver.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"],"versionRequirement":"=0.8.21","artifacts":{"Satellite":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Satellite.sol/Satellite.json"}}},"contracts/claim/TrancheVestingMerkle.sol":{"lastModificationDate":1716911465661,"contentHash":"5c72cf115f3f3b5fad504e3f82f2faf7","sourceName":"contracts/claim/TrancheVestingMerkle.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/claim/abstract/MerkleSet.sol","contracts/claim/abstract/TrancheVesting.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/ITrancheVesting.sol","contracts/interfaces/IVoting.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol","node_modules/hardhat/console.sol"],"versionRequirement":"=0.8.21","artifacts":{"TrancheVestingMerkle":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TrancheVestingMerkle.sol/TrancheVestingMerkle.json"}}},"contracts/claim/TrancheVestingSale_1_3.sol":{"lastModificationDate":1716911465661,"contentHash":"77c93375bd131f5117bc8e6541ee4c4c","sourceName":"contracts/claim/TrancheVestingSale_1_3.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/claim/abstract/MerkleSet.sol","contracts/claim/abstract/TrancheVesting.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/ITrancheVesting.sol","contracts/interfaces/IVoting.sol","contracts/sale/v1.3/ISaleManager.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol","node_modules/hardhat/console.sol"],"versionRequirement":"=0.8.21","artifacts":{"TrancheVestingSale_1_3":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TrancheVestingSale_1_3.sol/TrancheVestingSale_1_3.json"}}},"contracts/claim/TrancheVestingSale_2_0.sol":{"lastModificationDate":1716911465661,"contentHash":"d45d7293b47c8d00d4439d7caabed7c7","sourceName":"contracts/claim/TrancheVestingSale_2_0.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/claim/abstract/MerkleSet.sol","contracts/claim/abstract/TrancheVesting.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","contracts/interfaces/ITrancheVesting.sol","contracts/interfaces/IVoting.sol","contracts/sale/v2/FlatPriceSale.sol","contracts/sale/v2/Sale.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol","node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/PullPaymentUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/escrow/EscrowUpgradeable.sol","node_modules/hardhat/console.sol"],"versionRequirement":"=0.8.21","artifacts":{"TrancheVestingSale_2_0":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TrancheVestingSale_2_0.sol/TrancheVestingSale_2_0.json"}}},"contracts/claim/abstract/AdvancedDistributor.sol":{"lastModificationDate":1716911465661,"contentHash":"50f4f4d106ee9de465895cbd06388d9f","sourceName":"contracts/claim/abstract/AdvancedDistributor.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/Distributor.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IVoting.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"AdvancedDistributor":{"0.8.21+commit.d9974bed.Darwin.appleclang":"AdvancedDistributor.sol/AdvancedDistributor.json"}}},"contracts/claim/abstract/ContinuousVesting.sol":{"lastModificationDate":1716911465661,"contentHash":"e64ccd3f0ce1feab9f5f16ccfa3b0d3c","sourceName":"contracts/claim/abstract/ContinuousVesting.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IContinuousVesting.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IVoting.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"ContinuousVesting":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ContinuousVesting.sol/ContinuousVesting.json"}}},"contracts/claim/abstract/CrosschainDistributor.sol":{"lastModificationDate":1712343847635,"contentHash":"b21a472988a79bf062d42722a060abc2","sourceName":"contracts/claim/abstract/CrosschainDistributor.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IConnext.sol","contracts/interfaces/ICrosschain.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IVoting.sol","contracts/interfaces/IXReceiver.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"CrosschainDistributor":{"0.8.21+commit.d9974bed.Darwin.appleclang":"CrosschainDistributor.sol/CrosschainDistributor.json"}}},"contracts/claim/abstract/CrosschainMerkleDistributor.sol":{"lastModificationDate":1716911465661,"contentHash":"cc47a28b23cd12854b409dc5f7ea8628","sourceName":"contracts/claim/abstract/CrosschainMerkleDistributor.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/CrosschainDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/claim/abstract/MerkleSet.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IConnext.sol","contracts/interfaces/ICrosschain.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/IVoting.sol","contracts/interfaces/IXReceiver.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"CrosschainMerkleDistributor":{"0.8.21+commit.d9974bed.Darwin.appleclang":"CrosschainMerkleDistributor.sol/CrosschainMerkleDistributor.json"}}},"contracts/claim/abstract/Distributor.sol":{"lastModificationDate":1716911465662,"contentHash":"4719943620b3f1e944fab95bb71260a5","sourceName":"contracts/claim/abstract/Distributor.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IDistributor.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol"],"versionRequirement":"=0.8.21","artifacts":{"Distributor":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Distributor.sol/Distributor.json"}}},"contracts/claim/abstract/MerkleSet.sol":{"lastModificationDate":1712343847635,"contentHash":"fcbe118db188a06ac79e29cd484b93a0","sourceName":"contracts/claim/abstract/MerkleSet.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IMerkleSet.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"],"versionRequirement":"=0.8.21","artifacts":{"MerkleSet":{"0.8.21+commit.d9974bed.Darwin.appleclang":"MerkleSet.sol/MerkleSet.json"}}},"contracts/claim/abstract/PriceTierVesting.sol":{"lastModificationDate":1716911465662,"contentHash":"34251464a9375f80e8f34bb2f94922eb","sourceName":"contracts/claim/abstract/PriceTierVesting.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","contracts/interfaces/IPriceTierVesting.sol","contracts/interfaces/IVoting.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"PriceTierVesting":{"0.8.21+commit.d9974bed.Darwin.appleclang":"PriceTierVesting.sol/PriceTierVesting.json"}}},"contracts/claim/abstract/TrancheVesting.sol":{"lastModificationDate":1716931299613,"contentHash":"ac61c6dc29ad0cc64a8e6b6952f0d71a","sourceName":"contracts/claim/abstract/TrancheVesting.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/abstract/AdvancedDistributor.sol","contracts/claim/abstract/Distributor.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/ITrancheVesting.sol","contracts/interfaces/IVoting.sol","contracts/utilities/FairQueue.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol","node_modules/hardhat/console.sol"],"versionRequirement":"=0.8.21","artifacts":{"TrancheVesting":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TrancheVesting.sol/TrancheVesting.json"}}},"contracts/claim/factory/AdvancedDistributorInitializable.sol":{"lastModificationDate":1716911465662,"contentHash":"88f8dd89c1360e3aa7ba3a6e128ffea0","sourceName":"contracts/claim/factory/AdvancedDistributorInitializable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/factory/DistributorInitializable.sol","contracts/claim/factory/FairQueueInitializable.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IVoting.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"AdvancedDistributorInitializable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"AdvancedDistributorInitializable.sol/AdvancedDistributorInitializable.json"}}},"contracts/claim/factory/ContinuousVestingInitializable.sol":{"lastModificationDate":1716911465662,"contentHash":"4e5bdc39dcf5bdd0ef55897f1488986b","sourceName":"contracts/claim/factory/ContinuousVestingInitializable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/factory/AdvancedDistributorInitializable.sol","contracts/claim/factory/DistributorInitializable.sol","contracts/claim/factory/FairQueueInitializable.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IContinuousVesting.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IVoting.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"ContinuousVestingInitializable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ContinuousVestingInitializable.sol/ContinuousVestingInitializable.json"}}},"contracts/claim/factory/ContinuousVestingMerkleDistributor.sol":{"lastModificationDate":1716911465662,"contentHash":"da884d214ac3939681887e9815cf6198","sourceName":"contracts/claim/factory/ContinuousVestingMerkleDistributor.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/factory/AdvancedDistributorInitializable.sol","contracts/claim/factory/ContinuousVestingInitializable.sol","contracts/claim/factory/DistributorInitializable.sol","contracts/claim/factory/FairQueueInitializable.sol","contracts/claim/factory/MerkleSetInitializable.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IContinuousVesting.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/IVoting.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"ContinuousVestingMerkleDistributor":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ContinuousVestingMerkleDistributor.sol/ContinuousVestingMerkleDistributor.json"}}},"contracts/claim/factory/ContinuousVestingMerkleDistributorFactory.sol":{"lastModificationDate":1712343847636,"contentHash":"ebc6116eee89bcb7a9cc8fef810031c3","sourceName":"contracts/claim/factory/ContinuousVestingMerkleDistributorFactory.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/factory/AdvancedDistributorInitializable.sol","contracts/claim/factory/ContinuousVestingInitializable.sol","contracts/claim/factory/ContinuousVestingMerkleDistributor.sol","contracts/claim/factory/DistributorInitializable.sol","contracts/claim/factory/FairQueueInitializable.sol","contracts/claim/factory/MerkleSetInitializable.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IContinuousVesting.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/IVoting.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/proxy/Clones.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"ContinuousVestingMerkleDistributorFactory":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ContinuousVestingMerkleDistributorFactory.sol/ContinuousVestingMerkleDistributorFactory.json"}}},"contracts/claim/factory/DistributorInitializable.sol":{"lastModificationDate":1716911465662,"contentHash":"ec1469dd0a9a1440f97868528bf38091","sourceName":"contracts/claim/factory/DistributorInitializable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IDistributor.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol"],"versionRequirement":"=0.8.21","artifacts":{"DistributorInitializable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"DistributorInitializable.sol/DistributorInitializable.json"}}},"contracts/claim/factory/FairQueueInitializable.sol":{"lastModificationDate":1712343847636,"contentHash":"38b1e5518ac0ad5c689e7827c5e95865","sourceName":"contracts/claim/factory/FairQueueInitializable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/utils/Address.sol"],"versionRequirement":"=0.8.21","artifacts":{"FairQueueInitializable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"FairQueueInitializable.sol/FairQueueInitializable.json"}}},"contracts/claim/factory/MerkleSetInitializable.sol":{"lastModificationDate":1712343847636,"contentHash":"86e847a01b23c6516ff8233c76a3db5f","sourceName":"contracts/claim/factory/MerkleSetInitializable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IMerkleSet.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"],"versionRequirement":"=0.8.21","artifacts":{"MerkleSetInitializable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"MerkleSetInitializable.sol/MerkleSetInitializable.json"}}},"contracts/claim/factory/TrancheVestingInitializable.sol":{"lastModificationDate":1716911465662,"contentHash":"55f59292c13bd85889edc3c49c1846ec","sourceName":"contracts/claim/factory/TrancheVestingInitializable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/factory/AdvancedDistributorInitializable.sol","contracts/claim/factory/DistributorInitializable.sol","contracts/claim/factory/FairQueueInitializable.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/ITrancheVesting.sol","contracts/interfaces/IVoting.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"TrancheVestingInitializable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TrancheVestingInitializable.sol/TrancheVestingInitializable.json"}}},"contracts/claim/factory/TrancheVestingMerkleDistributor.sol":{"lastModificationDate":1716911465663,"contentHash":"8ef0f88e2540c5bd0269801134221a66","sourceName":"contracts/claim/factory/TrancheVestingMerkleDistributor.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/factory/AdvancedDistributorInitializable.sol","contracts/claim/factory/DistributorInitializable.sol","contracts/claim/factory/FairQueueInitializable.sol","contracts/claim/factory/MerkleSetInitializable.sol","contracts/claim/factory/TrancheVestingInitializable.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/ITrancheVesting.sol","contracts/interfaces/IVoting.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"TrancheVestingMerkleDistributor":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TrancheVestingMerkleDistributor.sol/TrancheVestingMerkleDistributor.json"}}},"contracts/claim/factory/TrancheVestingMerkleDistributorFactory.sol":{"lastModificationDate":1712343847637,"contentHash":"76fa3939e7b44adb493c23a715be5fa1","sourceName":"contracts/claim/factory/TrancheVestingMerkleDistributorFactory.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/factory/AdvancedDistributorInitializable.sol","contracts/claim/factory/DistributorInitializable.sol","contracts/claim/factory/FairQueueInitializable.sol","contracts/claim/factory/MerkleSetInitializable.sol","contracts/claim/factory/TrancheVestingInitializable.sol","contracts/claim/factory/TrancheVestingMerkleDistributor.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/ITrancheVesting.sol","contracts/interfaces/IVoting.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/proxy/Clones.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"TrancheVestingMerkleDistributorFactory":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TrancheVestingMerkleDistributorFactory.sol/TrancheVestingMerkleDistributorFactory.json"}}},"contracts/governance/GovernorMultiSourceUpgradeable.sol":{"lastModificationDate":1712343847637,"contentHash":"ed07016b24a4f35cd3f02e49ca8172de","sourceName":"contracts/governance/GovernorMultiSourceUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/governance/GovernorVotesMultiSourceUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/TimelockControllerUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorCountingSimpleUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorTimelockControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/IGovernorTimelockUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/CheckpointsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol"],"versionRequirement":"=0.8.21","artifacts":{"GovernorMultiSourceUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"GovernorMultiSourceUpgradeable.sol/GovernorMultiSourceUpgradeable.json"}}},"contracts/governance/GovernorVotesMultiSourceUpgradeable.sol":{"lastModificationDate":1715223388324,"contentHash":"9398b36f31acce33ba8fc0327c740873","sourceName":"contracts/governance/GovernorVotesMultiSourceUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol"],"versionRequirement":"=0.8.21","artifacts":{"GovernorVotesMultiSourceUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"GovernorVotesMultiSourceUpgradeable.sol/GovernorVotesMultiSourceUpgradeable.json"}}},"contracts/governance/TimelockControllerUpgradeable.sol":{"lastModificationDate":1712343847637,"contentHash":"c593562a57aac85b864b18e6f854ef81","sourceName":"contracts/governance/TimelockControllerUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/TimelockControllerUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"],"versionRequirement":"=0.8.21","artifacts":{"MyTimelockControllerUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TimelockControllerUpgradeable.sol/MyTimelockControllerUpgradeable.json"}}},"contracts/interfaces/IAdjustable.sol":{"lastModificationDate":1712343847637,"contentHash":"9427cdf96525bfd86204498397a3638c","sourceName":"contracts/interfaces/IAdjustable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"=0.8.21","artifacts":{"IAdjustable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IAdjustable.sol/IAdjustable.json"}}},"contracts/interfaces/IConnext.sol":{"lastModificationDate":1712345183878,"contentHash":"e18d2f86587bcba145ee6931a8400d9a","sourceName":"contracts/interfaces/IConnext.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IConnext":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IConnext.sol/IConnext.json"}}},"contracts/interfaces/IContinuousVesting.sol":{"lastModificationDate":1712343847637,"contentHash":"d803ab031f797f6886124b956541f2dd","sourceName":"contracts/interfaces/IContinuousVesting.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"=0.8.21","artifacts":{"IContinuousVesting":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IContinuousVesting.sol/IContinuousVesting.json"}}},"contracts/interfaces/ICrosschain.sol":{"lastModificationDate":1712343847637,"contentHash":"5ae74f6bb321f4e214ae7183a2e3de28","sourceName":"contracts/interfaces/ICrosschain.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IDistributor.sol","contracts/interfaces/IXReceiver.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"=0.8.21","artifacts":{"ICrosschain":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ICrosschain.sol/ICrosschain.json"}}},"contracts/interfaces/IDistributor.sol":{"lastModificationDate":1716911465663,"contentHash":"1f8d0972a55fefe982d79bc92bbbad27","sourceName":"contracts/interfaces/IDistributor.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"=0.8.21","artifacts":{"IDistributor":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IDistributor.sol/IDistributor.json"}}},"contracts/interfaces/IERC20.sol":{"lastModificationDate":1712343847637,"contentHash":"df852d6a9cb66d2548fb904a781279f7","sourceName":"contracts/interfaces/IERC20.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"=0.8.21","artifacts":{}},"contracts/interfaces/IERC20Extended.sol":{"lastModificationDate":1712343847637,"contentHash":"e41adc1266ec46e826d557bbf1e8a526","sourceName":"contracts/interfaces/IERC20Extended.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"=0.8.21","artifacts":{"IERC20Extended":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC20Extended.sol/IERC20Extended.json"}}},"contracts/interfaces/IERC20Metadata.sol":{"lastModificationDate":1712343847638,"contentHash":"e5a1ce5aab62ecec898cdb590eafe365","sourceName":"contracts/interfaces/IERC20Metadata.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol"],"versionRequirement":"=0.8.21","artifacts":{}},"contracts/interfaces/IHashflowQuote.sol":{"lastModificationDate":1712343847638,"contentHash":"fbff8f908ee5ac9ffbbc471c922515dc","sourceName":"contracts/interfaces/IHashflowQuote.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"=0.8.21","artifacts":{"IHashflowQuote":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IHashflowQuote.sol/IHashflowQuote.json"}}},"contracts/interfaces/IMerkleSet.sol":{"lastModificationDate":1712343847638,"contentHash":"be1808c0ff1fb8731ed7e7f35ac5e343","sourceName":"contracts/interfaces/IMerkleSet.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"=0.8.21","artifacts":{"IMerkleSet":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IMerkleSet.sol/IMerkleSet.json"}}},"contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol":{"lastModificationDate":1712343847638,"contentHash":"40efada5d204b8769c5a88ab9657a473","sourceName":"contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"=0.8.21","artifacts":{"IOracleOrL2OracleWithSequencerCheck":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IOracleOrL2OracleWithSequencerCheck.sol/IOracleOrL2OracleWithSequencerCheck.json"}}},"contracts/interfaces/IPriceTierVesting.sol":{"lastModificationDate":1712343847638,"contentHash":"13243f3db31055513501069f55f42bd7","sourceName":"contracts/interfaces/IPriceTierVesting.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"=0.8.21","artifacts":{"IPriceTierVesting":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IPriceTierVesting.sol/IPriceTierVesting.json"}}},"contracts/interfaces/ITrancheVesting.sol":{"lastModificationDate":1712343847638,"contentHash":"4c8bb52941e98b4269f7c5f7186eca3f","sourceName":"contracts/interfaces/ITrancheVesting.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"=0.8.21","artifacts":{"ITrancheVesting":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ITrancheVesting.sol/ITrancheVesting.json"}}},"contracts/interfaces/IVesting.sol":{"lastModificationDate":1712343847638,"contentHash":"71aadb0fa168644244e6a27de5a9018b","sourceName":"contracts/interfaces/IVesting.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"=0.8.21","artifacts":{"IVesting":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IVesting.sol/IVesting.json"}}},"contracts/interfaces/IVoting.sol":{"lastModificationDate":1712343847638,"contentHash":"af263cb534a40f8b2919dfb82a58e6cc","sourceName":"contracts/interfaces/IVoting.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol"],"versionRequirement":"=0.8.21","artifacts":{"IVoting":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IVoting.sol/IVoting.json"}}},"contracts/interfaces/IXReceiver.sol":{"lastModificationDate":1712345183878,"contentHash":"bdb597c337215e04702edd5fc5069e3a","sourceName":"contracts/interfaces/IXReceiver.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IXReceiver":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IXReceiver.sol/IXReceiver.json"}}},"contracts/mocks/ConnextMock.sol":{"lastModificationDate":1712343847638,"contentHash":"99e002827c22b08a514b8756284ca889","sourceName":"contracts/mocks/ConnextMock.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IXReceiver.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol"],"versionRequirement":"=0.8.21","artifacts":{"ConnextMock":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ConnextMock.sol/ConnextMock.json"}}},"contracts/mocks/FakeChainlinkOracle.sol":{"lastModificationDate":1712343847638,"contentHash":"89dd179ff2c5f9741484e52bb72cdd85","sourceName":"contracts/mocks/FakeChainlinkOracle.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol"],"versionRequirement":"=0.8.21","artifacts":{"FakeChainlinkOracle":{"0.8.21+commit.d9974bed.Darwin.appleclang":"FakeChainlinkOracle.sol/FakeChainlinkOracle.json"},"FakeEthOracle":{"0.8.21+commit.d9974bed.Darwin.appleclang":"FakeChainlinkOracle.sol/FakeEthOracle.json"},"FakeUsdcOracle":{"0.8.21+commit.d9974bed.Darwin.appleclang":"FakeChainlinkOracle.sol/FakeUsdcOracle.json"},"FakeUsdtOracle":{"0.8.21+commit.d9974bed.Darwin.appleclang":"FakeChainlinkOracle.sol/FakeUsdtOracle.json"}}},"contracts/mocks/FakeSequencerUptimeFeed.sol":{"lastModificationDate":1712343847639,"contentHash":"fd357b60e5b1b09fab227e17dcb87acf","sourceName":"contracts/mocks/FakeSequencerUptimeFeed.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.sol","node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol","node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"],"versionRequirement":"=0.8.21","artifacts":{"FakeSequencerUptimeFeed":{"0.8.21+commit.d9974bed.Darwin.appleclang":"FakeSequencerUptimeFeed.sol/FakeSequencerUptimeFeed.json"}}},"contracts/mocks/GovernorMultiSourceUpgradeableMock.sol":{"lastModificationDate":1712343847639,"contentHash":"8132975fac904f13348a9db4d53dafa0","sourceName":"contracts/mocks/GovernorMultiSourceUpgradeableMock.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/governance/GovernorMultiSourceUpgradeable.sol","contracts/governance/GovernorVotesMultiSourceUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/TimelockControllerUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorCountingSimpleUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorTimelockControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/IGovernorTimelockUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/CheckpointsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol"],"versionRequirement":"=0.8.21","artifacts":{"GovernorMultiSourceUpgradeableMock":{"0.8.21+commit.d9974bed.Darwin.appleclang":"GovernorMultiSourceUpgradeableMock.sol/GovernorMultiSourceUpgradeableMock.json"}}},"contracts/mocks/HashflowRouterMock.sol":{"lastModificationDate":1712343847639,"contentHash":"20caf086168d0bb07ab1af84f5a00162","sourceName":"contracts/mocks/HashflowRouterMock.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IHashflowQuote.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol"],"versionRequirement":"=0.8.21","artifacts":{"HashflowRouterMock":{"0.8.21+commit.d9974bed.Darwin.appleclang":"HashflowRouterMock.sol/HashflowRouterMock.json"}}},"contracts/payment/Payment.sol":{"lastModificationDate":1712343847639,"contentHash":"58b4651509fea8b86a439e8b80f8318d","sourceName":"contracts/payment/Payment.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol"],"versionRequirement":"=0.8.21","artifacts":{}},"contracts/sale/v1.0/SaleManager.sol":{"lastModificationDate":1712343847639,"contentHash":"3939969c961182f06d08396ca791047f","sourceName":"contracts/sale/v1.0/SaleManager.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"],"versionRequirement":"=0.8.21","artifacts":{"SaleManager_v_1_0":{"0.8.21+commit.d9974bed.Darwin.appleclang":"SaleManager.sol/SaleManager_v_1_0.json"}}},"contracts/sale/v1.2/ClaimManager.sol":{"lastModificationDate":1712345183878,"contentHash":"67c43af55ed8c3dd327e73ed78357c40","sourceName":"contracts/sale/v1.2/ClaimManager.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","contracts/sale/v1.2/SaleManager.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"],"versionRequirement":">=0.8.0, <0.9.0","artifacts":{"ClaimManager":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ClaimManager.sol/ClaimManager.json"}}},"contracts/sale/v1.2/SaleManager.sol":{"lastModificationDate":1712343847639,"contentHash":"2ad4752fad39d2710b9a8af73b5657d7","sourceName":"contracts/sale/v1.2/SaleManager.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"],"versionRequirement":">=0.8.0, <0.9.0","artifacts":{"SaleManager_v_1_2":{"0.8.21+commit.d9974bed.Darwin.appleclang":"SaleManager.sol/SaleManager_v_1_2.json"}}},"contracts/sale/v1.3/ISaleManager.sol":{"lastModificationDate":1712345183878,"contentHash":"537894c0d8313de5ec2fa42ee31c8f95","sourceName":"contracts/sale/v1.3/ISaleManager.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.8.0, <0.9.0","artifacts":{"ISaleManager_v_1_3":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ISaleManager.sol/ISaleManager_v_1_3.json"}}},"contracts/sale/v1.3/SaleManager.sol":{"lastModificationDate":1712343847639,"contentHash":"b37cd883bdf89f4054d4212b9a358289","sourceName":"contracts/sale/v1.3/SaleManager.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","contracts/sale/v1.3/ISaleManager.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/security/PullPayment.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/escrow/Escrow.sol"],"versionRequirement":">=0.8.0, <0.9.0","artifacts":{"SaleManager_v_1_3":{"0.8.21+commit.d9974bed.Darwin.appleclang":"SaleManager.sol/SaleManager_v_1_3.json"}}},"contracts/sale/v2/FlatPriceSale.sol":{"lastModificationDate":1715814423957,"contentHash":"02111b33e25d4c142356fdc56df956a6","sourceName":"contracts/sale/v2/FlatPriceSale.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","contracts/sale/v2/Sale.sol","node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/PullPaymentUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/escrow/EscrowUpgradeable.sol"],"versionRequirement":"=0.8.21","artifacts":{"FlatPriceSale":{"0.8.21+commit.d9974bed.Darwin.appleclang":"FlatPriceSale.sol/FlatPriceSale.json"}}},"contracts/sale/v2/FlatPriceSaleFactory.sol":{"lastModificationDate":1712343847640,"contentHash":"e5003c5ada65e67e904fd1e732f7dfb9","sourceName":"contracts/sale/v2/FlatPriceSaleFactory.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","contracts/sale/v2/FlatPriceSale.sol","contracts/sale/v2/Sale.sol","node_modules/@openzeppelin/contracts/proxy/Clones.sol","node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/PullPaymentUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/escrow/EscrowUpgradeable.sol"],"versionRequirement":"=0.8.21","artifacts":{"FlatPriceSaleFactory":{"0.8.21+commit.d9974bed.Darwin.appleclang":"FlatPriceSaleFactory.sol/FlatPriceSaleFactory.json"}}},"contracts/sale/v2/Sale.sol":{"lastModificationDate":1712343847640,"contentHash":"2f696ad7aa277eca204220cfb1f45f3c","sourceName":"contracts/sale/v2/Sale.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"],"versionRequirement":"=0.8.21","artifacts":{"Sale":{"0.8.21+commit.d9974bed.Darwin.appleclang":"v2/Sale.sol/Sale.json"}}},"contracts/sale/v2.1/FlatPriceSale.sol":{"lastModificationDate":1712343847640,"contentHash":"8512bd4140d2627b569cf047095546ce","sourceName":"contracts/sale/v2.1/FlatPriceSale.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","contracts/sale/v2.1/Sale.sol","node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/PullPaymentUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/escrow/EscrowUpgradeable.sol"],"versionRequirement":"=0.8.21","artifacts":{"FlatPriceSale_v_2_1":{"0.8.21+commit.d9974bed.Darwin.appleclang":"FlatPriceSale.sol/FlatPriceSale_v_2_1.json"}}},"contracts/sale/v2.1/FlatPriceSaleFactory.sol":{"lastModificationDate":1712343847640,"contentHash":"711ccbdcec5aad4ee3d4ec359703916d","sourceName":"contracts/sale/v2.1/FlatPriceSaleFactory.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","contracts/sale/v2.1/FlatPriceSale.sol","contracts/sale/v2.1/Sale.sol","node_modules/@openzeppelin/contracts/proxy/Clones.sol","node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/PullPaymentUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/escrow/EscrowUpgradeable.sol"],"versionRequirement":"=0.8.21","artifacts":{"FlatPriceSaleFactory_v_2_1":{"0.8.21+commit.d9974bed.Darwin.appleclang":"FlatPriceSaleFactory.sol/FlatPriceSaleFactory_v_2_1.json"}}},"contracts/sale/v2.1/Sale.sol":{"lastModificationDate":1712343847640,"contentHash":"2f696ad7aa277eca204220cfb1f45f3c","sourceName":"contracts/sale/v2.1/Sale.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol"],"versionRequirement":"=0.8.21","artifacts":{"Sale":{"0.8.21+commit.d9974bed.Darwin.appleclang":"v2.1/Sale.sol/Sale.json"}}},"contracts/token/ERC20.sol":{"lastModificationDate":1712343847640,"contentHash":"f2ded9b545b2be93515fbeb6816b4b0d","sourceName":"contracts/token/ERC20.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/utils/Context.sol"],"versionRequirement":"=0.8.21","artifacts":{"FakeUSDC":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ERC20.sol/FakeUSDC.json"},"FakeUSDT":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ERC20.sol/FakeUSDT.json"},"GenericERC20":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ERC20.sol/GenericERC20.json"}}},"contracts/token/ERC20Votes.sol":{"lastModificationDate":1712343847640,"contentHash":"9b120f1d08839526ae176a8c046ae5df","sourceName":"contracts/token/ERC20Votes.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"MyERC20Votes":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ERC20Votes.sol/MyERC20Votes.json"}}},"contracts/trade/Trader.sol":{"lastModificationDate":1712343847641,"contentHash":"b5eea751b183c1fb31a93ebf0cb8ecf5","sourceName":"contracts/trade/Trader.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IHashflowQuote.sol","contracts/utilities/Sweepable.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol"],"versionRequirement":"=0.8.21","artifacts":{"Trader":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Trader.sol/Trader.json"}}},"contracts/utilities/BatchSendEth.sol":{"lastModificationDate":1712343847641,"contentHash":"b9fb6f1856db531c33184dea091e4d4c","sourceName":"contracts/utilities/BatchSendEth.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"=0.8.21","artifacts":{"BatchSendEth":{"0.8.21+commit.d9974bed.Darwin.appleclang":"BatchSendEth.sol/BatchSendEth.json"}}},"contracts/utilities/FairQueue.sol":{"lastModificationDate":1712343847641,"contentHash":"1e2e75a3e32233a14eb15582a3213034","sourceName":"contracts/utilities/FairQueue.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"=0.8.21","artifacts":{"FairQueue":{"0.8.21+commit.d9974bed.Darwin.appleclang":"FairQueue.sol/FairQueue.json"}}},"contracts/utilities/L2OracleWithSequencerCheck.sol":{"lastModificationDate":1712343847641,"contentHash":"f2079554920fee39f6163f5048083f92","sourceName":"contracts/utilities/L2OracleWithSequencerCheck.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/interfaces/IOracleOrL2OracleWithSequencerCheck.sol","node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"],"versionRequirement":"=0.8.21","artifacts":{"L2OracleWithSequencerCheck":{"0.8.21+commit.d9974bed.Darwin.appleclang":"L2OracleWithSequencerCheck.sol/L2OracleWithSequencerCheck.json"}}},"contracts/utilities/Registry.sol":{"lastModificationDate":1712343847641,"contentHash":"42563c7e8a9c53d6113891d287d60e7d","sourceName":"contracts/utilities/Registry.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/access/AccessControl.sol","node_modules/@openzeppelin/contracts/access/IAccessControl.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol","node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"=0.8.21","artifacts":{"Registry":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Registry.sol/Registry.json"}}},"contracts/utilities/Sweepable.sol":{"lastModificationDate":1712343847641,"contentHash":"c8e815724fb5616cc9269fe2c9813b98","sourceName":"contracts/utilities/Sweepable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol"],"versionRequirement":"=0.8.21","artifacts":{"Sweepable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Sweepable.sol/Sweepable.json"}}},"lib/forge-std/src/Base.sol":{"lastModificationDate":1716932154253,"contentHash":"ee13c050b1914464f1d3f90cde90204b","sourceName":"lib/forge-std/src/Base.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"CommonBase":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Base.sol/CommonBase.json"},"ScriptBase":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Base.sol/ScriptBase.json"},"TestBase":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Base.sol/TestBase.json"}}},"lib/forge-std/src/StdAssertions.sol":{"lastModificationDate":1716932154253,"contentHash":"25b77f9806b64d497b8a46aeb8e5f6f0","sourceName":"lib/forge-std/src/StdAssertions.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdAssertions":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdAssertions.sol/StdAssertions.json"}}},"lib/forge-std/src/StdChains.sol":{"lastModificationDate":1716932154253,"contentHash":"57601f0ea27ff3acc89703dc8d80863f","sourceName":"lib/forge-std/src/StdChains.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdChains":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdChains.sol/StdChains.json"}}},"lib/forge-std/src/StdCheats.sol":{"lastModificationDate":1716932154253,"contentHash":"7922ae0087a21ee3cdb97137be18c06c","sourceName":"lib/forge-std/src/StdCheats.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console2.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdCheats":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdCheats.sol/StdCheats.json"},"StdCheatsSafe":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdCheats.sol/StdCheatsSafe.json"}}},"lib/forge-std/src/StdError.sol":{"lastModificationDate":1716932154254,"contentHash":"64c896e1276a291776e5ea5aecb3870a","sourceName":"lib/forge-std/src/StdError.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdError":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdError.sol/stdError.json"}}},"lib/forge-std/src/StdInvariant.sol":{"lastModificationDate":1716932154254,"contentHash":"d85a0c5be72a5c00e7d462f95ed01df9","sourceName":"lib/forge-std/src/StdInvariant.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdInvariant":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdInvariant.sol/StdInvariant.json"}}},"lib/forge-std/src/StdJson.sol":{"lastModificationDate":1716932154254,"contentHash":"3339192c616789604138e2d8206c0702","sourceName":"lib/forge-std/src/StdJson.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.0, <0.9.0","artifacts":{"stdJson":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdJson.sol/stdJson.json"}}},"lib/forge-std/src/StdMath.sol":{"lastModificationDate":1716932154254,"contentHash":"9da8f453eba6bb98f3d75bc6822bfb29","sourceName":"lib/forge-std/src/StdMath.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdMath":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdMath.sol/stdMath.json"}}},"lib/forge-std/src/StdStorage.sol":{"lastModificationDate":1716932154254,"contentHash":"5955d11c6b4a5e64839b4419e0fe71c4","sourceName":"lib/forge-std/src/StdStorage.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdStorage":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdStorage.sol/stdStorage.json"},"stdStorageSafe":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdStorage.sol/stdStorageSafe.json"}}},"lib/forge-std/src/StdStyle.sol":{"lastModificationDate":1716932154254,"contentHash":"6281165a12aa639705c691fccefd855e","sourceName":"lib/forge-std/src/StdStyle.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"StdStyle":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdStyle.sol/StdStyle.json"}}},"lib/forge-std/src/StdToml.sol":{"lastModificationDate":1716932154254,"contentHash":"2bb543c13f276e5db311aa3b81ed1651","sourceName":"lib/forge-std/src/StdToml.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.0, <0.9.0","artifacts":{"stdToml":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdToml.sol/stdToml.json"}}},"lib/forge-std/src/StdUtils.sol":{"lastModificationDate":1716932154254,"contentHash":"b50717f17f251a2a96a5884c90add7bf","sourceName":"lib/forge-std/src/StdUtils.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/Vm.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdUtils":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StdUtils.sol/StdUtils.json"}}},"lib/forge-std/src/Test.sol":{"lastModificationDate":1716932154254,"contentHash":"b6f15605355fc8c421fe42a90f94bf32","sourceName":"lib/forge-std/src/Test.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Test":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Test.sol/Test.json"}}},"lib/forge-std/src/Vm.sol":{"lastModificationDate":1716932154255,"contentHash":"923caf42aace9a6cf8874d87c2df144e","sourceName":"lib/forge-std/src/Vm.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Vm":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Vm.sol/Vm.json"},"VmSafe":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Vm.sol/VmSafe.json"}}},"lib/forge-std/src/console.sol":{"lastModificationDate":1716932154255,"contentHash":"100b8a33b917da1147740d7ab8b0ded3","sourceName":"lib/forge-std/src/console.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"console":{"0.8.21+commit.d9974bed.Darwin.appleclang":"src/console.sol/console.json"}}},"lib/forge-std/src/console2.sol":{"lastModificationDate":1716932154255,"contentHash":"491ca717c1915995e78cc361485a3067","sourceName":"lib/forge-std/src/console2.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"console2":{"0.8.21+commit.d9974bed.Darwin.appleclang":"console2.sol/console2.json"}}},"lib/forge-std/src/interfaces/IERC165.sol":{"lastModificationDate":1716932154255,"contentHash":"90fe5e2e3ed432d6f3b408e7c9e8a739","sourceName":"lib/forge-std/src/interfaces/IERC165.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.6.2","artifacts":{"IERC165":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC165.sol/IERC165.json"}}},"lib/forge-std/src/interfaces/IERC20.sol":{"lastModificationDate":1716932154255,"contentHash":"8099161d518e5862a76750349d58e801","sourceName":"lib/forge-std/src/interfaces/IERC20.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.6.2","artifacts":{"IERC20":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC20.sol/IERC20.json"}}},"lib/forge-std/src/interfaces/IERC721.sol":{"lastModificationDate":1716932154255,"contentHash":"efc26e7f9a2f76b68088c8760ceae2dc","sourceName":"lib/forge-std/src/interfaces/IERC721.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/interfaces/IERC165.sol"],"versionRequirement":">=0.6.2","artifacts":{"IERC721":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC721.sol/IERC721.json"},"IERC721Enumerable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC721.sol/IERC721Enumerable.json"},"IERC721Metadata":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC721.sol/IERC721Metadata.json"},"IERC721TokenReceiver":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC721.sol/IERC721TokenReceiver.json"}}},"lib/forge-std/src/interfaces/IMulticall3.sol":{"lastModificationDate":1716932154256,"contentHash":"7b131ca1ca32ef6378b7b9ad5488b901","sourceName":"lib/forge-std/src/interfaces/IMulticall3.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"IMulticall3":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IMulticall3.sol/IMulticall3.json"}}},"lib/forge-std/src/mocks/MockERC20.sol":{"lastModificationDate":1716932154256,"contentHash":"8e14d63e81e1d54dbc2d44df38ae9dec","sourceName":"lib/forge-std/src/mocks/MockERC20.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/interfaces/IERC20.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"MockERC20":{"0.8.21+commit.d9974bed.Darwin.appleclang":"MockERC20.sol/MockERC20.json"}}},"lib/forge-std/src/mocks/MockERC721.sol":{"lastModificationDate":1716932154256,"contentHash":"58a77bb0832bf28b8edea8e830e21e63","sourceName":"lib/forge-std/src/mocks/MockERC721.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC721.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"IERC721TokenReceiver":{"0.8.21+commit.d9974bed.Darwin.appleclang":"MockERC721.sol/IERC721TokenReceiver.json"},"MockERC721":{"0.8.21+commit.d9974bed.Darwin.appleclang":"MockERC721.sol/MockERC721.json"}}},"lib/forge-std/src/safeconsole.sol":{"lastModificationDate":1716932154256,"contentHash":"ac3b1bf5a444db5db3656021830258a8","sourceName":"lib/forge-std/src/safeconsole.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"safeconsole":{"0.8.21+commit.d9974bed.Darwin.appleclang":"safeconsole.sol/safeconsole.json"}}},"node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.sol":{"lastModificationDate":1716933555191,"contentHash":"f00f7f6071813249ee968d1114635a81","sourceName":"node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"AggregatorInterface":{"0.8.21+commit.d9974bed.Darwin.appleclang":"AggregatorInterface.sol/AggregatorInterface.json"}}},"node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol":{"lastModificationDate":1716933555192,"contentHash":"8634be6a1c8b65b4c0bfd6d1fa765e72","sourceName":"node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.sol","node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"],"versionRequirement":"^0.8.0","artifacts":{"AggregatorV2V3Interface":{"0.8.21+commit.d9974bed.Darwin.appleclang":"AggregatorV2V3Interface.sol/AggregatorV2V3Interface.json"}}},"node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol":{"lastModificationDate":1716933555192,"contentHash":"d9654a0fc044a31d4106ee6bca772add","sourceName":"node_modules/@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"AggregatorV3Interface":{"0.8.21+commit.d9974bed.Darwin.appleclang":"AggregatorV3Interface.sol/AggregatorV3Interface.json"}}},"node_modules/@openzeppelin/contracts/access/AccessControl.sol":{"lastModificationDate":1716933555193,"contentHash":"a2b1ec38a8dad325a596f926890772b8","sourceName":"node_modules/@openzeppelin/contracts/access/AccessControl.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/access/IAccessControl.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol","node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"^0.8.0","artifacts":{"AccessControl":{"0.8.21+commit.d9974bed.Darwin.appleclang":"AccessControl.sol/AccessControl.json"}}},"node_modules/@openzeppelin/contracts/access/IAccessControl.sol":{"lastModificationDate":1716933555194,"contentHash":"57c84298234411cea19c7c284d86be8b","sourceName":"node_modules/@openzeppelin/contracts/access/IAccessControl.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IAccessControl":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IAccessControl.sol/IAccessControl.json"}}},"node_modules/@openzeppelin/contracts/access/Ownable.sol":{"lastModificationDate":1716933555195,"contentHash":"5a20b2cad87ddb61c7a3a6af21289e28","sourceName":"node_modules/@openzeppelin/contracts/access/Ownable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/utils/Context.sol"],"versionRequirement":"^0.8.0","artifacts":{"Ownable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Ownable.sol/Ownable.json"}}},"node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol":{"lastModificationDate":1716933555274,"contentHash":"e2ea5c24dc3967534a8ac4df343668c2","sourceName":"node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IVotes":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IVotes.sol/IVotes.json"}}},"node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol":{"lastModificationDate":1716933555264,"contentHash":"b1756048024350a162c3be27c04aa652","sourceName":"node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC5267":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC5267.sol/IERC5267.json"}}},"node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol":{"lastModificationDate":1716933555265,"contentHash":"78962c5ba0fec9f6cad8f71cf96ae30b","sourceName":"node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol"],"versionRequirement":"^0.8.0","artifacts":{"IERC5805":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC5805.sol/IERC5805.json"}}},"node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol":{"lastModificationDate":1716933555265,"contentHash":"f9153597c0095dfaa672b15968161166","sourceName":"node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC6372":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC6372.sol/IERC6372.json"}}},"node_modules/@openzeppelin/contracts/proxy/Clones.sol":{"lastModificationDate":1716933555218,"contentHash":"89c075565795af5e3e88fc75642a4af8","sourceName":"node_modules/@openzeppelin/contracts/proxy/Clones.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"Clones":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Clones.sol/Clones.json"}}},"node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol":{"lastModificationDate":1716933555220,"contentHash":"5efeb93e6b1c83c754da2846c2da51a7","sourceName":"node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/utils/Address.sol"],"versionRequirement":"^0.8.2","artifacts":{"Initializable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"proxy/utils/Initializable.sol/Initializable.json"}}},"node_modules/@openzeppelin/contracts/security/PullPayment.sol":{"lastModificationDate":1716933555280,"contentHash":"27e30238eb62d25ed73d17e23ac2a3ca","sourceName":"node_modules/@openzeppelin/contracts/security/PullPayment.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/escrow/Escrow.sol"],"versionRequirement":"^0.8.0","artifacts":{"PullPayment":{"0.8.21+commit.d9974bed.Darwin.appleclang":"PullPayment.sol/PullPayment.json"}}},"node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol":{"lastModificationDate":1716933555281,"contentHash":"1535f8c0c68463f8c1b5239f7584e71f","sourceName":"node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"ReentrancyGuard":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ReentrancyGuard.sol/ReentrancyGuard.json"}}},"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol":{"lastModificationDate":1716933555238,"contentHash":"3ae5166c6827a9cf1a7a462d1632b464","sourceName":"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/utils/Context.sol"],"versionRequirement":"^0.8.0","artifacts":{"ERC20":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ERC20.sol/ERC20.json"}}},"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol":{"lastModificationDate":1716933555239,"contentHash":"df36f7051335cd1e748b1b6463b7fdd3","sourceName":"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC20":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ERC20/IERC20.sol/IERC20.json"}}},"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol":{"lastModificationDate":1716933555234,"contentHash":"4cbcb1f6d01e01a02b6407bb67a78400","sourceName":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"^0.8.0","artifacts":{"ERC20Permit":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ERC20Permit.sol/ERC20Permit.json"}}},"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol":{"lastModificationDate":1716933555235,"contentHash":"c093956f6e012e5967f5377362a91c23","sourceName":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"^0.8.0","artifacts":{"ERC20Votes":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ERC20Votes.sol/ERC20Votes.json"}}},"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"lastModificationDate":1716933555236,"contentHash":"909ab67fc5c25033fe6cd364f8c056f9","sourceName":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"^0.8.0","artifacts":{"IERC20Metadata":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC20Metadata.sol/IERC20Metadata.json"}}},"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol":{"lastModificationDate":1716933555237,"contentHash":"525fcdad8d171312933f47baf01d1ed8","sourceName":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC20Permit":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC20Permit.sol/IERC20Permit.json"}}},"node_modules/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol":{"lastModificationDate":1716933555231,"contentHash":"0ebe4a60af340ba617d3fb68db43c990","sourceName":"node_modules/@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"^0.8.0","artifacts":{}},"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol":{"lastModificationDate":1716933555239,"contentHash":"1b5d667d3740d866eca0352758e59827","sourceName":"node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/utils/Address.sol"],"versionRequirement":"^0.8.0","artifacts":{"SafeERC20":{"0.8.21+commit.d9974bed.Darwin.appleclang":"SafeERC20.sol/SafeERC20.json"}}},"node_modules/@openzeppelin/contracts/utils/Address.sol":{"lastModificationDate":1716933555196,"contentHash":"211ffd288c1588ba8c10eae668ca3c66","sourceName":"node_modules/@openzeppelin/contracts/utils/Address.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.1","artifacts":{"Address":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Address.sol/Address.json"}}},"node_modules/@openzeppelin/contracts/utils/Context.sol":{"lastModificationDate":1716933555201,"contentHash":"f07feb4a44b1a4872370da5aa70e8e46","sourceName":"node_modules/@openzeppelin/contracts/utils/Context.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"Context":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Context.sol/Context.json"}}},"node_modules/@openzeppelin/contracts/utils/Counters.sol":{"lastModificationDate":1716933555202,"contentHash":"74654e3ae5d7f39555055dfe244dab7a","sourceName":"node_modules/@openzeppelin/contracts/utils/Counters.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"Counters":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Counters.sol/Counters.json"}}},"node_modules/@openzeppelin/contracts/utils/ShortStrings.sol":{"lastModificationDate":1716933555215,"contentHash":"8dde288da49722a70f34ee369be4bfba","sourceName":"node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/utils/StorageSlot.sol"],"versionRequirement":"^0.8.8","artifacts":{"ShortStrings":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ShortStrings.sol/ShortStrings.json"}}},"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol":{"lastModificationDate":1716933555215,"contentHash":"682f7dd1f2e1147c8390e7575deceb2d","sourceName":"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"StorageSlot":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StorageSlot.sol/StorageSlot.json"}}},"node_modules/@openzeppelin/contracts/utils/Strings.sol":{"lastModificationDate":1716933555216,"contentHash":"48686fc32a22a3754b8e63321857dd2a","sourceName":"node_modules/@openzeppelin/contracts/utils/Strings.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"^0.8.0","artifacts":{"Strings":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Strings.sol/Strings.json"}}},"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol":{"lastModificationDate":1716933555206,"contentHash":"d822a8a9468649cab463f29f5decf5cc","sourceName":"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"^0.8.0","artifacts":{"ECDSA":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ECDSA.sol/ECDSA.json"}}},"node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol":{"lastModificationDate":1716933555206,"contentHash":"459aeb9cc3fc3c6d67d30ffefb724aba","sourceName":"node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"^0.8.8","artifacts":{"EIP712":{"0.8.21+commit.d9974bed.Darwin.appleclang":"EIP712.sol/EIP712.json"}}},"node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol":{"lastModificationDate":1716933555207,"contentHash":"1ccd3348ad628f1330ce36eb6a30618d","sourceName":"node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"MerkleProof":{"0.8.21+commit.d9974bed.Darwin.appleclang":"MerkleProof.sol/MerkleProof.json"}}},"node_modules/@openzeppelin/contracts/utils/escrow/Escrow.sol":{"lastModificationDate":1716933555201,"contentHash":"b74451c81ede541b2d4b5d2300b94c4a","sourceName":"node_modules/@openzeppelin/contracts/utils/escrow/Escrow.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol"],"versionRequirement":"^0.8.0","artifacts":{"Escrow":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Escrow.sol/Escrow.json"}}},"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol":{"lastModificationDate":1716933555208,"contentHash":"0e7db055ce108f9da7bb6686a00287c0","sourceName":"node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol"],"versionRequirement":"^0.8.0","artifacts":{"ERC165":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ERC165.sol/ERC165.json"}}},"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol":{"lastModificationDate":1716933555210,"contentHash":"03e6768535ac4da0e9756f1d8a4a018a","sourceName":"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC165":{"0.8.21+commit.d9974bed.Darwin.appleclang":"introspection/IERC165.sol/IERC165.json"}}},"node_modules/@openzeppelin/contracts/utils/math/Math.sol":{"lastModificationDate":1716933555211,"contentHash":"fe63409d8a06818b926cf89e0ea88b1b","sourceName":"node_modules/@openzeppelin/contracts/utils/math/Math.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"Math":{"0.8.21+commit.d9974bed.Darwin.appleclang":"Math.sol/Math.json"}}},"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol":{"lastModificationDate":1716933555212,"contentHash":"67cf2dfe1d1c22b4ea7f242e8a17f431","sourceName":"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"SafeCast":{"0.8.21+commit.d9974bed.Darwin.appleclang":"SafeCast.sol/SafeCast.json"}}},"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol":{"lastModificationDate":1716933555214,"contentHash":"9488ebd4daacfee8ad04811600d7d061","sourceName":"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"SignedMath":{"0.8.21+commit.d9974bed.Darwin.appleclang":"SignedMath.sol/SignedMath.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol":{"lastModificationDate":1716933555106,"contentHash":"778fd3f58957398e5dae6d05912fa924","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"AccessControlUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"AccessControlUpgradeable.sol/AccessControlUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol":{"lastModificationDate":1716933555107,"contentHash":"21b43d1337ebc77c11da3cbe3fd65316","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IAccessControlUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IAccessControlUpgradeable.sol/IAccessControlUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol":{"lastModificationDate":1716933555107,"contentHash":"403ce8273abde646bff81558ddf512ad","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"OwnableUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"OwnableUpgradeable.sol/OwnableUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol":{"lastModificationDate":1716933555193,"contentHash":"d935e3ff0a823cfd09062d7bab115224","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"GovernorUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"GovernorUpgradeable.sol/GovernorUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol":{"lastModificationDate":1716933555193,"contentHash":"8e0b9435dc076548be1e651319a4bab0","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"IGovernorUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IGovernorUpgradeable.sol/IGovernorUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/governance/TimelockControllerUpgradeable.sol":{"lastModificationDate":1716933555195,"contentHash":"5646d8a089b2178798508fc14e0235b1","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/governance/TimelockControllerUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"TimelockControllerUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TimelockControllerUpgradeable.sol/TimelockControllerUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorCountingSimpleUpgradeable.sol":{"lastModificationDate":1716933555189,"contentHash":"d313e739d9157231fe22f1a01fd149ba","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorCountingSimpleUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"GovernorCountingSimpleUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"GovernorCountingSimpleUpgradeable.sol/GovernorCountingSimpleUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorTimelockControlUpgradeable.sol":{"lastModificationDate":1716933555191,"contentHash":"2d06c42433255ad1539e7caabe8e47a0","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorTimelockControlUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/TimelockControllerUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/IGovernorTimelockUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"GovernorTimelockControlUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"GovernorTimelockControlUpgradeable.sol/GovernorTimelockControlUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol":{"lastModificationDate":1716933555192,"contentHash":"79fc8103a37cfcb493df0c072fbb6347","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesQuorumFractionUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/CheckpointsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"GovernorVotesQuorumFractionUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"GovernorVotesQuorumFractionUpgradeable.sol/GovernorVotesQuorumFractionUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesUpgradeable.sol":{"lastModificationDate":1716933555192,"contentHash":"809326938ad7c3d72ba9d7c01c2200c9","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/GovernorVotesUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/governance/GovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"GovernorVotesUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"GovernorVotesUpgradeable.sol/GovernorVotesUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/IGovernorTimelockUpgradeable.sol":{"lastModificationDate":1716933555192,"contentHash":"9d5973e663745df2304f02bb7c4b4078","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/governance/extensions/IGovernorTimelockUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"IGovernorTimelockUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IGovernorTimelockUpgradeable.sol/IGovernorTimelockUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol":{"lastModificationDate":1716933555194,"contentHash":"432a27bbcb26badb3d40e9fb214d09f9","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IVotesUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IVotesUpgradeable.sol/IVotesUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol":{"lastModificationDate":1716933555156,"contentHash":"a6883cfd85607b16c121a02728369eb3","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC1822ProxiableUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"draft-IERC1822Upgradeable.sol/IERC1822ProxiableUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol":{"lastModificationDate":1716933555123,"contentHash":"d1ceeaa35b60471b1c6e50d29d70354a","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol"],"versionRequirement":"^0.8.2","artifacts":{"ERC1967UpgradeUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ERC1967UpgradeUpgradeable.sol/ERC1967UpgradeUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol":{"lastModificationDate":1716933555124,"contentHash":"21bffd733b4ca013e125a0ffe2e52254","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IBeaconUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IBeaconUpgradeable.sol/IBeaconUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol":{"lastModificationDate":1716933555124,"contentHash":"b98e2f3a856e6e7f2106fb919bacab9e","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"],"versionRequirement":"^0.8.2","artifacts":{"Initializable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"utils/Initializable.sol/Initializable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol":{"lastModificationDate":1716933555125,"contentHash":"eb2268e7f08e65339fdf577dad98c925","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"UUPSUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"UUPSUpgradeable.sol/UUPSUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/security/PullPaymentUpgradeable.sol":{"lastModificationDate":1716933555201,"contentHash":"5a5e8a9192991977008d4bc53e0688c7","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/security/PullPaymentUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/escrow/EscrowUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"PullPaymentUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"PullPaymentUpgradeable.sol/PullPaymentUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol":{"lastModificationDate":1716933555201,"contentHash":"c9cde6037fc8b1fe0ef04b79149ba733","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"ReentrancyGuardUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ReentrancyGuardUpgradeable.sol/ReentrancyGuardUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol":{"lastModificationDate":1716933555151,"contentHash":"eb51ed084f6f7fd2c7098715c5690285","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"IERC1155ReceiverUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC1155ReceiverUpgradeable.sol/IERC1155ReceiverUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol":{"lastModificationDate":1716933555137,"contentHash":"a9ed3c7bc7d9ebb5e34f20829274f088","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC20Upgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC20Upgradeable.sol/IERC20Upgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol":{"lastModificationDate":1716933555132,"contentHash":"afab576c4d1f55fbf293a0daf3826e31","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC20PermitUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"draft-IERC20PermitUpgradeable.sol/IERC20PermitUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol":{"lastModificationDate":1716933555138,"contentHash":"c7dc9c967eb71371d53462f02b280441","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/token/ERC20/extensions/draft-IERC20PermitUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"SafeERC20Upgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"SafeERC20Upgradeable.sol/SafeERC20Upgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol":{"lastModificationDate":1716933555145,"contentHash":"ba28cf60b52b00d2b3a190bcdf0952bd","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC721ReceiverUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC721ReceiverUpgradeable.sol/IERC721ReceiverUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol":{"lastModificationDate":1716933555108,"contentHash":"d42e87f4fba2b03ab4d3c14cb53d0c51","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.1","artifacts":{"AddressUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"AddressUpgradeable.sol/AddressUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/CheckpointsUpgradeable.sol":{"lastModificationDate":1716933555112,"contentHash":"4314aafe8c4cb988ebb9468321c3c63a","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/CheckpointsUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"CheckpointsUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"CheckpointsUpgradeable.sol/CheckpointsUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol":{"lastModificationDate":1716933555113,"contentHash":"6200b84950eb05b4a92a39fd1d6e0f9b","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"ContextUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ContextUpgradeable.sol/ContextUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol":{"lastModificationDate":1716933555122,"contentHash":"731fafe5fdaca6e0749253ab7ce7d3b9","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"StorageSlotUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StorageSlotUpgradeable.sol/StorageSlotUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol":{"lastModificationDate":1716933555122,"contentHash":"b9d00086379b2524eb287c850a1b2e54","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"StringsUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"StringsUpgradeable.sol/StringsUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol":{"lastModificationDate":1716933555122,"contentHash":"0e886b0051ad9fe6a184a14f9b6ee09b","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"TimersUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TimersUpgradeable.sol/TimersUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol":{"lastModificationDate":1716933555115,"contentHash":"57eba3b8fbf5ed2f2baa7dfdb7beb693","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"ECDSAUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ECDSAUpgradeable.sol/ECDSAUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol":{"lastModificationDate":1716933555116,"contentHash":"17244e83d3735150886b6f28cc750364","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/MerkleProofUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"MerkleProofUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"MerkleProofUpgradeable.sol/MerkleProofUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol":{"lastModificationDate":1716933555115,"contentHash":"58bfd44eb122c6d88351e8eda0590068","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/draft-EIP712Upgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"EIP712Upgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"draft-EIP712Upgradeable.sol/EIP712Upgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/escrow/EscrowUpgradeable.sol":{"lastModificationDate":1716933555113,"contentHash":"5ed77894765f276d2db8ed4ae2d6d706","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/escrow/EscrowUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"EscrowUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"EscrowUpgradeable.sol/EscrowUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol":{"lastModificationDate":1716933555117,"contentHash":"5f2d8b81c0ff5bd2047b4846c20b998d","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol"],"versionRequirement":"^0.8.0","artifacts":{"ERC165Upgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ERC165Upgradeable.sol/ERC165Upgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol":{"lastModificationDate":1716933555118,"contentHash":"d6ecf203a5e72c845be9bbf2f304a289","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC165Upgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"IERC165Upgradeable.sol/IERC165Upgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol":{"lastModificationDate":1716933555119,"contentHash":"bd2782c8789a3d3084d67c351a55ab92","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"MathUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"MathUpgradeable.sol/MathUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol":{"lastModificationDate":1716933555120,"contentHash":"00d9c0b8534f648176c53b50a914c19a","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":"^0.8.0","artifacts":{"SafeCastUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"SafeCastUpgradeable.sol/SafeCastUpgradeable.json"}}},"node_modules/@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol":{"lastModificationDate":1716933555110,"contentHash":"a22ef83e69eaff73736c74e7020b8bcf","sourceName":"node_modules/@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["node_modules/@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol"],"versionRequirement":"^0.8.4","artifacts":{"DoubleEndedQueueUpgradeable":{"0.8.21+commit.d9974bed.Darwin.appleclang":"DoubleEndedQueueUpgradeable.sol/DoubleEndedQueueUpgradeable.json"}}},"node_modules/hardhat/console.sol":{"lastModificationDate":1716933555996,"contentHash":"896f68942c3a20e9ae3c3c5bfd3add54","sourceName":"node_modules/hardhat/console.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":[],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"console":{"0.8.21+commit.d9974bed.Darwin.appleclang":"console.sol/console.json"}}},"test/foundry/ContinuousVestingMerkleDistributor.t.sol":{"lastModificationDate":1716931299619,"contentHash":"c1f82cafb917ea4b5880313d58a5fc30","sourceName":"test/foundry/ContinuousVestingMerkleDistributor.t.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/factory/AdvancedDistributorInitializable.sol","contracts/claim/factory/ContinuousVestingInitializable.sol","contracts/claim/factory/ContinuousVestingMerkleDistributor.sol","contracts/claim/factory/ContinuousVestingMerkleDistributorFactory.sol","contracts/claim/factory/DistributorInitializable.sol","contracts/claim/factory/FairQueueInitializable.sol","contracts/claim/factory/MerkleSetInitializable.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IContinuousVesting.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/IVoting.sol","contracts/utilities/Sweepable.sol","lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Test.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/proxy/Clones.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"^0.8.21","artifacts":{"ContinuousVestingMerkleDistributorTest":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ContinuousVestingMerkleDistributor.t.sol/ContinuousVestingMerkleDistributorTest.json"}}},"test/foundry/ContinuousVestingMerkleDistributorFactory.t.sol":{"lastModificationDate":1716933807808,"contentHash":"595cc01c6fcbbffec8d59616c4b6dcb6","sourceName":"test/foundry/ContinuousVestingMerkleDistributorFactory.t.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/factory/AdvancedDistributorInitializable.sol","contracts/claim/factory/ContinuousVestingInitializable.sol","contracts/claim/factory/ContinuousVestingMerkleDistributor.sol","contracts/claim/factory/ContinuousVestingMerkleDistributorFactory.sol","contracts/claim/factory/DistributorInitializable.sol","contracts/claim/factory/FairQueueInitializable.sol","contracts/claim/factory/MerkleSetInitializable.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IContinuousVesting.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/IVoting.sol","contracts/utilities/Sweepable.sol","lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Test.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/proxy/Clones.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"^0.8.21","artifacts":{"ContinuousVestingMerkleDistributorFactoryTest":{"0.8.21+commit.d9974bed.Darwin.appleclang":"ContinuousVestingMerkleDistributorFactory.t.sol/ContinuousVestingMerkleDistributorFactoryTest.json"}}},"test/foundry/TrancheVestingMerkleDistributor.t.sol":{"lastModificationDate":1716933809871,"contentHash":"ea370dba3cde5a1d9cb3c32ec7be3098","sourceName":"test/foundry/TrancheVestingMerkleDistributor.t.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/factory/AdvancedDistributorInitializable.sol","contracts/claim/factory/DistributorInitializable.sol","contracts/claim/factory/FairQueueInitializable.sol","contracts/claim/factory/MerkleSetInitializable.sol","contracts/claim/factory/TrancheVestingInitializable.sol","contracts/claim/factory/TrancheVestingMerkleDistributor.sol","contracts/claim/factory/TrancheVestingMerkleDistributorFactory.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/ITrancheVesting.sol","contracts/interfaces/IVoting.sol","contracts/utilities/Sweepable.sol","lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Test.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/proxy/Clones.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"^0.8.21","artifacts":{"TrancheVestingMerkleDistributorTest":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TrancheVestingMerkleDistributor.t.sol/TrancheVestingMerkleDistributorTest.json"}}},"test/foundry/TrancheVestingMerkleDistributorFactory.t.sol":{"lastModificationDate":1716933812500,"contentHash":"7e191b9b222c813b0d9878dc737968d1","sourceName":"test/foundry/TrancheVestingMerkleDistributorFactory.t.sol","solcConfig":{"settings":{"optimizer":{"enabled":true,"runs":200},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"]}},"evmVersion":"paris","viaIR":true,"libraries":{}}},"imports":["contracts/claim/factory/AdvancedDistributorInitializable.sol","contracts/claim/factory/DistributorInitializable.sol","contracts/claim/factory/FairQueueInitializable.sol","contracts/claim/factory/MerkleSetInitializable.sol","contracts/claim/factory/TrancheVestingInitializable.sol","contracts/claim/factory/TrancheVestingMerkleDistributor.sol","contracts/claim/factory/TrancheVestingMerkleDistributorFactory.sol","contracts/interfaces/IAdjustable.sol","contracts/interfaces/IDistributor.sol","contracts/interfaces/IMerkleSet.sol","contracts/interfaces/ITrancheVesting.sol","contracts/interfaces/IVoting.sol","contracts/utilities/Sweepable.sol","lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Test.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","node_modules/@openzeppelin/contracts/access/Ownable.sol","node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol","node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol","node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol","node_modules/@openzeppelin/contracts/proxy/Clones.sol","node_modules/@openzeppelin/contracts/proxy/utils/Initializable.sol","node_modules/@openzeppelin/contracts/security/ReentrancyGuard.sol","node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol","node_modules/@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@openzeppelin/contracts/utils/Address.sol","node_modules/@openzeppelin/contracts/utils/Context.sol","node_modules/@openzeppelin/contracts/utils/Counters.sol","node_modules/@openzeppelin/contracts/utils/ShortStrings.sol","node_modules/@openzeppelin/contracts/utils/StorageSlot.sol","node_modules/@openzeppelin/contracts/utils/Strings.sol","node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol","node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol","node_modules/@openzeppelin/contracts/utils/cryptography/MerkleProof.sol","node_modules/@openzeppelin/contracts/utils/math/Math.sol","node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol","node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol"],"versionRequirement":"^0.8.21","artifacts":{"TrancheVestingMerkleDistributorFactoryTest":{"0.8.21+commit.d9974bed.Darwin.appleclang":"TrancheVestingMerkleDistributorFactory.t.sol/TrancheVestingMerkleDistributorFactoryTest.json"}}}}} \ No newline at end of file diff --git a/packages/hardhat/config/index.d.ts b/packages/hardhat/config/index.d.ts new file mode 100644 index 00000000..fc5c3020 --- /dev/null +++ b/packages/hardhat/config/index.d.ts @@ -0,0 +1,3 @@ +// config/index.d.ts +export const merkleRoots: { [key: string]: string }; +export const campaignCIDs: { [key: string]: string }; diff --git a/packages/hardhat/config/index.js b/packages/hardhat/config/index.js index 6610433d..1338732c 100644 --- a/packages/hardhat/config/index.js +++ b/packages/hardhat/config/index.js @@ -6,13 +6,13 @@ const addresses = { }; const merkleRoots = { - public: '0x0000000000000000000000000000000000000000000000000000000000000000', - tokensoftDevs: '0xb613dab8b7189ee0286275425d0d77df7cbb7550ba579c1a70def1b1acb931a2' + public: "0x0000000000000000000000000000000000000000000000000000000000000000", + tokensoftDevs: "0xb613dab8b7189ee0286275425d0d77df7cbb7550ba579c1a70def1b1acb931a2", }; const campaignCIDs = { basicSale: "Qma51yJyJBKgxLVc9feg4b9RSuMq1ynrfqs5vEZkZyC4Zi", - tokensoftDevsOnlySale: "Qma51yJyJBKgxLVc9feg4b9RSuMq1ynrfqs5vEZkZyC4Zi" + tokensoftDevsOnlySale: "Qma51yJyJBKgxLVc9feg4b9RSuMq1ynrfqs5vEZkZyC4Zi", }; const dateTimestamps = { @@ -28,11 +28,10 @@ const uints = { }; const merkleData = { - rootZero: ethers.constants.HashZero, // 0x0 + rootZero: ethers.ZeroHash, // 0x0 balancedTree, simpleClaimTree: { - merkleRoot: - "0x080658a34ceaef57f8ed16606943f19b652009929c038cc578fb0ccebbc75fdc", + merkleRoot: "0x080658a34ceaef57f8ed16606943f19b652009929c038cc578fb0ccebbc75fdc", proofs: simpleProofsArray, }, }; @@ -43,5 +42,5 @@ module.exports = { dateTimestamps, uints, merkleData, - merkleRoots + merkleRoots, }; diff --git a/packages/hardhat/config/merkleData.js b/packages/hardhat/config/merkleData.js index f5b79038..1cf71d16 100644 --- a/packages/hardhat/config/merkleData.js +++ b/packages/hardhat/config/merkleData.js @@ -13,9 +13,7 @@ const simpleProofsArray = [ index: 1, account: "0x8Cf384fe1810ce413CBc3A8d20a752E5a48aaDc0", amount: 5000000000000000000000, - merkleProof: [ - "0x60c928dce63da75777e33948201751a726c783a7ff46c2eab1fab21673159300", - ], + merkleProof: ["0x60c928dce63da75777e33948201751a726c783a7ff46c2eab1fab21673159300"], }, { index: 2, @@ -40,8 +38,7 @@ const simpleProofsArray = [ ]; const balancedTree = { - merkleRoot: - "0xe117ba62b4a23109e269a2f3706c12627adc8245a6aa786804b20fa150508177", + merkleRoot: "0xe117ba62b4a23109e269a2f3706c12627adc8245a6aa786804b20fa150508177", totalDistributionAmount: "30000000000000000000000", "0xa4673B9e26aF90eeCe783f55eA85188c391A481C": { index: 0, diff --git a/packages/hardhat/contracts/claim/BasicDistributor.sol b/packages/hardhat/contracts/claim/BasicDistributor.sol index 7163c3ca..376c5fbd 100644 --- a/packages/hardhat/contracts/claim/BasicDistributor.sol +++ b/packages/hardhat/contracts/claim/BasicDistributor.sol @@ -29,7 +29,8 @@ contract BasicDistributor is AdvancedDistributor { function getVestedFraction( address, /*beneficiary*/ - uint256 /*time*/ + uint256, /*time*/ + bytes memory /*data*/ ) public view override returns (uint256) { // all tokens vest immediately return fractionDenominator; @@ -45,7 +46,7 @@ contract BasicDistributor is AdvancedDistributor { function claim(address beneficiary) external nonReentrant { // effects - uint256 claimedAmount = super._executeClaim(beneficiary, records[beneficiary].total); + uint256 claimedAmount = super._executeClaim(beneficiary, records[beneficiary].total, new bytes(0)); // interactions super._settleClaim(beneficiary, claimedAmount); } diff --git a/packages/hardhat/contracts/claim/ContinuousVestingMerkle.sol b/packages/hardhat/contracts/claim/ContinuousVestingMerkle.sol index 2269766e..b21f091b 100644 --- a/packages/hardhat/contracts/claim/ContinuousVestingMerkle.sol +++ b/packages/hardhat/contracts/claim/ContinuousVestingMerkle.sol @@ -63,7 +63,7 @@ contract ContinuousVestingMerkle is ContinuousVesting, MerkleSet { nonReentrant { // effects - uint256 claimedAmount = super._executeClaim(beneficiary, totalAmount); + uint256 claimedAmount = super._executeClaim(beneficiary, totalAmount, new bytes(0)); // interactions super._settleClaim(beneficiary, claimedAmount); } diff --git a/packages/hardhat/contracts/claim/PerAddressContinuousVestingMerkle.sol b/packages/hardhat/contracts/claim/PerAddressContinuousVestingMerkle.sol new file mode 100644 index 00000000..a7af4485 --- /dev/null +++ b/packages/hardhat/contracts/claim/PerAddressContinuousVestingMerkle.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.21; + +import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; + +import { PerAddressContinuousVesting } from './abstract/PerAddressContinuousVesting.sol'; +import { MerkleSet } from './abstract/MerkleSet.sol'; + +contract PerAddressContinuousVestingMerkle is PerAddressContinuousVesting, MerkleSet { + + constructor( + IERC20 _token, // the token being claimed + uint256 _total, // the total claimable by all users + string memory _uri, // information on the sale (e.g. merkle proofs) + uint256 _voteFactor, // votes have this weight + bytes32 _merkleRoot, // the merkle root for claim membership (also used as salt for the fair queue delay time), + uint160 _maxDelayTime // the maximum delay time for the fair queue + ) + PerAddressContinuousVesting( + _token, + _total, + _uri, + _voteFactor, + _maxDelayTime, + uint160(uint256(_merkleRoot)) + ) + MerkleSet(_merkleRoot) + {} + + function NAME() external pure override returns (string memory) { + return 'PerAddressContinuousVestingMerkle'; + } + + function VERSION() external pure override returns (uint256) { + return 4; + } + + function initializeDistributionRecord( + uint256 index, // the beneficiary's index in the merkle root + address beneficiary, // the address that will receive tokens + uint256 amount, // the total claimable by this beneficiary + uint256 start, // the start of the vesting period + uint256 cliff, // cliff time + uint256 end, // the end of the vesting period + bytes32[] calldata merkleProof + ) + external + validMerkleProof(keccak256(abi.encodePacked(index, beneficiary, amount, start, cliff, end)), merkleProof) + { + _initializeDistributionRecord(beneficiary, amount); + } + + function claim( + uint256 index, // the beneficiary's index in the merkle root + address beneficiary, // the address that will receive tokens + uint256 totalAmount, // the total claimable by this beneficiary + uint256 start, // the start of the vesting period + uint256 cliff, // cliff time + uint256 end, // the end of the vesting period + bytes32[] calldata merkleProof + ) + external + validMerkleProof(keccak256(abi.encodePacked(index, beneficiary, totalAmount, start, cliff, end)), merkleProof) + nonReentrant + { + // effects + uint256 claimedAmount = _executeClaim(beneficiary, totalAmount, new bytes(0)); + // interactions + _settleClaim(beneficiary, claimedAmount); + } + + function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { + _setMerkleRoot(_merkleRoot); + } +} diff --git a/packages/hardhat/contracts/claim/PerAddressTrancheVestingMerkle.sol b/packages/hardhat/contracts/claim/PerAddressTrancheVestingMerkle.sol new file mode 100644 index 00000000..e7aa9090 --- /dev/null +++ b/packages/hardhat/contracts/claim/PerAddressTrancheVestingMerkle.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.21; + +import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; + +import { PerAddressTrancheVesting, Tranche } from './abstract/PerAddressTrancheVesting.sol'; +import { MerkleSet } from './abstract/MerkleSet.sol'; + +contract PerAddressTrancheVestingMerkle is PerAddressTrancheVesting, MerkleSet { + constructor( + IERC20 _token, + uint256 _total, + string memory _uri, // information on the sale (e.g. merkle proofs) + uint256 _voteFactor, + bytes32 _merkleRoot, + uint160 _maxDelayTime // the maximum delay time for the fair queue + ) + PerAddressTrancheVesting( + _token, + _total, + _uri, + _voteFactor, + _maxDelayTime, + uint160(uint256(_merkleRoot)) + ) + MerkleSet(_merkleRoot) + {} + + function NAME() external pure override returns (string memory) { + return 'PerAddressTrancheVestingMerkle'; + } + + function VERSION() external pure override returns (uint256) { + return 4; + } + + function initializeDistributionRecord( + uint256 index, // the beneficiary's index in the merkle root + address beneficiary, // the address that will receive tokens + uint256 amount, // the total claimable by this beneficiary + Tranche[] calldata tranches, // the tranches for the beneficiary (users can have different vesting schedules) + bytes32[] calldata merkleProof + ) + external + validMerkleProof(keccak256(abi.encodePacked(index, beneficiary, amount, abi.encode(tranches))), merkleProof) + { + _initializeDistributionRecord(beneficiary, amount); + } + + function claim( + uint256 index, // the beneficiary's index in the merkle root + address beneficiary, // the address that will receive tokens + uint256 totalAmount, // the total claimable by this beneficiary + // TODO: should we be providing the tranches already abi encoded to save gas? + Tranche[] calldata tranches, // the tranches for the beneficiary (users can have different vesting schedules) + bytes32[] calldata merkleProof + ) + external + validMerkleProof(keccak256(abi.encodePacked(index, beneficiary, totalAmount, abi.encode(tranches))), merkleProof) + nonReentrant + { + bytes memory data = abi.encode(tranches); + // effects + uint256 claimedAmount = _executeClaim(beneficiary, totalAmount, data); + // interactions + _settleClaim(beneficiary, claimedAmount); + } + + function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { + _setMerkleRoot(_merkleRoot); + } +} diff --git a/packages/hardhat/contracts/claim/PriceTierVestingMerkle.sol b/packages/hardhat/contracts/claim/PriceTierVestingMerkle.sol index 5df561cc..ad4ad970 100644 --- a/packages/hardhat/contracts/claim/PriceTierVestingMerkle.sol +++ b/packages/hardhat/contracts/claim/PriceTierVestingMerkle.sol @@ -69,7 +69,7 @@ contract PriceTierVestingMerkle is PriceTierVesting, MerkleSet { nonReentrant { // effects - uint256 claimedAmount = _executeClaim(beneficiary, totalAmount); + uint256 claimedAmount = _executeClaim(beneficiary, totalAmount, new bytes(0)); // interactions _settleClaim(beneficiary, claimedAmount); } diff --git a/packages/hardhat/contracts/claim/PriceTierVestingSale_2_0.sol b/packages/hardhat/contracts/claim/PriceTierVestingSale_2_0.sol index f0262eb5..9fdcdcff 100644 --- a/packages/hardhat/contracts/claim/PriceTierVestingSale_2_0.sol +++ b/packages/hardhat/contracts/claim/PriceTierVestingSale_2_0.sol @@ -100,7 +100,7 @@ contract PriceTierVestingSale_2_0 is PriceTierVesting { uint256 totalClaimableAmount = getTotalClaimableAmount(beneficiary); // effects - uint256 claimedAmount = super._executeClaim(beneficiary, totalClaimableAmount); + uint256 claimedAmount = super._executeClaim(beneficiary, totalClaimableAmount, new bytes(0)); // interactions super._settleClaim(beneficiary, claimedAmount); @@ -119,12 +119,12 @@ contract PriceTierVestingSale_2_0 is PriceTierVesting { } // get the number of tokens currently claimable by a specific user - function getClaimableAmount(address beneficiary) public view override returns (uint256) { - if (records[beneficiary].initialized) return super.getClaimableAmount(beneficiary); + function getClaimableAmount(address beneficiary, bytes memory data) public view override returns (uint256) { + if (records[beneficiary].initialized) return super.getClaimableAmount(beneficiary, data); // we can get the claimable amount prior to initialization return - (getPurchasedAmount(beneficiary) * getVestedFraction(beneficiary, block.timestamp)) / + (getPurchasedAmount(beneficiary) * getVestedFraction(beneficiary, block.timestamp, new bytes(0))) / fractionDenominator; } diff --git a/packages/hardhat/contracts/claim/TrancheVestingMerkle.sol b/packages/hardhat/contracts/claim/TrancheVestingMerkle.sol index 90675c68..79f3b3e7 100644 --- a/packages/hardhat/contracts/claim/TrancheVestingMerkle.sol +++ b/packages/hardhat/contracts/claim/TrancheVestingMerkle.sol @@ -59,7 +59,7 @@ contract TrancheVestingMerkle is TrancheVesting, MerkleSet { nonReentrant { // effects - uint256 claimedAmount = _executeClaim(beneficiary, totalAmount); + uint256 claimedAmount = _executeClaim(beneficiary, totalAmount, new bytes(0)); // interactions _settleClaim(beneficiary, claimedAmount); } diff --git a/packages/hardhat/contracts/claim/TrancheVestingSale_1_3.sol b/packages/hardhat/contracts/claim/TrancheVestingSale_1_3.sol index 4768548a..5a128392 100644 --- a/packages/hardhat/contracts/claim/TrancheVestingSale_1_3.sol +++ b/packages/hardhat/contracts/claim/TrancheVestingSale_1_3.sol @@ -92,7 +92,7 @@ contract TrancheVestingSale_1_3 is TrancheVesting { uint256 totalClaimableAmount = getTotalClaimableAmount(beneficiary); // effects - uint256 claimedAmount = super._executeClaim(beneficiary, totalClaimableAmount); + uint256 claimedAmount = super._executeClaim(beneficiary, totalClaimableAmount, new bytes(0)); // interactions super._settleClaim(beneficiary, claimedAmount); @@ -111,12 +111,12 @@ contract TrancheVestingSale_1_3 is TrancheVesting { } // get the number of tokens currently claimable by a specific user - function getClaimableAmount(address beneficiary) public view override returns (uint256) { - if (records[beneficiary].initialized) return super.getClaimableAmount(beneficiary); + function getClaimableAmount(address beneficiary, bytes memory data) public view override returns (uint256) { + if (records[beneficiary].initialized) return super.getClaimableAmount(beneficiary, data); // we can get the claimable amount prior to initialization return - (getPurchasedAmount(beneficiary) * getVestedFraction(beneficiary, block.timestamp)) / + (getPurchasedAmount(beneficiary) * getVestedFraction(beneficiary, block.timestamp, new bytes(0))) / fractionDenominator; } diff --git a/packages/hardhat/contracts/claim/TrancheVestingSale_2_0.sol b/packages/hardhat/contracts/claim/TrancheVestingSale_2_0.sol index 950bda22..6dace602 100644 --- a/packages/hardhat/contracts/claim/TrancheVestingSale_2_0.sol +++ b/packages/hardhat/contracts/claim/TrancheVestingSale_2_0.sol @@ -90,7 +90,7 @@ contract TrancheVestingSale_2_0 is TrancheVesting { uint256 totalClaimableAmount = getTotalClaimableAmount(beneficiary); // effects - uint256 claimedAmount = super._executeClaim(beneficiary, totalClaimableAmount); + uint256 claimedAmount = super._executeClaim(beneficiary, totalClaimableAmount, new bytes(0)); // interactions _settleClaim(beneficiary, claimedAmount); @@ -109,12 +109,12 @@ contract TrancheVestingSale_2_0 is TrancheVesting { } // get the number of tokens currently claimable by a specific user - function getClaimableAmount(address beneficiary) public view override returns (uint256) { - if (records[beneficiary].initialized) return super.getClaimableAmount(beneficiary); + function getClaimableAmount(address beneficiary, bytes memory data) public view override returns (uint256) { + if (records[beneficiary].initialized) return super.getClaimableAmount(beneficiary, data); // we can get the claimable amount prior to initialization return - (getPurchasedAmount(beneficiary) * getVestedFraction(beneficiary, block.timestamp)) / + (getPurchasedAmount(beneficiary) * getVestedFraction(beneficiary, block.timestamp, new bytes(0))) / fractionDenominator; } diff --git a/packages/hardhat/contracts/claim/abstract/AdvancedDistributor.sol b/packages/hardhat/contracts/claim/abstract/AdvancedDistributor.sol index cc7b9a81..b0b251f0 100644 --- a/packages/hardhat/contracts/claim/abstract/AdvancedDistributor.sol +++ b/packages/hardhat/contracts/claim/abstract/AdvancedDistributor.sol @@ -101,9 +101,10 @@ abstract contract AdvancedDistributor is function _executeClaim( address beneficiary, - uint256 totalAmount + uint256 totalAmount, + bytes memory data ) internal virtual override returns (uint256 _claimed) { - _claimed = super._executeClaim(beneficiary, totalAmount); + _claimed = super._executeClaim(beneficiary, totalAmount, data); _reconcileVotingPower(beneficiary); } diff --git a/packages/hardhat/contracts/claim/abstract/ContinuousVesting.sol b/packages/hardhat/contracts/claim/abstract/ContinuousVesting.sol index 9f9a252d..10ce5e4b 100644 --- a/packages/hardhat/contracts/claim/abstract/ContinuousVesting.sol +++ b/packages/hardhat/contracts/claim/abstract/ContinuousVesting.sol @@ -37,7 +37,8 @@ abstract contract ContinuousVesting is AdvancedDistributor, IContinuousVesting { function getVestedFraction( address beneficiary, - uint256 time // time is in seconds past the epoch (e.g. block.timestamp) + uint256 time, // time is in seconds past the epoch (e.g. block.timestamp) + bytes memory /*data*/ ) public view override returns (uint256) { uint256 delayedTime = time- getFairDelayTime(beneficiary); // no tokens are vested diff --git a/packages/hardhat/contracts/claim/abstract/CrosschainMerkleDistributor.sol b/packages/hardhat/contracts/claim/abstract/CrosschainMerkleDistributor.sol index b64e6dc6..10a3a3e6 100644 --- a/packages/hardhat/contracts/claim/abstract/CrosschainMerkleDistributor.sol +++ b/packages/hardhat/contracts/claim/abstract/CrosschainMerkleDistributor.sol @@ -74,7 +74,7 @@ abstract contract CrosschainMerkleDistributor is CrosschainDistributor, MerkleSe _verifyMembership(_getLeaf(beneficiary, totalAmount, beneficiaryDomain), proof); // effects - uint256 claimedAmount = _executeClaim(beneficiary, totalAmount); + uint256 claimedAmount = _executeClaim(beneficiary, totalAmount, new bytes(0)); // interactions // NOTE: xReceive is *NOT* payable (Connext does not handle native assets). @@ -100,7 +100,7 @@ abstract contract CrosschainMerkleDistributor is CrosschainDistributor, MerkleSe ) external payable { _verifyMembership(_getLeaf(_beneficiary, _total, domain), _proof); // effects - uint256 claimedAmount = _executeClaim(_beneficiary, _total); + uint256 claimedAmount = _executeClaim(_beneficiary, _total, new bytes(0)); // interactions _settleClaim(_beneficiary, _beneficiary, domain, claimedAmount); @@ -137,7 +137,7 @@ abstract contract CrosschainMerkleDistributor is CrosschainDistributor, MerkleSe // Validate the claim _verifyMembership(_getLeaf(_beneficiary, _total, _beneficiaryDomain), _proof); - uint256 claimedAmount = _executeClaim(_beneficiary, _total); + uint256 claimedAmount = _executeClaim(_beneficiary, _total, new bytes(0)); _settleClaim(_beneficiary, _recipient, _recipientDomain, claimedAmount); } diff --git a/packages/hardhat/contracts/claim/abstract/Distributor.sol b/packages/hardhat/contracts/claim/abstract/Distributor.sol index 22a97755..01c379cd 100644 --- a/packages/hardhat/contracts/claim/abstract/Distributor.sol +++ b/packages/hardhat/contracts/claim/abstract/Distributor.sol @@ -65,7 +65,8 @@ abstract contract Distributor is IDistributor, ReentrancyGuard { */ function _executeClaim( address beneficiary, - uint256 _totalAmount + uint256 _totalAmount, + bytes memory data ) internal virtual returns (uint256) { uint120 totalAmount = uint120(_totalAmount); @@ -75,7 +76,7 @@ abstract contract Distributor is IDistributor, ReentrancyGuard { _initializeDistributionRecord(beneficiary, totalAmount); } - uint120 claimableAmount = uint120(getClaimableAmount(beneficiary)); + uint120 claimableAmount = uint120(getClaimableAmount(beneficiary, data)); require(claimableAmount > 0, 'Distributor: no more tokens claimable right now'); records[beneficiary].claimed += claimableAmount; @@ -105,7 +106,8 @@ abstract contract Distributor is IDistributor, ReentrancyGuard { // Get tokens vested as fraction of fractionDenominator function getVestedFraction( address beneficiary, - uint256 time + uint256 time, + bytes memory data ) public view virtual returns (uint256); function getFractionDenominator() public view returns (uint256) { @@ -113,12 +115,12 @@ abstract contract Distributor is IDistributor, ReentrancyGuard { } // get the number of tokens currently claimable by a specific use - function getClaimableAmount(address beneficiary) public view virtual returns (uint256) { + function getClaimableAmount(address beneficiary, bytes memory data) public view virtual returns (uint256) { require(records[beneficiary].initialized, 'Distributor: claim not initialized'); DistributionRecord memory record = records[beneficiary]; - uint256 claimable = (record.total * getVestedFraction(beneficiary, block.timestamp)) / + uint256 claimable = (record.total * getVestedFraction(beneficiary, block.timestamp, data)) / fractionDenominator; return record.claimed >= claimable diff --git a/packages/hardhat/contracts/claim/abstract/PerAddressContinuousVesting.sol b/packages/hardhat/contracts/claim/abstract/PerAddressContinuousVesting.sol new file mode 100644 index 00000000..f7809a0d --- /dev/null +++ b/packages/hardhat/contracts/claim/abstract/PerAddressContinuousVesting.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.21; + +import { Distributor, AdvancedDistributor } from "./AdvancedDistributor.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +abstract contract PerAddressContinuousVesting is AdvancedDistributor { + constructor( + IERC20 _token, + uint256 _total, + string memory _uri, + uint256 _voteFactor, + uint160 _maxDelayTime, + uint160 _salt + ) + // use a large fraction denominator to provide the highest resolution on continuous vesting. + AdvancedDistributor(_token, _total, _uri, _voteFactor, 10**18, _maxDelayTime, _salt) + {} + + function getVestedFraction( + address beneficiary, + uint256 time, // time is in seconds past the epoch (e.g. block.timestamp) + bytes memory data + ) public view override returns (uint256) { + (uint256 start, uint256 cliff, uint256 end) = abi.decode(data, (uint256, uint256, uint256)); + + uint256 delayedTime = time- getFairDelayTime(beneficiary); + // no tokens are vested + if (delayedTime <= cliff) { + return 0; + } + + // all tokens are vested + if (delayedTime >= end) { + return fractionDenominator; + } + + // some tokens are vested + return (fractionDenominator * (delayedTime - start)) / (end - start); + } +} diff --git a/packages/hardhat/contracts/claim/abstract/PerAddressTrancheVesting.sol b/packages/hardhat/contracts/claim/abstract/PerAddressTrancheVesting.sol new file mode 100644 index 00000000..da117d03 --- /dev/null +++ b/packages/hardhat/contracts/claim/abstract/PerAddressTrancheVesting.sol @@ -0,0 +1,48 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.21; + +import { AdvancedDistributor } from './AdvancedDistributor.sol'; +import { Tranche } from '../../interfaces/ITrancheVesting.sol'; +import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; + +/** + * @title PerUserTrancheVesting + * @notice Distributes funds to beneficiaries over time in tranches. + */ +abstract contract PerAddressTrancheVesting is AdvancedDistributor { + constructor( + IERC20 _token, + uint256 _total, + string memory _uri, + uint256 _voteFactor, + uint160 _maxDelayTime, + uint160 _salt + ) AdvancedDistributor(_token, _total, _uri, _voteFactor, 10000, _maxDelayTime, _salt) {} + + /** + * @notice Get the vested fraction for a beneficiary at a given time. + * @dev Before the first tranche time, the vested fraction will be 0. At times between + * tranche_i and tranche_i+1, the vested fraction will be tranche_i+1's vested fraction. + * After the last tranche time, the vested fraction will be the fraction denominator. + */ + function getVestedFraction( + address beneficiary, + uint256 time, + bytes memory data + ) public view override returns (uint256) { + Tranche[] memory tranches = abi.decode(data, (Tranche[])); + + uint256 delay = getFairDelayTime(beneficiary); + for (uint256 i = tranches.length; i != 0; ) { + unchecked { + --i; + } + + if (time - delay > tranches[i].time) { + return tranches[i].vestedFraction; + } + } + + return 0; + } +} diff --git a/packages/hardhat/contracts/claim/abstract/PriceTierVesting.sol b/packages/hardhat/contracts/claim/abstract/PriceTierVesting.sol index 8149ae6b..07165669 100644 --- a/packages/hardhat/contracts/claim/abstract/PriceTierVesting.sol +++ b/packages/hardhat/contracts/claim/abstract/PriceTierVesting.sol @@ -65,7 +65,8 @@ abstract contract PriceTierVesting is AdvancedDistributor, IPriceTierVesting { function getVestedFraction( address beneficiary, - uint256 time // time in seconds past epoch + uint256 time, // time in seconds past epoch + bytes memory /*data*/ ) public view override returns (uint256) { // shift this user's time by their fair delay uint256 delayedTime = time - getFairDelayTime(beneficiary); diff --git a/packages/hardhat/contracts/claim/abstract/TrancheVesting.sol b/packages/hardhat/contracts/claim/abstract/TrancheVesting.sol index f10ed9d8..1009f091 100644 --- a/packages/hardhat/contracts/claim/abstract/TrancheVesting.sol +++ b/packages/hardhat/contracts/claim/abstract/TrancheVesting.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.21; -import { AdvancedDistributor } from './AdvancedDistributor.sol'; -import { ITrancheVesting, Tranche } from '../../interfaces/ITrancheVesting.sol'; -import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; +import { AdvancedDistributor } from "./AdvancedDistributor.sol"; +import { ITrancheVesting, Tranche } from "../../interfaces/ITrancheVesting.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "hardhat/console.sol"; /** @@ -11,95 +11,115 @@ import "hardhat/console.sol"; * @notice Distributes funds to beneficiaries over time in tranches. */ abstract contract TrancheVesting is AdvancedDistributor, ITrancheVesting { - // time and vested fraction must monotonically increase in the tranche array - Tranche[] private tranches; - - constructor( - IERC20 _token, - uint256 _total, - string memory _uri, - uint256 _voteFactor, - Tranche[] memory _tranches, - uint160 _maxDelayTime, - uint160 _salt - ) AdvancedDistributor(_token, _total, _uri, _voteFactor, 10000, _maxDelayTime, _salt) { - // tranches can be set in the constructor or in setTranches() - _setTranches(_tranches); - } + // time and vested fraction must monotonically increase in the tranche array + Tranche[] private tranches; + + constructor( + IERC20 _token, + uint256 _total, + string memory _uri, + uint256 _voteFactor, + Tranche[] memory _tranches, + uint160 _maxDelayTime, + uint160 _salt + ) + AdvancedDistributor( + _token, + _total, + _uri, + _voteFactor, + 10000, + _maxDelayTime, + _salt + ) + { + // tranches can be set in the constructor or in setTranches() + _setTranches(_tranches); + } /** - * @notice Get the vested fraction for a beneficiary at a given time. - * @dev Before the first tranche time, the vested fraction will be 0. At times between - * tranche_i and tranche_i+1, the vested fraction will be tranche_i+1's vested fraction. - * After the last tranche time, the vested fraction will be the fraction denominator. - */ - function getVestedFraction( - address beneficiary, - uint256 time - ) public view override returns (uint256) { - uint256 delay = getFairDelayTime(beneficiary); - for (uint256 i = tranches.length; i != 0; ) { - unchecked { - --i; - } - - if (time - delay > tranches[i].time) { - return tranches[i].vestedFraction; - } - } - - return 0; - } + * @notice Get the vested fraction for a beneficiary at a given time. + * @dev Before the first tranche time, the vested fraction will be 0. At times between + * tranche_i and tranche_i+1, the vested fraction will be tranche_i+1's vested fraction. + * After the last tranche time, the vested fraction will be the fraction denominator. + */ + function getVestedFraction( + address beneficiary, + uint256 time, + bytes memory /*data*/ + ) public view override returns (uint256) { + uint256 delay = getFairDelayTime(beneficiary); + for (uint256 i = tranches.length; i != 0; ) { + unchecked { + --i; + } + + if (time - delay > tranches[i].time) { + return tranches[i].vestedFraction; + } + } + + return 0; + } // Get a single tranche - function getTranche(uint256 i) public view returns (Tranche memory) { - return tranches[i]; - } + function getTranche(uint256 i) public view returns (Tranche memory) { + return tranches[i]; + } // Get all tranches - function getTranches() public view returns (Tranche[] memory) { - return tranches; - } + function getTranches() public view returns (Tranche[] memory) { + return tranches; + } - /** - * @dev Tranches can be updated at any time. The quantity of tokens a user can claim is based on the + /** + * @dev Tranches can be updated at any time. The quantity of tokens a user can claim is based on the * claimable quantity at the time of the claim and the quantity of tokens already claimed by the user. - */ - function _setTranches(Tranche[] memory _tranches) private { - require(_tranches.length != 0, 'tranches required'); - - delete tranches; - - uint128 lastTime = 0; - uint128 lastVestedFraction = 0; - - for (uint256 i = 0; i < _tranches.length; ) { - require(_tranches[i].vestedFraction != 0, 'tranche vested fraction == 0'); - require(_tranches[i].time > lastTime, 'tranche time must increase'); - require( - _tranches[i].vestedFraction > lastVestedFraction, - 'tranche vested fraction must increase' - ); - lastTime = _tranches[i].time; - lastVestedFraction = _tranches[i].vestedFraction; - tranches.push(_tranches[i]); - - emit SetTranche(i, lastTime, lastVestedFraction); - - unchecked { - ++i; - } - } - - require(lastTime <= 4102444800, 'vesting ends after 4102444800 (Jan 1 2100)'); - require(lastVestedFraction == fractionDenominator, 'last tranche must vest all tokens'); - } - - /** - * @notice Set the vesting tranches. Tranches must be sorted by time and vested fraction must monotonically increase. - * The last tranche must vest all tokens (vestedFraction == fractionDenominator) - */ - function setTranches(Tranche[] memory _tranches) external onlyOwner { - _setTranches(_tranches); - } + */ + function _setTranches(Tranche[] memory _tranches) private { + require(_tranches.length != 0, "tranches required"); + + delete tranches; + + uint128 lastTime = 0; + uint128 lastVestedFraction = 0; + + for (uint256 i = 0; i < _tranches.length; ) { + require( + _tranches[i].vestedFraction != 0, + "tranche vested fraction == 0" + ); + require(_tranches[i].time > lastTime, "tranche time must increase"); + require( + _tranches[i].vestedFraction > lastVestedFraction, + "tranche vested fraction must increase" + ); + lastTime = _tranches[i].time; + lastVestedFraction = _tranches[i].vestedFraction; + tranches.push(_tranches[i]); + + emit SetTranche(i, lastTime, lastVestedFraction); + + unchecked { + ++i; + } + } + + require( + lastTime <= 4102444800, + "vesting ends after 4102444800 (Jan 1 2100)" + ); + require( + lastVestedFraction == fractionDenominator, + "last tranche must vest all tokens" + ); + } + + /** + * @notice Set the vesting tranches. Tranches must be sorted by time and vested fraction must monotonically increase. + * The last tranche must vest all tokens (vestedFraction == fractionDenominator) + */ + function setTranches(Tranche[] memory _tranches) external onlyOwner { + _setTranches(_tranches); + } } diff --git a/packages/hardhat/contracts/claim/factory/AdvancedDistributorInitializable.sol b/packages/hardhat/contracts/claim/factory/AdvancedDistributorInitializable.sol index 37bc5bf1..2059fe35 100644 --- a/packages/hardhat/contracts/claim/factory/AdvancedDistributorInitializable.sol +++ b/packages/hardhat/contracts/claim/factory/AdvancedDistributorInitializable.sol @@ -103,13 +103,13 @@ abstract contract AdvancedDistributorInitializable is _reconcileVotingPower(beneficiary); } - function _executeClaim(address beneficiary, uint256 totalAmount) + function _executeClaim(address beneficiary, uint256 totalAmount, bytes memory) internal virtual override returns (uint256 _claimed) { - _claimed = super._executeClaim(beneficiary, totalAmount); + _claimed = super._executeClaim(beneficiary, totalAmount, new bytes(0)); _reconcileVotingPower(beneficiary); } diff --git a/packages/hardhat/contracts/claim/factory/ContinuousVestingInitializable.sol b/packages/hardhat/contracts/claim/factory/ContinuousVestingInitializable.sol index 8cda73d7..20d4e804 100644 --- a/packages/hardhat/contracts/claim/factory/ContinuousVestingInitializable.sol +++ b/packages/hardhat/contracts/claim/factory/ContinuousVestingInitializable.sol @@ -46,7 +46,8 @@ abstract contract ContinuousVestingInitializable is Initializable, AdvancedDistr function getVestedFraction( address beneficiary, - uint256 time // time is in seconds past the epoch (e.g. block.timestamp) + uint256 time, // time is in seconds past the epoch (e.g. block.timestamp) + bytes memory // data ) public view override returns (uint256) { uint256 delayedTime = time - getFairDelayTime(beneficiary); // no tokens are vested diff --git a/packages/hardhat/contracts/claim/factory/ContinuousVestingMerkleDistributor.sol b/packages/hardhat/contracts/claim/factory/ContinuousVestingMerkleDistributor.sol index 1b95d3bf..851389da 100644 --- a/packages/hardhat/contracts/claim/factory/ContinuousVestingMerkleDistributor.sol +++ b/packages/hardhat/contracts/claim/factory/ContinuousVestingMerkleDistributor.sol @@ -60,7 +60,7 @@ contract ContinuousVestingMerkleDistributor is Initializable, ContinuousVestingI nonReentrant { // effects - uint256 claimedAmount = super._executeClaim(beneficiary, totalAmount); + uint256 claimedAmount = super._executeClaim(beneficiary, totalAmount, new bytes(0)); // interactions _settleClaim(beneficiary, claimedAmount); } diff --git a/packages/hardhat/contracts/claim/factory/DistributorInitializable.sol b/packages/hardhat/contracts/claim/factory/DistributorInitializable.sol index dae28cc7..2bcf2483 100644 --- a/packages/hardhat/contracts/claim/factory/DistributorInitializable.sol +++ b/packages/hardhat/contracts/claim/factory/DistributorInitializable.sol @@ -63,7 +63,7 @@ abstract contract DistributorInitializable is Initializable, IDistributor, Reent * @dev This function does not check permissions: caller must verify the claim is valid! * this function should not call any untrusted external contracts to avoid reentrancy */ - function _executeClaim(address beneficiary, uint256 _totalAmount) internal virtual returns (uint256) { + function _executeClaim(address beneficiary, uint256 _totalAmount, bytes memory data) internal virtual returns (uint256) { uint120 totalAmount = uint120(_totalAmount); // effects @@ -72,7 +72,7 @@ abstract contract DistributorInitializable is Initializable, IDistributor, Reent _initializeDistributionRecord(beneficiary, totalAmount); } - uint120 claimableAmount = uint120(getClaimableAmount(beneficiary)); + uint120 claimableAmount = uint120(getClaimableAmount(beneficiary, data)); require(claimableAmount > 0, "Distributor: no more tokens claimable right now"); records[beneficiary].claimed += claimableAmount; @@ -98,19 +98,19 @@ abstract contract DistributorInitializable is Initializable, IDistributor, Reent } // Get tokens vested as fraction of fractionDenominator - function getVestedFraction(address beneficiary, uint256 time) public view virtual returns (uint256); + function getVestedFraction(address beneficiary, uint256 time, bytes memory data) public view virtual returns (uint256); function getFractionDenominator() public view returns (uint256) { return fractionDenominator; } // get the number of tokens currently claimable by a specific use - function getClaimableAmount(address beneficiary) public view virtual returns (uint256) { + function getClaimableAmount(address beneficiary, bytes memory data) public view virtual returns (uint256) { require(records[beneficiary].initialized, "Distributor: claim not initialized"); DistributionRecord memory record = records[beneficiary]; - uint256 claimable = (record.total * getVestedFraction(beneficiary, block.timestamp)) / fractionDenominator; + uint256 claimable = (record.total * getVestedFraction(beneficiary, block.timestamp, data)) / fractionDenominator; return record.claimed >= claimable ? 0 // no more tokens to claim : claimable - record.claimed; // claim all available tokens diff --git a/packages/hardhat/contracts/claim/factory/PerAddressContinuousVestingInitializable.sol b/packages/hardhat/contracts/claim/factory/PerAddressContinuousVestingInitializable.sol new file mode 100644 index 00000000..976efee1 --- /dev/null +++ b/packages/hardhat/contracts/claim/factory/PerAddressContinuousVestingInitializable.sol @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.21; + +import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import "./AdvancedDistributorInitializable.sol"; + +abstract contract PerAddressContinuousVestingInitializable is Initializable, AdvancedDistributorInitializable { + function __ContinuousVesting_init( + IERC20 _token, + uint256 _total, + string memory _uri, + uint160 _maxDelayTime, + uint160 _salt, + address _owner + ) internal onlyInitializing { + __AdvancedDistributor_init( + _token, + _total, + _uri, + 10000, // 1x voting power + 10 ** 18, // provides the highest resolution possible for continuous vesting + _maxDelayTime, + _salt, + _owner + ); + } + + function getVestedFraction( + address beneficiary, + uint256 time, // time is in seconds past the epoch (e.g. block.timestamp) + bytes memory data + ) public view override returns (uint256) { + (uint256 start, uint256 cliff, uint256 end) = abi.decode(data, (uint256, uint256, uint256)); + + uint256 delayedTime = time - getFairDelayTime(beneficiary); + // no tokens are vested + if (delayedTime <= cliff) { + return 0; + } + + // all tokens are vested + if (delayedTime >= end) { + return fractionDenominator; + } + + // some tokens are vested + return (fractionDenominator * (delayedTime - start)) / (end - start); + } +} diff --git a/packages/hardhat/contracts/claim/factory/PerAddressContinuousVestingMerkleDistributor.sol b/packages/hardhat/contracts/claim/factory/PerAddressContinuousVestingMerkleDistributor.sol new file mode 100644 index 00000000..745b14a3 --- /dev/null +++ b/packages/hardhat/contracts/claim/factory/PerAddressContinuousVestingMerkleDistributor.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.21; + +import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import "./PerAddressContinuousVestingInitializable.sol"; +import "./MerkleSetInitializable.sol"; + +contract PerAddressContinuousVestingMerkleDistributor is Initializable, PerAddressContinuousVestingInitializable, MerkleSetInitializable { + constructor() { + _disableInitializers(); + } + + function initialize( + IERC20 _token, // the token being claimed + uint256 _total, // the total claimable by all users + string memory _uri, // information on the sale (e.g. merkle proofs) + bytes32 _merkleRoot, // the merkle root for claim membership (also used as salt for the fair queue delay time), + uint160 _maxDelayTime, // the maximum delay time for the fair queue + address _owner + ) public initializer { + __ContinuousVesting_init( + _token, _total, _uri, _maxDelayTime, uint160(uint256(_merkleRoot)), _owner + ); + + __MerkleSet_init(_merkleRoot); + + _transferOwnership(_owner); + } + + function NAME() external pure override returns (string memory) { + return "PerAddressContinuousVestingInitializableMerkleDistributor"; + } + + function VERSION() external pure override returns (uint256) { + return 4; + } + + function initializeDistributionRecord( + uint256 index, // the beneficiary's index in the merkle root + address beneficiary, // the address that will receive tokens + uint256 amount, // the total claimable by this beneficiary + uint256 start, // the start of the vesting period + uint256 cliff, // cliff time + uint256 end, // the end of the vesting period + bytes32[] calldata merkleProof + ) external validMerkleProof(keccak256(abi.encodePacked(index, beneficiary, amount, start, cliff, end)), merkleProof) { + _initializeDistributionRecord(beneficiary, amount); + } + + function claim( + uint256 index, // the beneficiary's index in the merkle root + address beneficiary, // the address that will receive tokens + uint256 totalAmount, // the total claimable by this beneficiary + uint256 start, // the start of the vesting period + uint256 cliff, // cliff time + uint256 end, // the end of the vesting period + bytes32[] calldata merkleProof + ) + external + validMerkleProof(keccak256(abi.encodePacked(index, beneficiary, totalAmount, start, cliff, end)), merkleProof) + nonReentrant + { + // effects + uint256 claimedAmount = super._executeClaim(beneficiary, totalAmount, new bytes(0)); + // interactions + _settleClaim(beneficiary, claimedAmount); + } + + function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { + _setMerkleRoot(_merkleRoot); + } +} diff --git a/packages/hardhat/contracts/claim/factory/PerAddressContinuousVestingMerkleDistributorFactory.sol b/packages/hardhat/contracts/claim/factory/PerAddressContinuousVestingMerkleDistributorFactory.sol new file mode 100644 index 00000000..02aefcf9 --- /dev/null +++ b/packages/hardhat/contracts/claim/factory/PerAddressContinuousVestingMerkleDistributorFactory.sol @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.21; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; + +import {PerAddressContinuousVestingMerkleDistributor} from "./PerAddressContinuousVestingMerkleDistributor.sol"; + +contract PerAddressContinuousVestingMerkleDistributorFactory { + address private immutable i_implementation; + address[] public distributors; + + event DistributorDeployed(address indexed distributor); + + constructor(address implementation) { + i_implementation = implementation; + } + + function _getSalt( + IERC20 _token, // the token being claimed + uint256 _total, // the total claimable by all users + string memory _uri, // information on the sale (e.g. merkle proofs) + bytes32 _merkleRoot, // the merkle root for claim membership (also used as salt for the fair queue delay time), + uint160 _maxDelayTime, // the maximum delay time for the fair queue + address _owner, + uint256 _nonce + ) private pure returns (bytes32) { + return keccak256(abi.encode( + _token, + _total, + _uri, + _merkleRoot, + _maxDelayTime, + _owner, + _nonce + )); + } + + function deployDistributor( + IERC20 _token, // the token being claimed + uint256 _total, // the total claimable by all users + string memory _uri, // information on the sale (e.g. merkle proofs) + bytes32 _merkleRoot, // the merkle root for claim membership (also used as salt for the fair queue delay time), + uint160 _maxDelayTime, // the maximum delay time for the fair queue + address _owner, + uint256 _nonce + ) public returns (PerAddressContinuousVestingMerkleDistributor distributor) { + bytes32 salt = _getSalt( + _token, + _total, + _uri, + _merkleRoot, + _maxDelayTime, + _owner, + _nonce + ); + + distributor = + PerAddressContinuousVestingMerkleDistributor(Clones.cloneDeterministic(i_implementation, salt)); + distributors.push(address(distributor)); + + emit DistributorDeployed(address(distributor)); + + distributor.initialize(_token, _total, _uri, _merkleRoot, _maxDelayTime, _owner); + + return distributor; + } + + function getImplementation() public view returns (address) { + return i_implementation; + } + + function predictDistributorAddress( + IERC20 _token, // the token being claimed + uint256 _total, // the total claimable by all users + string memory _uri, // information on the sale (e.g. merkle proofs) + bytes32 _merkleRoot, // the merkle root for claim membership (also used as salt for the fair queue delay time), + uint160 _maxDelayTime, // the maximum delay time for the fair queue + address _owner, + uint256 _nonce + ) public view returns (address) { + bytes32 salt = _getSalt( + _token, + _total, + _uri, + _merkleRoot, + _maxDelayTime, + _owner, + _nonce + ); + + return Clones.predictDeterministicAddress(i_implementation, salt, address(this)); + } +} diff --git a/packages/hardhat/contracts/claim/factory/PerAddressTrancheVestingInitializable.sol b/packages/hardhat/contracts/claim/factory/PerAddressTrancheVestingInitializable.sol new file mode 100644 index 00000000..0140e552 --- /dev/null +++ b/packages/hardhat/contracts/claim/factory/PerAddressTrancheVestingInitializable.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.21; + +import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import "./AdvancedDistributorInitializable.sol"; +import {Tranche} from "../../interfaces/ITrancheVesting.sol"; + +abstract contract PerAddressTrancheVestingInitializable is Initializable, AdvancedDistributorInitializable { + function __PerAddressTrancheVesting_init( + IERC20 _token, + uint256 _total, + string memory _uri, + uint160 _maxDelayTime, + uint160 _salt, + address _owner + ) internal onlyInitializing { + __AdvancedDistributor_init( + _token, + _total, + _uri, + 10000, // 1x voting power + 10000, // vested fraction + _maxDelayTime, + _salt, + _owner + ); + } + + /** + * @notice Get the vested fraction for a beneficiary at a given time. + * @dev Before the first tranche time, the vested fraction will be 0. At times between + * tranche_i and tranche_i+1, the vested fraction will be tranche_i+1's vested fraction. + * After the last tranche time, the vested fraction will be the fraction denominator. + */ + function getVestedFraction(address beneficiary, uint256 time, bytes memory data) public view override returns (uint256) { + Tranche[] memory tranches = abi.decode(data, (Tranche[])); + + uint256 delay = getFairDelayTime(beneficiary); + for (uint256 i = tranches.length; i != 0;) { + unchecked { + --i; + } + + if (time - delay > tranches[i].time) { + return tranches[i].vestedFraction; + } + } + + return 0; + } +} diff --git a/packages/hardhat/contracts/claim/factory/PerAddressTrancheVestingMerkleDistributor.sol b/packages/hardhat/contracts/claim/factory/PerAddressTrancheVestingMerkleDistributor.sol new file mode 100644 index 00000000..58b03c12 --- /dev/null +++ b/packages/hardhat/contracts/claim/factory/PerAddressTrancheVestingMerkleDistributor.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.21; + +import {Initializable} from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + +import "./PerAddressTrancheVestingInitializable.sol"; +import "./MerkleSetInitializable.sol"; + +contract PerAddressTrancheVestingMerkleDistributor is + Initializable, + PerAddressTrancheVestingInitializable, + MerkleSetInitializable +{ + constructor() { + _disableInitializers(); + } + + function initialize( + IERC20 _token, // the token being claimed + uint256 _total, // the total claimable by all users + string memory _uri, // information on the sale (e.g. merkle proofs) + bytes32 _merkleRoot, // the merkle root for claim membership (also used as salt for the fair queue delay time), + uint160 _maxDelayTime, // the maximum delay time for the fair queue + address _owner + ) public initializer { + __PerAddressTrancheVesting_init(_token, _total, _uri, _maxDelayTime, uint160(uint256(_merkleRoot)), _owner); + + __MerkleSet_init(_merkleRoot); + + _transferOwnership(_owner); + } + + function NAME() external pure override returns (string memory) { + return "PerAddressTrancheVestingMerkleDistributor"; + } + + function VERSION() external pure override returns (uint256) { + return 3; + } + + function initializeDistributionRecord( + uint256 index, // the beneficiary's index in the merkle root + address beneficiary, // the address that will receive tokens + uint256 amount, // the total claimable by this beneficiary + bytes32[] calldata merkleProof + ) external validMerkleProof(keccak256(abi.encodePacked(index, beneficiary, amount)), merkleProof) { + _initializeDistributionRecord(beneficiary, amount); + } + + function claim( + uint256 index, // the beneficiary's index in the merkle root + address beneficiary, // the address that will receive tokens + uint256 totalAmount, // the total claimable by this beneficiary + bytes32[] calldata merkleProof + ) + external + validMerkleProof(keccak256(abi.encodePacked(index, beneficiary, totalAmount)), merkleProof) + nonReentrant + { + // effects + uint256 claimedAmount = _executeClaim(beneficiary, totalAmount, new bytes(0)); + // interactions + _settleClaim(beneficiary, claimedAmount); + } + + function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { + _setMerkleRoot(_merkleRoot); + } +} diff --git a/packages/hardhat/contracts/claim/factory/PerAddressTrancheVestingMerkleDistributorFactory.sol b/packages/hardhat/contracts/claim/factory/PerAddressTrancheVestingMerkleDistributorFactory.sol new file mode 100644 index 00000000..ef89ab2b --- /dev/null +++ b/packages/hardhat/contracts/claim/factory/PerAddressTrancheVestingMerkleDistributorFactory.sol @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.21; + +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; +import {Counters} from "@openzeppelin/contracts/utils/Counters.sol"; + +import {PerAddressTrancheVestingMerkleDistributor, Tranche} from "./PerAddressTrancheVestingMerkleDistributor.sol"; + +contract PerAddressTrancheVestingMerkleDistributorFactory { + address private immutable i_implementation; + address[] public distributors; + + event DistributorDeployed(address indexed distributor); + + constructor(address implementation) { + i_implementation = implementation; + } + + function _getSalt( + IERC20 _token, // the token being claimed + uint256 _total, // the total claimable by all users + string memory _uri, // information on the sale (e.g. merkle proofs) + bytes32 _merkleRoot, // the merkle root for claim membership (also used as salt for the fair queue delay time), + uint160 _maxDelayTime, // the maximum delay time for the fair queue + address _owner, + uint256 _nonce + ) private pure returns (bytes32) { + return keccak256(abi.encode( + _token, + _total, + _uri, + _merkleRoot, + _maxDelayTime, + _owner, + _nonce + )); + } + + function deployDistributor( + IERC20 _token, // the token being claimed + uint256 _total, // the total claimable by all users + string memory _uri, // information on the sale (e.g. merkle proofs) + bytes32 _merkleRoot, // the merkle root for claim membership (also used as salt for the fair queue delay time), + uint160 _maxDelayTime, // the maximum delay time for the fair queue + address _owner, + uint256 _nonce + ) public returns (PerAddressTrancheVestingMerkleDistributor distributor) { + bytes32 salt = _getSalt( + _token, + _total, + _uri, + _merkleRoot, + _maxDelayTime, + _owner, + _nonce + ); + + distributor = + PerAddressTrancheVestingMerkleDistributor(Clones.cloneDeterministic(i_implementation, salt)); + distributors.push(address(distributor)); + + emit DistributorDeployed(address(distributor)); + + distributor.initialize(_token, _total, _uri, _merkleRoot, _maxDelayTime, _owner); + + return distributor; + } + + function getImplementation() public view returns (address) { + return i_implementation; + } + + function predictDistributorAddress( + IERC20 _token, // the token being claimed + uint256 _total, // the total claimable by all users + string memory _uri, // information on the sale (e.g. merkle proofs) + bytes32 _merkleRoot, // the merkle root for claim membership (also used as salt for the fair queue delay time), + uint160 _maxDelayTime, // the maximum delay time for the fair queue + address _owner, + uint256 _nonce + ) public view returns (address) { + bytes32 salt = _getSalt( + _token, + _total, + _uri, + _merkleRoot, + _maxDelayTime, + _owner, + _nonce + ); + + return Clones.predictDeterministicAddress(i_implementation, salt, address(this)); + } +} diff --git a/packages/hardhat/contracts/claim/factory/TrancheVestingInitializable.sol b/packages/hardhat/contracts/claim/factory/TrancheVestingInitializable.sol index c92f8144..457d228a 100644 --- a/packages/hardhat/contracts/claim/factory/TrancheVestingInitializable.sol +++ b/packages/hardhat/contracts/claim/factory/TrancheVestingInitializable.sol @@ -39,7 +39,7 @@ abstract contract TrancheVestingInitializable is Initializable, AdvancedDistribu * tranche_i and tranche_i+1, the vested fraction will be tranche_i+1's vested fraction. * After the last tranche time, the vested fraction will be the fraction denominator. */ - function getVestedFraction(address beneficiary, uint256 time) public view override returns (uint256) { + function getVestedFraction(address beneficiary, uint256 time, bytes memory) public view override returns (uint256) { uint256 delay = getFairDelayTime(beneficiary); for (uint256 i = tranches.length; i != 0;) { unchecked { diff --git a/packages/hardhat/contracts/claim/factory/TrancheVestingMerkleDistributor.sol b/packages/hardhat/contracts/claim/factory/TrancheVestingMerkleDistributor.sol index 26b8bf03..31cec35c 100644 --- a/packages/hardhat/contracts/claim/factory/TrancheVestingMerkleDistributor.sol +++ b/packages/hardhat/contracts/claim/factory/TrancheVestingMerkleDistributor.sol @@ -60,7 +60,7 @@ contract TrancheVestingMerkleDistributor is nonReentrant { // effects - uint256 claimedAmount = _executeClaim(beneficiary, totalAmount); + uint256 claimedAmount = _executeClaim(beneficiary, totalAmount, new bytes(0)); // interactions _settleClaim(beneficiary, claimedAmount); } diff --git a/packages/hardhat/contracts/interfaces/IDistributor.sol b/packages/hardhat/contracts/interfaces/IDistributor.sol index a63dbd65..c9c54929 100644 --- a/packages/hardhat/contracts/interfaces/IDistributor.sol +++ b/packages/hardhat/contracts/interfaces/IDistributor.sol @@ -42,7 +42,7 @@ interface IDistributor { * @dev get the amount of tokens currently claimable by a beneficiary * @param beneficiary the address of the beneficiary */ - function getClaimableAmount(address beneficiary) external view returns (uint256); + function getClaimableAmount(address beneficiary, bytes calldata data) external view returns (uint256); /** * @dev get the denominator for vesting fractions represented as integers diff --git a/packages/hardhat/deploy/00_peraddress.ts b/packages/hardhat/deploy/00_peraddress.ts new file mode 100644 index 00000000..a8e4d413 --- /dev/null +++ b/packages/hardhat/deploy/00_peraddress.ts @@ -0,0 +1,109 @@ +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import { DeployFunction } from "hardhat-deploy/types"; +import { Contract } from "ethers"; + +/** + * Deploys a contract named "YourContract" using the deployer account and + * constructor arguments set to the deployer address + * + * @param hre HardhatRuntimeEnvironment object. + */ +const deployYourContract: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + /* + On localhost, the deployer account is the one that comes with Hardhat, which is already funded. + + When deploying to live networks (e.g `yarn deploy --network goerli`), the deployer account + should have sufficient balance to pay for the gas fees for contract creation. + + You can generate a random account with `yarn generate` which will fill DEPLOYER_PRIVATE_KEY + with a random private key in the .env file (then used on hardhat.config.ts) + You can run the `yarn account` command to check your balance in every network. + */ + const { deployer } = await hre.getNamedAccounts(); + const { deploy } = hre.deployments; + + // THIS IS A SAMPE ON HOW OT DEPLOY A CONTRACT USING `yarn deploy` COMMAND + // YOU CAN DEPLOY YOUR OWN CONTRACTS BY MODIFYING THIS FILE + + await deploy("PerAddressContinuousVestingMerkleDistributor", { + from: deployer, + // Contract constructor arguments + args: [], + log: true, + // autoMine: can be passed to the deploy function to make the deployment process faster on local networks by + // automatically mining the contract deployment transaction. There is no effect on live networks. + autoMine: true, + }); + + // Get the deployed contract to interact with it after deploying. + const PerAddressContinuousVestingMerkleDistributorContract = await hre.ethers.getContract( + "PerAddressContinuousVestingMerkleDistributor", + deployer, + ); + console.log("👋 Initial greeting:", PerAddressContinuousVestingMerkleDistributorContract.target); + + await deploy("PerAddressContinuousVestingMerkleDistributorFactory", { + from: deployer, + // Contract constructor arguments + args: [PerAddressContinuousVestingMerkleDistributorContract.target], + log: true, + // autoMine: can be passed to the deploy function to make the deployment process faster on local networks by + // automatically mining the contract deployment transaction. There is no effect on live networks. + autoMine: true, + }); + + const PerAddressContinuousVestingMerkleDistributorFactory = await hre.ethers.getContract( + "PerAddressContinuousVestingMerkleDistributorFactory", + deployer, + ); + + console.log( + "deployed continuousVestingMerkleDistributorFactoryContract", + PerAddressContinuousVestingMerkleDistributorFactory.target, + ); + + // TRANCHE + + await deploy("PerAddressTrancheVestingMerkleDistributor", { + from: deployer, + // Contract constructor arguments + args: [], + log: true, + // autoMine: can be passed to the deploy function to make the deployment process faster on local networks by + // automatically mining the contract deployment transaction. There is no effect on live networks. + autoMine: true, + }); + + // Get the deployed contract to interact with it after deploying. + const PerAddressTrancheVestingMerkleDistributorContract = await hre.ethers.getContract( + "PerAddressTrancheVestingMerkleDistributor", + deployer, + ); + console.log("👋 Initial greeting:", PerAddressTrancheVestingMerkleDistributorContract.target); + + await deploy("PerAddressTrancheVestingMerkleDistributorFactory", { + from: deployer, + // Contract constructor arguments + args: [PerAddressTrancheVestingMerkleDistributorContract.target], + log: true, + // autoMine: can be passed to the deploy function to make the deployment process faster on local networks by + // automatically mining the contract deployment transaction. There is no effect on live networks. + autoMine: true, + }); + + const PerAddressTrancheVestingMerkleDistributorFactory = await hre.ethers.getContract( + "PerAddressTrancheVestingMerkleDistributorFactory", + deployer, + ); + + console.log( + "deployed trancheVestingMerkleDistributorFactoryContract", + PerAddressTrancheVestingMerkleDistributorFactory.target, + ); +}; + +export default deployYourContract; + +// Tags are useful if you have multiple deploy files and only want to run one of them. +// e.g. yarn deploy --tags YourContract +deployYourContract.tags = ["00", "deploy"]; diff --git a/packages/hardhat/foundry.toml b/packages/hardhat/foundry.toml new file mode 100644 index 00000000..e493de63 --- /dev/null +++ b/packages/hardhat/foundry.toml @@ -0,0 +1,7 @@ +[profile.default] +src = 'contracts' +out = 'out' +libs = ['node_modules', 'lib'] +test = 'test' +cache_path = 'cache_forge' +viaIR = true diff --git a/packages/hardhat/hardhat.config.ts b/packages/hardhat/hardhat.config.ts index 1aac76fa..410ac39b 100644 --- a/packages/hardhat/hardhat.config.ts +++ b/packages/hardhat/hardhat.config.ts @@ -1,237 +1,303 @@ -import * as dotenv from "dotenv"; -dotenv.config(); -import { HardhatUserConfig } from "hardhat/config"; -import "@nomicfoundation/hardhat-ethers"; -import "@nomicfoundation/hardhat-chai-matchers"; -import "@typechain/hardhat"; -import "hardhat-gas-reporter"; -import "solidity-coverage"; -import "@nomicfoundation/hardhat-verify"; -import "hardhat-deploy"; -import "hardhat-deploy-ethers"; +// import * as dotenv from "dotenv"; +// dotenv.config(); +// import "@nomicfoundation/hardhat-ethers"; +// import "@nomicfoundation/hardhat-chai-matchers"; +// import "@typechain/hardhat"; +// import "hardhat-gas-reporter"; +// import "solidity-coverage"; +// import "@nomicfoundation/hardhat-verify"; +// import "hardhat-deploy"; +// import "hardhat-deploy-ethers"; -// If not set, it uses ours Alchemy's default API key. -// You can get your own at https://dashboard.alchemyapi.io -const providerApiKey = process.env.ALCHEMY_API_KEY || "oKxs-03sij-U_N0iOlrSsZFr29-IqbuF"; -// If not set, it uses the hardhat account 0 private key. -const deployerPrivateKey = - process.env.DEPLOYER_PRIVATE_KEY ?? "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"; -// If not set, it uses ours Etherscan default API key. -const etherscanApiKey = process.env.ETHERSCAN_API_KEY || "DNXJA8RX2Q3VZ4URQIWP7Z68CJXQZSC6AW"; +import { HardhatUserConfig } from "hardhat/config"; +import "@nomicfoundation/hardhat-toolbox"; +import "@nomicfoundation/hardhat-foundry"; +import "@nomicfoundation/hardhat-ignition-ethers"; +import "hardhat-jest"; // Typescript -const selectedNetwork = process.env.HARDHAT_NETWORK || process.env.NETWORK || "localhost"; +// Ensure your configuration variables are set before executing the script +const { vars } = require("hardhat/config"); -function getApiKey(network) { - switch (network) { - case "avalanche": - case "fuji": { - return process.env.SNOWTRACE_API_KEY; - } - case "gnosis": { - return process.env.GNOSISSCAN_API_KEY; - } - case "mainnet": - case "goerli": { - return process.env.ETHERSCAN_API_KEY; - } - case "optimism": - case "goerliOptimism":{ - // optimism.etherscan.io: create an account at https://optimistic.etherscan.io/myapikey - return process.env.OPTIMISTIC_ETHERSCANSCAN_API_KEY; - } - case "mumbai": - case "matic": { - // https://polygonscan.com/ - return process.env.POLYGONSCAN_API_KEY; - } - case "arbitrum": - case "goerliArbitrum": - case "devNetArbitrum": { - return process.env.ARBISCAN_API_KEY; - } - case 'celo': - case 'alfajores': { - // https://celoscan.io/ - return process.env.CELOSCAN_API_KEY; - } - case 'bsc': - case 'bscTestnet': { - return process.env.BSC_API_KEY; - } - case 'moonbeam': - case 'moonriver': { - return process.env.MOONSCAN_API_KEY; - } - case 'baseGoerli': { - // API keys aren't supported yet - return '' - // return assertEnv('BASESCAN_API_KEY') - } - case "localhost": { - return undefined; - } - default: { - // Add new cases to handle other networks! - throw new Error("unknown network"); - } - } -} +// Add the following variables to the configuration variables. +const ALCHEMY_API_KEY = vars.get("ALCHEMY_API_KEY"); +const EVM_PRIVATE_KEY_1 = vars.get("EVM_PRIVATE_KEY_1"); +const EVM_PRIVATE_KEY_2 = vars.get("EVM_PRIVATE_KEY_2"); +const ETHERSCAN_API_KEY = vars.get("ETHERSCAN_API_KEY"); const config: HardhatUserConfig = { - // solidity: { - // version: "0.8.17", - // settings: { - // optimizer: { - // enabled: true, - // // https://docs.soliditylang.org/en/latest/using-the-compiler.html#optimizer-options - // runs: 200, - // }, - // }, - // }, solidity: { - compilers: [ - { - version: "0.8.21", - settings: { - optimizer: { - enabled: true, - runs: 200, - }, - viaIR: true, - }, - }, - { - version: "0.8.16", - settings: { - optimizer: { - enabled: true, - runs: 200, - }, - viaIR: true, - }, + version: "0.8.21", + settings: { + optimizer: { + enabled: true, + runs: 200, }, - { - version: "0.8.17", - settings: { - optimizer: { - enabled: true, - runs: 200, - }, - viaIR: true, - }, - }, - ], - }, - defaultNetwork: selectedNetwork, - namedAccounts: { - deployer: { - // By default, it will take the first Hardhat account as the deployer - default: 0, + viaIR: true, }, }, networks: { - // View the networks that are pre-configured. - // If the network you are looking for is not here you can add new network settings - hardhat: { - forking: { - url: `https://eth-mainnet.alchemyapi.io/v2/${providerApiKey}`, - enabled: process.env.MAINNET_FORKING_ENABLED === "true", - }, - }, - mainnet: { - url: `https://eth-mainnet.alchemyapi.io/v2/${providerApiKey}`, - accounts: [deployerPrivateKey], - }, sepolia: { - url: `https://eth-sepolia.g.alchemy.com/v2/${providerApiKey}`, - accounts: [deployerPrivateKey], - }, - goerli: { - url: `https://eth-goerli.alchemyapi.io/v2/${providerApiKey}`, - accounts: [deployerPrivateKey], - }, - arbitrum: { - url: `https://arb-mainnet.g.alchemy.com/v2/${providerApiKey}`, - accounts: [deployerPrivateKey], - }, - arbitrumSepolia: { - url: `https://arb-sepolia.g.alchemy.com/v2/${providerApiKey}`, - accounts: [deployerPrivateKey], - }, - optimism: { - url: `https://opt-mainnet.g.alchemy.com/v2/${providerApiKey}`, - accounts: [deployerPrivateKey], - }, - optimismSepolia: { - url: `https://opt-sepolia.g.alchemy.com/v2/${providerApiKey}`, - accounts: [deployerPrivateKey], - }, - polygon: { - url: `https://polygon-mainnet.g.alchemy.com/v2/${providerApiKey}`, - accounts: [deployerPrivateKey], - }, - polygonMumbai: { - url: `https://polygon-mumbai.g.alchemy.com/v2/${providerApiKey}`, - accounts: [deployerPrivateKey], - }, - polygonZkEvm: { - url: `https://polygonzkevm-mainnet.g.alchemy.com/v2/${providerApiKey}`, - accounts: [deployerPrivateKey], - }, - polygonZkEvmTestnet: { - url: `https://polygonzkevm-testnet.g.alchemy.com/v2/${providerApiKey}`, - accounts: [deployerPrivateKey], - }, - gnosis: { - url: "https://rpc.gnosischain.com", - accounts: [deployerPrivateKey], - }, - chiado: { - url: "https://rpc.chiadochain.net", - accounts: [deployerPrivateKey], - }, - base: { - url: "https://mainnet.base.org", - accounts: [deployerPrivateKey], - }, - baseGoerli: { - url: "https://goerli.base.org", - accounts: [deployerPrivateKey], - }, - baseSepolia: { - url: "https://sepolia.base.org", - accounts: [deployerPrivateKey], - }, - scrollSepolia: { - url: "https://sepolia-rpc.scroll.io", - accounts: [deployerPrivateKey], - }, - scroll: { - url: "https://rpc.scroll.io", - accounts: [deployerPrivateKey], - }, - pgn: { - url: "https://rpc.publicgoods.network", - accounts: [deployerPrivateKey], - }, - pgnTestnet: { - url: "https://sepolia.publicgoods.network", - accounts: [deployerPrivateKey], + url: `https://eth-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}`, + accounts: [EVM_PRIVATE_KEY_1, EVM_PRIVATE_KEY_2], }, }, - // configuration for harhdat-verify plugin etherscan: { - apiKey: getApiKey(selectedNetwork), - }, - // configuration for etherscan-verify from hardhat-deploy plugin - verify: { - etherscan: { - apiKey: `${etherscanApiKey}`, - }, - }, - sourcify: { - enabled: false, + apiKey: ETHERSCAN_API_KEY, }, }; export default config; + +// // If not set, it uses ours Alchemy's default API key. +// // You can get your own at https://dashboard.alchemyapi.io +// const providerApiKey = process.env.ALCHEMY_API_KEY || "oKxs-03sij-U_N0iOlrSsZFr29-IqbuF"; +// // If not set, it uses the hardhat account 0 private key. +// const deployerPrivateKey = +// process.env.DEPLOYER_PRIVATE_KEY ?? "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"; +// // If not set, it uses ours Etherscan default API key. +// const etherscanApiKey = process.env.ETHERSCAN_API_KEY || "DNXJA8RX2Q3VZ4URQIWP7Z68CJXQZSC6AW"; + +// const selectedNetwork = process.env.HARDHAT_NETWORK || process.env.NETWORK || "localhost"; + +// function getApiKey(network) { +// switch (network) { +// case "avalanche": +// case "fuji": { +// return process.env.SNOWTRACE_API_KEY; +// } +// case "gnosis": { +// return process.env.GNOSISSCAN_API_KEY; +// } +// case "mainnet": +// case "goerli": { +// return process.env.ETHERSCAN_API_KEY; +// } +// case "sepolia": { +// return process.env.ETHERSCAN_API_KEY; +// } +// case "baseSepolia": { +// return process.env.BASESCAN_API_KEY; +// } +// case "base": { +// return process.env.BASESCAN_API_KEY; +// } +// case "optimism": +// case "goerliOptimism":{ +// // optimism.etherscan.io: create an account at https://optimistic.etherscan.io/myapikey +// return process.env.OPTIMISTIC_ETHERSCANSCAN_API_KEY; +// } +// case "mumbai": +// case "matic": { +// // https://polygonscan.com/ +// return process.env.POLYGONSCAN_API_KEY; +// } +// case "arbitrum": +// case "goerliArbitrum": +// case "devNetArbitrum": { +// return process.env.ARBISCAN_API_KEY; +// } +// case 'celo': +// case 'alfajores': { +// // https://celoscan.io/ +// return process.env.CELOSCAN_API_KEY; +// } +// case 'bsc': +// case 'bscTestnet': { +// return process.env.BSC_API_KEY; +// } +// case 'moonbeam': +// case 'moonriver': { +// return process.env.MOONSCAN_API_KEY; +// } +// case 'baseGoerli': { +// // API keys aren't supported yet +// return '' +// // return assertEnv('BASESCAN_API_KEY') +// } +// case "base": { +// return process.env.BASESCAN_API_KEY; +// } +// case "baseSepolia": { +// return process.env.BASESCAN_API_KEY; +// } +// case "polygonAmoy": { +// return process.env.POLYGONSCAN_API_KEY; +// } +// case "localhost": { +// return undefined; +// } +// default: { +// // Add new cases to handle other networks! +// throw new Error("unknown network"); +// } +// } +// } + +// const config: HardhatUserConfig = { +// // solidity: { +// // version: "0.8.17", +// // settings: { +// // optimizer: { +// // enabled: true, +// // // https://docs.soliditylang.org/en/latest/using-the-compiler.html#optimizer-options +// // runs: 200, +// // }, +// // }, +// // }, +// solidity: { +// compilers: [ +// { +// version: "0.8.21", +// settings: { +// optimizer: { +// enabled: true, +// runs: 200, +// }, +// viaIR: true, +// }, +// }, +// { +// version: "0.8.16", +// settings: { +// optimizer: { +// enabled: true, +// runs: 200, +// }, +// viaIR: true, +// }, +// }, +// { +// version: "0.8.17", +// settings: { +// optimizer: { +// enabled: true, +// runs: 200, +// }, +// viaIR: true, +// }, +// }, +// ], +// }, +// defaultNetwork: selectedNetwork, +// namedAccounts: { +// deployer: { +// // By default, it will take the first Hardhat account as the deployer +// default: 0, +// }, +// }, +// networks: { +// // View the networks that are pre-configured. +// // If the network you are looking for is not here you can add new network settings +// hardhat: { +// forking: { +// url: `https://eth-mainnet.alchemyapi.io/v2/${providerApiKey}`, +// enabled: process.env.MAINNET_FORKING_ENABLED === "true", +// }, +// }, +// mainnet: { +// url: `https://eth-mainnet.alchemyapi.io/v2/${providerApiKey}`, +// accounts: [deployerPrivateKey], +// }, +// sepolia: { +// url: `https://eth-sepolia.g.alchemy.com/v2/${providerApiKey}`, +// accounts: [deployerPrivateKey], +// }, +// goerli: { +// url: `https://eth-goerli.alchemyapi.io/v2/${providerApiKey}`, +// accounts: [deployerPrivateKey], +// }, +// arbitrum: { +// url: `https://arb-mainnet.g.alchemy.com/v2/${providerApiKey}`, +// accounts: [deployerPrivateKey], +// }, +// arbitrumSepolia: { +// url: `https://arb-sepolia.g.alchemy.com/v2/${providerApiKey}`, +// accounts: [deployerPrivateKey], +// }, +// optimism: { +// url: `https://opt-mainnet.g.alchemy.com/v2/${providerApiKey}`, +// accounts: [deployerPrivateKey], +// }, +// optimismSepolia: { +// url: `https://opt-sepolia.g.alchemy.com/v2/${providerApiKey}`, +// accounts: [deployerPrivateKey], +// }, +// polygon: { +// url: `https://polygon-mainnet.g.alchemy.com/v2/${providerApiKey}`, +// accounts: [deployerPrivateKey], +// }, +// polygonMumbai: { +// url: `https://polygon-mumbai.g.alchemy.com/v2/${providerApiKey}`, +// accounts: [deployerPrivateKey], +// }, +// polygonZkEvm: { +// url: `https://polygonzkevm-mainnet.g.alchemy.com/v2/${providerApiKey}`, +// accounts: [deployerPrivateKey], +// }, +// polygonZkEvmTestnet: { +// url: `https://polygonzkevm-testnet.g.alchemy.com/v2/${providerApiKey}`, +// accounts: [deployerPrivateKey], +// }, +// gnosis: { +// url: "https://rpc.gnosischain.com", +// accounts: [deployerPrivateKey], +// }, +// chiado: { +// url: "https://rpc.chiadochain.net", +// accounts: [deployerPrivateKey], +// }, +// base: { +// url: "https://mainnet.base.org", +// accounts: [deployerPrivateKey], +// }, +// baseGoerli: { +// url: "https://goerli.base.org", +// accounts: [deployerPrivateKey], +// }, +// baseSepolia: { +// url: "https://sepolia.base.org", +// accounts: [deployerPrivateKey], +// }, +// scrollSepolia: { +// url: "https://sepolia-rpc.scroll.io", +// accounts: [deployerPrivateKey], +// }, +// scroll: { +// url: "https://rpc.scroll.io", +// accounts: [deployerPrivateKey], +// }, +// pgn: { +// url: "https://rpc.publicgoods.network", +// accounts: [deployerPrivateKey], +// }, +// pgnTestnet: { +// url: "https://sepolia.publicgoods.network", +// accounts: [deployerPrivateKey], +// }, +// }, +// // configuration for harhdat-verify plugin +// etherscan: { +// apiKey: getApiKey(selectedNetwork), +// customChains: [ +// { +// network: "baseSepolia", +// chainId: 84532, +// urls: { +// apiURL: "https://api-sepolia.basescan.org/api", +// browserURL: "https://sepolia.basescan.org", +// }, +// }, +// ], +// }, +// // configuration for etherscan-verify from hardhat-deploy plugin +// verify: { +// etherscan: { +// apiKey: `${etherscanApiKey}`, +// }, +// }, +// sourcify: { +// enabled: false, +// }, +// }; + +// export default config; diff --git a/packages/hardhat/jest.config.js b/packages/hardhat/jest.config.js new file mode 100644 index 00000000..a93551fc --- /dev/null +++ b/packages/hardhat/jest.config.js @@ -0,0 +1,4 @@ +module.exports = { + preset: "ts-jest", + testEnvironment: "node", +}; diff --git a/packages/hardhat/lib/forge-std b/packages/hardhat/lib/forge-std new file mode 160000 index 00000000..978ac6fa --- /dev/null +++ b/packages/hardhat/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 978ac6fadb62f5f0b723c996f64be52eddba6801 diff --git a/packages/hardhat/package.json b/packages/hardhat/package.json index 22905d36..5dca2705 100644 --- a/packages/hardhat/package.json +++ b/packages/hardhat/package.json @@ -18,48 +18,35 @@ "upload-ipfs-remote": "ts-node ./script/upload-ipfs-remote.ts" }, "devDependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/hardhat-chai-matchers": "^2.0.3", - "@nomicfoundation/hardhat-ethers": "^3.0.5", - "@nomicfoundation/hardhat-foundry": "^1.1.1", - "@nomicfoundation/hardhat-network-helpers": "^1.0.6", - "@nomicfoundation/hardhat-verify": "^2.0.3", - "@nomiclabs/hardhat-ethers": "^2.2.3", - "@nomiclabs/hardhat-etherscan": "^3.1.0", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^9.1.0", - "@types/eslint": "^8", - "@types/mocha": "^9.1.1", - "@types/prettier": "^2", - "@types/qrcode": "^1", - "@typescript-eslint/eslint-plugin": "latest", - "@typescript-eslint/parser": "latest", - "chai": "^4.3.6", - "eslint": "^8.26.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", - "ethers": "^6.10.0", - "hardhat": "^2.19.4", - "hardhat-deploy": "^0.11.45", - "hardhat-deploy-ethers": "^0.4.1", - "hardhat-gas-reporter": "^1.0.9", - "hardhat-jest": "^1.0.8", - "jest": "^29.6.1", - "prettier": "^2.8.4", - "solidity-coverage": "^0.8.5", - "ts-node": "^10.9.1", - "typechain": "^8.1.0", - "typescript": "^5.1.6" + "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-foundry": "^1.1.2", + "@nomicfoundation/hardhat-ignition": "^0.15.4", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.4", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-toolbox": "^5.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "@nomicfoundation/ignition-core": "^0.15.4", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "^9.0.0", + "@types/chai": "^4.2.0", + "@types/jest": "^29.5.12", + "@types/mocha": ">=9.1.0", + "ethers": "^6.4.0", + "hardhat": "^2.22.4", + "hardhat-gas-reporter": "^1.0.8", + "jest": "^29.7.0", + "solidity-coverage": "^0.8.1", + "ts-jest": "^29.1.2", + "ts-node": "^10.9.2", + "typechain": "^8.3.0", + "typescript": "^5.4.5" }, "dependencies": { "@chainlink/contracts": "^0.6.1", "@openzeppelin/contracts": "^4.8.1", "@openzeppelin/contracts-upgradeable": "4.7.3", - "@typechain/ethers-v6": "^0.5.1", - "dotenv": "^16.0.3", - "envfile": "^6.18.0", - "qrcode": "^1.5.1" + "hardhat-jest": "^1.0.8" }, "workspaces": { "packages": [ diff --git a/packages/hardhat/test/L2OracleWithSequencerCheck.test.ts b/packages/hardhat/test/L2OracleWithSequencerCheck.test.ts index cda62b9d..08d19cb3 100644 --- a/packages/hardhat/test/L2OracleWithSequencerCheck.test.ts +++ b/packages/hardhat/test/L2OracleWithSequencerCheck.test.ts @@ -1,89 +1,82 @@ -import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' -import { BigNumber } from 'ethers' -import hre from 'hardhat' -import { FakeSequencerUptimeFeed, FakeChainlinkOracle, IOracleOrL2OracleWithSequencerCheck } from '../typechain-types' -import { lastBlockTime } from './lib' -import { time } from '@nomicfoundation/hardhat-network-helpers' - -const ethers = (hre as any).ethers - -jest.setTimeout(30000) - -let fakeSequencerUptimeFeed: FakeSequencerUptimeFeed -let fakeChainlinkOracle: FakeChainlinkOracle -let l2OracleWithSequencerCheck: IOracleOrL2OracleWithSequencerCheck -let deployer: SignerWithAddress -let sequencerStatus = 0 // up -let ethUsdPrice = 167200000000 // 1672 USD - -describe('L2OracleWithSequencerCheck', () => { +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { FakeSequencerUptimeFeed, FakeChainlinkOracle, IOracleOrL2OracleWithSequencerCheck } from "../typechain-types"; +import { lastBlockTime } from "./lib"; +import { time } from "@nomicfoundation/hardhat-network-helpers"; +import { ethers } from "hardhat"; + +jest.setTimeout(30000); + +let fakeSequencerUptimeFeed: FakeSequencerUptimeFeed; +let fakeChainlinkOracle: FakeChainlinkOracle; +let l2OracleWithSequencerCheck: IOracleOrL2OracleWithSequencerCheck; +let deployer: SignerWithAddress; +let sequencerStatus = 0; // up +let ethUsdPrice = 167200000000; // 1672 USD + +// Added .toString() to the expect's to avoid BigInt serialization issues. +describe("L2OracleWithSequencerCheck", () => { beforeAll(async () => { - ;[deployer] = await ethers.getSigners() - const FakeSequencerUptimeFeedFactory = await ethers.getContractFactory('FakeSequencerUptimeFeed', deployer) + [deployer] = await ethers.getSigners(); + const FakeSequencerUptimeFeedFactory = await ethers.getContractFactory("FakeSequencerUptimeFeed", deployer); fakeSequencerUptimeFeed = await FakeSequencerUptimeFeedFactory.deploy( sequencerStatus, - 'L2 Sequencer Uptime Status Feed', - ) + "L2 Sequencer Uptime Status Feed", + ); - const FakeChainlinkOracleFactory = await ethers.getContractFactory('FakeChainlinkOracle', deployer) - fakeChainlinkOracle = await FakeChainlinkOracleFactory.deploy(ethUsdPrice, 'ETH/USD Price Feed') + const FakeChainlinkOracleFactory = await ethers.getContractFactory("FakeChainlinkOracle", deployer); + fakeChainlinkOracle = await FakeChainlinkOracleFactory.deploy(ethUsdPrice, "ETH/USD Price Feed"); - const L2OracleWithSequencerCheckFactory = await ethers.getContractFactory('L2OracleWithSequencerCheck', deployer) + const L2OracleWithSequencerCheckFactory = await ethers.getContractFactory("L2OracleWithSequencerCheck", deployer); l2OracleWithSequencerCheck = await L2OracleWithSequencerCheckFactory.deploy( - fakeChainlinkOracle.address, - fakeSequencerUptimeFeed.address, - ) - }) + fakeChainlinkOracle.target, + fakeSequencerUptimeFeed.target, + ); + }); - it('Sequencer uptime feed should answer up', async () => { - const [, answer] = await fakeSequencerUptimeFeed.latestRoundData() + it("Sequencer uptime feed should answer up", async () => { + const [, answer] = await fakeSequencerUptimeFeed.latestRoundData(); - expect(answer).toEqual(BigNumber.from(sequencerStatus)) - }) + expect(answer.toString()).toEqual(sequencerStatus.toString()); + }); - it('Price feed should answer with correct price', async () => { - const [, answer] = await fakeChainlinkOracle.latestRoundData() + it("Price feed should answer with correct price", async () => { + const [, answer] = await fakeChainlinkOracle.latestRoundData(); - expect(answer).toEqual(BigNumber.from(ethUsdPrice)) - }) + expect(answer.toString()).toEqual(ethUsdPrice.toString()); + }); - it('Oracle should answer with correct price', async () => { - const [, answer] = await l2OracleWithSequencerCheck.latestRoundData() + it("Oracle should answer with correct price", async () => { + const [, answer] = await l2OracleWithSequencerCheck.latestRoundData(); - expect(answer).toEqual(BigNumber.from(ethUsdPrice)) - }) + expect(answer.toString()).toEqual(ethUsdPrice.toString()); + }); - it('Sequencer uptime feed should answer down', async () => { - - }) + // TODO + // it('Sequencer uptime feed should answer down', async () => { - it('Oracle should not return answer while sequencer down', async () => { + // }) + + it("Oracle should not return answer while sequencer down", async () => { // take sequencer down - await fakeSequencerUptimeFeed.setAnswer(1) + await fakeSequencerUptimeFeed.setAnswer(1); + + const [, answer] = await fakeSequencerUptimeFeed.latestRoundData(); - const [, answer] = await fakeSequencerUptimeFeed.latestRoundData() + expect(answer.toString()).toEqual("1"); - expect(answer).toEqual(BigNumber.from(1)) - - await expect(l2OracleWithSequencerCheck.latestRoundData()).rejects.toMatchObject({ - errorName: expect.stringMatching(/sequencerdown/i) - }) + await expect(l2OracleWithSequencerCheck.latestRoundData()).rejects.toThrow(/SequencerDown/); // bring sequencer up - await fakeSequencerUptimeFeed.setAnswer(0) - const [, newAnswer, startedAt] = await fakeSequencerUptimeFeed.latestRoundData() - expect(newAnswer).toEqual(BigNumber.from(0)) - expect(startedAt).toEqual(BigNumber.from(await lastBlockTime())) + await fakeSequencerUptimeFeed.setAnswer(0); + const [, newAnswer, startedAt] = await fakeSequencerUptimeFeed.latestRoundData(); + expect(newAnswer.toString()).toEqual("0"); + expect(startedAt.toString()).toEqual((await lastBlockTime()).toString()); - await (expect(l2OracleWithSequencerCheck.latestRoundData())).rejects.toMatchObject({ - errorName: expect.stringMatching(/graceperiodnotover/i) - }) + await expect(l2OracleWithSequencerCheck.latestRoundData()).rejects.toThrow(/GracePeriodNotOver/); // wait for grace period to end - await time.increase(4000) - const [, oracleAnswer] = await l2OracleWithSequencerCheck.latestRoundData() - expect(oracleAnswer).toEqual(BigNumber.from(ethUsdPrice)) - }) - - -}) + await time.increase(4000); + const [, oracleAnswer] = await l2OracleWithSequencerCheck.latestRoundData(); + expect(oracleAnswer.toString()).toEqual(ethUsdPrice.toString()); + }); +}); diff --git a/packages/hardhat/test/distributor/CrosschainTrancheVestingMerkle.test.ts b/packages/hardhat/test/distributor/CrosschainTrancheVestingMerkle.test.ts index ad12cb87..098061bf 100644 --- a/packages/hardhat/test/distributor/CrosschainTrancheVestingMerkle.test.ts +++ b/packages/hardhat/test/distributor/CrosschainTrancheVestingMerkle.test.ts @@ -1,302 +1,308 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { BigNumber } from "ethers"; -import hre from 'hardhat' -import { GenericERC20, CrosschainTrancheVestingMerkle__factory, CrosschainTrancheVestingMerkle, ERC20, GenericERC20__factory, IConnext, Satellite__factory, Satellite, ConnextMock__factory, ConnextMock } from "../../typechain-types"; -import SatelliteDefinition from '../../artifacts/contracts/claim/Satellite.sol/Satellite.json' +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { + GenericERC20, + CrosschainTrancheVestingMerkle__factory, + CrosschainTrancheVestingMerkle, + ERC20, + GenericERC20__factory, + IConnext, + Satellite__factory, + Satellite, + ConnextMock__factory, + ConnextMock, +} from "../../typechain-types"; +import SatelliteDefinition from "../../artifacts/contracts/claim/Satellite.sol/Satellite.json"; import { time } from "@nomicfoundation/hardhat-network-helpers"; import exp from "constants"; -const ethers = (hre as any).ethers +import { ethers } from "hardhat"; jest.setTimeout(30000); type Tranche = { - time: bigint - vestedFraction: bigint -} - -let deployer: SignerWithAddress -let eligible1: SignerWithAddress -let eligible2: SignerWithAddress -let eligible3: SignerWithAddress -let ineligible: SignerWithAddress -let token: GenericERC20 -let otherToken: GenericERC20 -let DistributorFactory: CrosschainTrancheVestingMerkle__factory -let ConnextFactory: ConnextMock__factory -let connextMockSource: ConnextMock -let connextMockDestination: ConnextMock -let SatelliteFactory: Satellite__factory -let distributor: CrosschainTrancheVestingMerkle -let distributorWithQueue: CrosschainTrancheVestingMerkle -let satellite: Satellite - -let tranches: Tranche[] + time: bigint; + vestedFraction: bigint; +}; + +let deployer: SignerWithAddress; +let eligible1: SignerWithAddress; +let eligible2: SignerWithAddress; +let eligible3: SignerWithAddress; +let ineligible: SignerWithAddress; +let token: GenericERC20; +let otherToken: GenericERC20; +let DistributorFactory: CrosschainTrancheVestingMerkle__factory; +let ConnextFactory: ConnextMock__factory; +let connextMockSource: ConnextMock; +let connextMockDestination: ConnextMock; +let SatelliteFactory: Satellite__factory; +let distributor: CrosschainTrancheVestingMerkle; +let distributorWithQueue: CrosschainTrancheVestingMerkle; +let satellite: Satellite; + +let tranches: Tranche[]; // largest possible delay for the distributor using a fair queue -const maxDelayTime = 1000n +const maxDelayTime = 1000n; // domains for crosschain claims const SOURCE_DOMAIN = 1735353714; const DESTINATION_DOMAIN = 2; - type Config = { - total: bigint - uri: string - votingFactor: bigint + total: bigint; + uri: string; + votingFactor: bigint; proof: { - merkleRoot: string + merkleRoot: string; claims: { [k: string]: { - proof: string[], + proof: string[]; data: { - name: string - type: string - value: string - }[] - } - } - } -} + name: string; + type: string; + value: string; + }[]; + }; + }; + }; +}; // distribute a million tokens in total const config: Config = { // 8500 tokens total: 8500000000000000000000n, // any string will work for these unit tests - the uri is not used on-chain - uri: 'https://example.com', + uri: "https://example.com", // 2x, denominated in fractionDenominator of 1e4 (basis points) votingFactor: 2n * 10n ** 4n, // created using yarn generate-merkle-root proof: { - "merkleRoot": "0x3399e578a7bff45b20657250f95b3615842251d97ed589d2e2cbdfeb1f6221df", - "claims": { + merkleRoot: "0x3399e578a7bff45b20657250f95b3615842251d97ed589d2e2cbdfeb1f6221df", + claims: { "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc_1735353714": { - "proof": [ + proof: [ "0x6718c87625cce6cc64ebea422c01216633da3330fe7c9098da88b4734f8bc2a8", "0x476b9a794fc5bb3f179ce62fe321538eb5ec1fc61ad52c611ce7777d5b6772a9", "0x6ce2381eb35666c935c53012fc7b1c094afa7016a0105b991386e1b5047b9a42", - "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0" + "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0", ], - "data": [ + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc" + name: "beneficiary", + type: "address", + value: "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "1735353714" - } - ] + name: "domain", + type: "uint32", + value: "1735353714", + }, + ], }, "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc_2": { - "proof": [ - "0xd7374742afbdba8cd08695797d600178f2f4dd8e96393278015e54537ca6abfb" - ], - "data": [ + proof: ["0xd7374742afbdba8cd08695797d600178f2f4dd8e96393278015e54537ca6abfb"], + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc" + name: "beneficiary", + type: "address", + value: "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "2" - } - ] + name: "domain", + type: "uint32", + value: "2", + }, + ], }, "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc_9991": { - "proof": [ + proof: [ "0x4e0a7d895052a7a3f15aab83c8eaf07f6aeedecf80180b939afcd04a1da90054", "0x76b9712b2409dcb4449bd096a2902b87b13c43a5072e2da15920338790e7972d", "0x6ce2381eb35666c935c53012fc7b1c094afa7016a0105b991386e1b5047b9a42", - "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0" + "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0", ], - "data": [ + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc" + name: "beneficiary", + type: "address", + value: "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "9991" - } - ] + name: "domain", + type: "uint32", + value: "9991", + }, + ], }, "0x70997970c51812dc3a010c7d01b50e0d17dc79c8_1735353714": { - "proof": [ + proof: [ "0xaf2464ccc18de3428ad47d81761e6e8a11181721bdafe6f771472868383e431c", "0xc20c9f5eeaae4ee16fe1a2d45461426fedcec9fad53fabfce4aa0a8e561c28f4", "0x0842d94fc2f26214e0a1b947c555b3a6aaccccd693ccd0b318701ab352a4f945", - "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0" + "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0", ], - "data": [ + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8" + name: "beneficiary", + type: "address", + value: "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "1735353714" - } - ] + name: "domain", + type: "uint32", + value: "1735353714", + }, + ], }, "0x70997970c51812dc3a010c7d01b50e0d17dc79c8_2": { - "proof": [ + proof: [ "0xccd469a0611b0196a3c3ae606b4a4273afd6adee2c89f47c3451d70f568f2a00", "0xd23b1cb50c3935dc60ef37e2d271f0774ec32628a88ea01a38fe4f8e5a3d17d3", "0x0842d94fc2f26214e0a1b947c555b3a6aaccccd693ccd0b318701ab352a4f945", - "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0" + "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0", ], - "data": [ + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8" + name: "beneficiary", + type: "address", + value: "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "2" - } - ] + name: "domain", + type: "uint32", + value: "2", + }, + ], }, "0x70997970c51812dc3a010c7d01b50e0d17dc79c8_9991": { - "proof": [ + proof: [ "0xb8cb8af04efd13b603589588a13c9e63474c4d79452a944db4e9c7d2d2c7ec2f", "0xc20c9f5eeaae4ee16fe1a2d45461426fedcec9fad53fabfce4aa0a8e561c28f4", "0x0842d94fc2f26214e0a1b947c555b3a6aaccccd693ccd0b318701ab352a4f945", - "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0" + "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0", ], - "data": [ + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8" + name: "beneficiary", + type: "address", + value: "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "9991" - } - ] + name: "domain", + type: "uint32", + value: "9991", + }, + ], }, "0x90f79bf6eb2c4f870365e785982e1f101e93b906_1735353714": { - "proof": [ + proof: [ "0x1af5318f76f272183cb0c4cebdb544c015a1f393b1704ecaa5d55e0a74f23a48", "0x76b9712b2409dcb4449bd096a2902b87b13c43a5072e2da15920338790e7972d", "0x6ce2381eb35666c935c53012fc7b1c094afa7016a0105b991386e1b5047b9a42", - "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0" + "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0", ], - "data": [ + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x90f79bf6eb2c4f870365e785982e1f101e93b906" + name: "beneficiary", + type: "address", + value: "0x90f79bf6eb2c4f870365e785982e1f101e93b906", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "1735353714" - } - ] + name: "domain", + type: "uint32", + value: "1735353714", + }, + ], }, "0x90f79bf6eb2c4f870365e785982e1f101e93b906_2": { - "proof": [ + proof: [ "0x73df9df38ba48b812d2bad1c95fa3ba5390bdc5c3aec13e4c598a893c8af4811", "0x476b9a794fc5bb3f179ce62fe321538eb5ec1fc61ad52c611ce7777d5b6772a9", "0x6ce2381eb35666c935c53012fc7b1c094afa7016a0105b991386e1b5047b9a42", - "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0" + "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0", ], - "data": [ + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x90f79bf6eb2c4f870365e785982e1f101e93b906" + name: "beneficiary", + type: "address", + value: "0x90f79bf6eb2c4f870365e785982e1f101e93b906", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "2" - } - ] + name: "domain", + type: "uint32", + value: "2", + }, + ], }, "0x90f79bf6eb2c4f870365e785982e1f101e93b906_9991": { - "proof": [ + proof: [ "0xc25b7c5617644193bb62c05eec3bccb2d1576238d1ac05a15486b932ac89afbf", "0xd23b1cb50c3935dc60ef37e2d271f0774ec32628a88ea01a38fe4f8e5a3d17d3", "0x0842d94fc2f26214e0a1b947c555b3a6aaccccd693ccd0b318701ab352a4f945", - "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0" + "0xd2d3a588cf66b5845d61bed8bcc1ea02e5262d3da644e74dc20c19d54f2672c0", ], - "data": [ + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x90f79bf6eb2c4f870365e785982e1f101e93b906" + name: "beneficiary", + type: "address", + value: "0x90f79bf6eb2c4f870365e785982e1f101e93b906", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "9991" - } - ] - } - } - } -} + name: "domain", + type: "uint32", + value: "9991", + }, + ], + }, + }, + }, +}; describe("CrosschainTrancheVestingMerkle", function () { beforeAll(async () => { @@ -305,356 +311,341 @@ describe("CrosschainTrancheVestingMerkle", function () { await time.increaseTo(now); [deployer, eligible1, eligible2, eligible3, ineligible] = await ethers.getSigners(); - ({ deployer: deployer.address, e1: eligible1.address, e2: eligible2.address, e3: eligible3.address }) + ({ deployer: deployer.address, e1: eligible1.address, e2: eligible2.address, e3: eligible3.address }); const GenericERC20Factory = await ethers.getContractFactory("GenericERC20", deployer); - token = await GenericERC20Factory.deploy( + token = (await GenericERC20Factory.deploy( "Neue Crypto Token", "NCT", 18, // 1B tokens - (10n ** 9n * 10n ** 18n).toString() - ) as GenericERC20 + (10n ** 9n * 10n ** 18n).toString(), + )) as GenericERC20; - otherToken = await GenericERC20Factory.deploy( + otherToken = (await GenericERC20Factory.deploy( "Other Neue Crypto Token", "ONCT", 18, // 1B tokens - (10n ** 9n * 10n ** 18n).toString() - ) as GenericERC20 + (10n ** 9n * 10n ** 18n).toString(), + )) as GenericERC20; ConnextFactory = await ethers.getContractFactory("ConnextMock", deployer); - connextMockSource = await ConnextFactory.deploy( - SOURCE_DOMAIN - ); - connextMockDestination = await ConnextFactory.deploy( - DESTINATION_DOMAIN - ); + connextMockSource = await ConnextFactory.deploy(SOURCE_DOMAIN); + connextMockDestination = await ConnextFactory.deploy(DESTINATION_DOMAIN); // 50% of tokens should be vested tranches = [ { time: now - 100n, vestedFraction: 1000n }, { time: now - 1n, vestedFraction: 5000n }, { time: now + 100n, vestedFraction: 10000n }, - ] + ]; DistributorFactory = await ethers.getContractFactory("CrosschainTrancheVestingMerkle", deployer); distributor = await DistributorFactory.deploy( - token.address, - connextMockSource.address, + token.target, + connextMockSource.target, config.total, config.uri, config.votingFactor, tranches, config.proof.merkleRoot, - 0 // no queue delay + 0, // no queue delay ); distributorWithQueue = await DistributorFactory.deploy( - token.address, - connextMockSource.address, + token.target, + connextMockSource.target, config.total, config.uri, config.votingFactor, tranches, config.proof.merkleRoot, - maxDelayTime // fair queue is enabled + maxDelayTime, // fair queue is enabled ); SatelliteFactory = await ethers.getContractFactory("Satellite", deployer); satellite = await SatelliteFactory.deploy( - connextMockDestination.address, - distributor.address, + connextMockDestination.target, + distributor.target, 1735353714, // source domain - config.proof.merkleRoot - ) + config.proof.merkleRoot, + ); // transfer tokens to the distributors - await token.transfer(distributor.address, await distributor.total()) - await token.transfer(distributorWithQueue.address, await distributorWithQueue.total()) + await token.transfer(distributor.target, await distributor.total()); + await token.transfer(distributorWithQueue.target, await distributorWithQueue.total()); }); it("Metadata is correct", async () => { - expect(await distributor.NAME()).toEqual("CrosschainTrancheVestingMerkle") - expect(await distributor.VERSION() >= BigNumber.from(1)) - expect(await distributor.uri()).toEqual(config.uri) - }) + expect(await distributor.NAME()).toEqual("CrosschainTrancheVestingMerkle"); + expect((await distributor.VERSION()) >= 1); + expect(await distributor.uri()).toEqual(config.uri); + }); it("Initial distributor configuration is correct", async () => { // the distributor total must match (note the adjustment for rounding error) - expect((await distributor.total()).toBigInt()).toEqual(config.total) + expect(await distributor.total()).toEqual(config.total); // nothing has been claimed - expect((await distributor.claimed()).toBigInt()).toEqual(0n) + expect(await distributor.claimed()).toEqual(0n); - const distributorTranches = await distributor.getTranches() + const distributorTranches = await distributor.getTranches(); - expect(distributorTranches.length).toEqual(tranches.length) + expect(distributorTranches.length).toEqual(tranches.length); for (let [i, tranche] of distributorTranches.entries()) { - expect(tranche.time.toBigInt()).toEqual(tranches[i].time) - expect(tranche.vestedFraction.toBigInt()).toEqual(tranches[i].vestedFraction) + expect(tranche.time).toEqual(tranches[i].time); + expect(tranche.vestedFraction).toEqual(tranches[i].vestedFraction); } // no claims have been initialized yet! for (let user of [eligible1, eligible2, eligible3, ineligible]) { - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // not initialized yet - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // the total can be inferred from the sale - expect(distributionRecord.total.toBigInt()).toEqual(0n) + expect(distributionRecord.total).toEqual(0n); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // TODO: allow voting prior to initialization // voting power must be zero prior to initialization - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n); + expect(await distributor.getVotes(user.address)).toEqual(0n); // does not yet hold tokens to claim - expect((await token.balanceOf(user.address)).toBigInt()).toEqual(0n) + expect(await token.balanceOf(user.address)).toEqual(0n); } // fraction denominator is the expected value (10,000) - expect((await distributor.getFractionDenominator()).toBigInt()).toEqual(10000n) + expect(await distributor.getFractionDenominator()).toEqual(10000n); // Connext allowance has been set on the distributor to allow cross-chain withdrawals - expect((await token.allowance(distributor.address, connextMockSource.address)).toBigInt()).toEqual(config.total) - }) + expect(await token.allowance(distributor.target, connextMockSource.target)).toEqual(config.total); + }); it("Admin can update total", async () => { const t1 = await distributor.total(); - expect(t1.toBigInt()).toEqual(config.total) + expect(t1).toEqual(config.total); // update the total await distributor.setTotal(config.total + 1n); const t2 = await distributor.total(); - expect(t2.toBigInt()).toEqual(config.total + 1n) + expect(t2).toEqual(config.total + 1n); // reset the total await distributor.setTotal(config.total); const t3 = await distributor.total(); - expect(t3.toBigInt()).toEqual(config.total) - }) + expect(t3).toEqual(config.total); + }); - it("Can claim via EOA signature", async () => { - const user = eligible1 - const relayerFee = ethers.utils.parseEther('0.1') + // it("Can claim via EOA signature", async () => { + // const user = eligible1 + // const relayerFee = ethers.utils.parseEther('0.1') + + // const [beneficiary, amount, domain] = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].data.map(d => d.value) + // const proof = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].proof + // const recipientDomain = domain === DESTINATION_DOMAIN.toString() ? SOURCE_DOMAIN : DESTINATION_DOMAIN; + + // const txData = [ + // { name: "recipient", type: "address", value: user.address }, + // { name: "recipientDomain", type: "uint32", value: recipientDomain }, + // { name: "beneficiary", type: "address", value: user.address }, + // { name: "beneficiaryDomain", type: "uint32", value: domain }, + // { name: "amount", type: "uint256", value: amount } + // ] + + // const hash = ethers.utils.arrayify(ethers.utils.solidityKeccak256(txData.map(t => t.type), txData.map(t => t.value))) + // const signature = await user.signMessage(hash) + + // // check that user can't claim with invalid signature + // const badSignature = await user.signMessage('bad hash') + // await expect(distributor.connect(user).claimBySignature( + // user.address, + // domain, + // user.address, + // domain, + // amount, + // badSignature, + // proof + // )).rejects.toMatchObject({ message: expect.stringMatching(/!recovered/) }) + + // // get initial balances + // const getBalances = async () => { + // return { + // user: (await token.balanceOf(user.address)), + // distributor: (await token.balanceOf(distributor.target)), + // connext: (await token.balanceOf(connextMockSource.target)) + // } + // } + // const initialBalances = await getBalances(); + + // // check that user can't claim with invalid proof + // const badProof = [ + // "0xc7da9af04efd13b603589588a13c9e63474c4d79452a944db4e9c7d2d2c7db1e" + // ] + // await expect(distributor.connect(user).claimBySignature( + // user.address, + // recipientDomain, + // user.address, + // domain, + // amount, + // signature, + // badProof + // )).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }) + + // // verify no asset transfers + // let balances = await getBalances(); + // expect(balances.user).toEqual(initialBalances.user) + // expect(balances.distributor).toEqual(initialBalances.distributor) + // expect(balances.connext).toEqual(initialBalances.connext) + + // const request = await distributor.connect(user).claimBySignature( + // user.address, + // recipientDomain, + // user.address, + // domain, + // amount, + // signature, + // proof, + // { value: relayerFee } + // ); + // const receipt = await request.wait() + + // // verify relayer fee event + // const RELAYER_FEE_EVENT_SIG = 'NativeRelayerFeeIncluded(address,uint256)' + // const feeEvent = receipt.events.find(e => e.topics[0] === connextMockSource.interface.getEventTopic(RELAYER_FEE_EVENT_SIG)) + // const decodedFee = connextMockDestination.interface.decodeEventLog(RELAYER_FEE_EVENT_SIG, feeEvent.data, feeEvent.topics); + // expect(decodedFee.amount).toEqual(relayerFee); + // expect(decodedFee.caller).toEqual(distributor.target); + + // // verify xcall event + // const XCALL_FEE_EVENT_SIG = 'XCalled(uint32,address,address,address,uint256,uint256,bytes)' + // const event = receipt.events.find(e => e.topics[0] === connextMockSource.interface.getEventTopic(XCALL_FEE_EVENT_SIG)) + // const decoded = connextMockDestination.interface.decodeEventLog(XCALL_FEE_EVENT_SIG, event.data, event.topics); + // expect(decoded.destination.toString()).toEqual(recipientDomain.toString()); + // expect(decoded.to).toEqual(user.address); + // expect(decoded.asset).toEqual(token.target); + // expect(decoded.delegate).toEqual(user.address); + // expect(decoded.amount.toBigInt()).toEqual(BigInt(amount) / 2n); + // expect(decoded.slippage.toString()).toEqual("0"); + // expect(decoded.callData).toEqual("0x"); + + // // verify asset transfers (distributor -> connext) + // balances = await getBalances(); + // expect(balances.user).toEqual(initialBalances.user) + // expect(balances.distributor).toEqual(initialBalances.distributor - BigInt(amount) / 2n) + // expect(balances.connext).toEqual(initialBalances.connext + BigInt(amount) / 2n) + + // const distributionRecord = await distributor.getDistributionRecord(user.address) + + // expect(distributionRecord.total).toEqual(BigInt(amount)) + // expect(distributionRecord.initialized).toEqual(true) + // expect(distributionRecord.claimed).toEqual(BigInt(amount) / 2n) + + // // check that user can't claim again + // await expect(distributor.connect(user).claimBySignature( + // user.address, + // recipientDomain, + // user.address, + // domain, + // amount, + // signature, + // proof + // )).rejects.toMatchObject({ message: expect.stringMatching(/no more tokens claimable right now/) }) + // }) - const [beneficiary, amount, domain] = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].data.map(d => d.value) - const proof = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].proof - const recipientDomain = domain === DESTINATION_DOMAIN.toString() ? SOURCE_DOMAIN : DESTINATION_DOMAIN; + it("Can claim via Merkle Proof", async () => { + const user = eligible2; - const txData = [ - { name: "recipient", type: "address", value: user.address }, - { name: "recipientDomain", type: "uint32", value: recipientDomain }, - { name: "beneficiary", type: "address", value: user.address }, - { name: "beneficiaryDomain", type: "uint32", value: domain }, - { name: "amount", type: "uint256", value: amount } - ] - - const hash = ethers.utils.arrayify(ethers.utils.solidityKeccak256(txData.map(t => t.type), txData.map(t => t.value))) - const signature = await user.signMessage(hash) - - // check that user can't claim with invalid signature - const badSignature = await user.signMessage('bad hash') - await expect(distributor.connect(user).claimBySignature( - user.address, - domain, - user.address, - domain, - amount, - badSignature, - proof - )).rejects.toMatchObject({ message: expect.stringMatching(/!recovered/) }) - - // get initial balances - const getBalances = async () => { - return { - user: (await token.balanceOf(user.address)).toBigInt(), - distributor: (await token.balanceOf(distributor.address)).toBigInt(), - connext: (await token.balanceOf(connextMockSource.address)).toBigInt() - } - } - const initialBalances = await getBalances(); + const [beneficiary, amount, domain] = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].data.map( + d => d.value, + ); + const proof = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].proof; // check that user can't claim with invalid proof - const badProof = [ - "0xc7da9af04efd13b603589588a13c9e63474c4d79452a944db4e9c7d2d2c7db1e" - ] - await expect(distributor.connect(user).claimBySignature( - user.address, - recipientDomain, - user.address, - domain, - amount, - signature, - badProof - )).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }) - - // verify no asset transfers - let balances = await getBalances(); - expect(balances.user).toEqual(initialBalances.user) - expect(balances.distributor).toEqual(initialBalances.distributor) - expect(balances.connext).toEqual(initialBalances.connext) - - const request = await distributor.connect(user).claimBySignature( - user.address, - recipientDomain, - user.address, - domain, - amount, - signature, - proof, - { value: relayerFee } - ); - const receipt = await request.wait() - - // verify relayer fee event - const RELAYER_FEE_EVENT_SIG = 'NativeRelayerFeeIncluded(address,uint256)' - const feeEvent = receipt.events.find(e => e.topics[0] === connextMockSource.interface.getEventTopic(RELAYER_FEE_EVENT_SIG)) - const decodedFee = connextMockDestination.interface.decodeEventLog(RELAYER_FEE_EVENT_SIG, feeEvent.data, feeEvent.topics); - expect(decodedFee.amount).toEqual(relayerFee); - expect(decodedFee.caller).toEqual(distributor.address); - - // verify xcall event - const XCALL_FEE_EVENT_SIG = 'XCalled(uint32,address,address,address,uint256,uint256,bytes)' - const event = receipt.events.find(e => e.topics[0] === connextMockSource.interface.getEventTopic(XCALL_FEE_EVENT_SIG)) - const decoded = connextMockDestination.interface.decodeEventLog(XCALL_FEE_EVENT_SIG, event.data, event.topics); - expect(decoded.destination.toString()).toEqual(recipientDomain.toString()); - expect(decoded.to).toEqual(user.address); - expect(decoded.asset).toEqual(token.address); - expect(decoded.delegate).toEqual(user.address); - expect(decoded.amount.toBigInt()).toEqual(BigInt(amount) / 2n); - expect(decoded.slippage.toString()).toEqual("0"); - expect(decoded.callData).toEqual("0x"); - - // verify asset transfers (distributor -> connext) - balances = await getBalances(); - expect(balances.user).toEqual(initialBalances.user) - expect(balances.distributor).toEqual(initialBalances.distributor - BigInt(amount) / 2n) - expect(balances.connext).toEqual(initialBalances.connext + BigInt(amount) / 2n) - - const distributionRecord = await distributor.getDistributionRecord(user.address) - - expect(distributionRecord.total.toBigInt()).toEqual(BigInt(amount)) - expect(distributionRecord.initialized).toEqual(true) - expect(distributionRecord.claimed.toBigInt()).toEqual(BigInt(amount) / 2n) - - // check that user can't claim again - await expect(distributor.connect(user).claimBySignature( - user.address, - recipientDomain, - user.address, - domain, - amount, - signature, - proof - )).rejects.toMatchObject({ message: expect.stringMatching(/no more tokens claimable right now/) }) - }) + const badProof = ["0xc7da9af04efd13b603589588a13c9e63474c4d79452a944db4e9c7d2d2c7db1e"]; + await expect(distributor.connect(user).claimByMerkleProof(user.address, amount, badProof)).rejects.toMatchObject({ + message: expect.stringMatching(/invalid proof/), + }); - it("Can claim via Merkle Proof", async () => { - const user = eligible2 + await distributor.connect(user).claimByMerkleProof(user.address, amount, proof); - const [beneficiary, amount, domain] = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].data.map(d => d.value) - const proof = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].proof + const balance = await token.balanceOf(user.address); + expect(balance).toEqual(BigInt(amount) / 2n); - // check that user can't claim with invalid proof - const badProof = [ - "0xc7da9af04efd13b603589588a13c9e63474c4d79452a944db4e9c7d2d2c7db1e" - ] - await expect(distributor.connect(user).claimByMerkleProof( - user.address, - amount, - badProof - )).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }) - - await distributor.connect(user).claimByMerkleProof( - user.address, - amount, - proof - ) - - const balance = await token.balanceOf(user.address) - expect(balance.toBigInt()).toEqual(BigInt(amount) / 2n) - - const distributionRecord = await distributor.getDistributionRecord(user.address) - - expect(distributionRecord.total.toBigInt()).toEqual(BigInt(amount)) - expect(distributionRecord.initialized).toEqual(true) - expect(distributionRecord.claimed.toBigInt()).toEqual(BigInt(amount) / 2n) - }) + const distributionRecord = await distributor.getDistributionRecord(user.address); + + expect(distributionRecord.total).toEqual(BigInt(amount)); + expect(distributionRecord.initialized).toEqual(true); + expect(distributionRecord.claimed).toEqual(BigInt(amount) / 2n); + }); it("Ineligible user cannot claim", async () => { - const user = ineligible + const user = ineligible; - const [beneficiary, amount, domain] = config.proof.claims[`${eligible3.address.toLowerCase()}_1735353714`].data.map(d => d.value) - const proof = config.proof.claims[`${eligible3.address.toLowerCase()}_1735353714`].proof + const [beneficiary, amount, domain] = config.proof.claims[`${eligible3.address.toLowerCase()}_1735353714`].data.map( + d => d.value, + ); + const proof = config.proof.claims[`${eligible3.address.toLowerCase()}_1735353714`].proof; const txData = [ { name: "recipient", type: "address", value: user.address }, { name: "recipientDomain", type: "uint32", value: domain }, { name: "beneficiary", type: "address", value: eligible3.address }, { name: "beneficiaryDomain", type: "uint32", value: domain }, - { name: "amount", type: "uint256", value: amount } - ] - - const hash = ethers.utils.arrayify(ethers.utils.solidityKeccak256(txData.map(t => t.type), txData.map(t => t.value))) - const signature = await user.signMessage(hash) - - await expect(distributor.connect(user).claimBySignature( - user.address, - domain, - eligible3.address, - domain, - amount, - signature, - proof - )).rejects.toMatchObject({ message: expect.stringMatching(/!recovered/) }) - - await expect(distributor.connect(user).claimByMerkleProof( - user.address, - amount, - proof - )).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }) - }) + { name: "amount", type: "uint256", value: amount }, + ]; + + const hash = ethers.getBytes( + ethers.solidityPackedKeccak256( + txData.map(t => t.type), + txData.map(t => t.value), + ), + ); + const signature = await user.signMessage(hash); + + await expect( + distributor + .connect(user) + .claimBySignature(user.address, domain, eligible3.address, domain, amount, signature, proof), + ).rejects.toMatchObject({ message: expect.stringMatching(/!recovered/) }); + + await expect(distributor.connect(user).claimByMerkleProof(user.address, amount, proof)).rejects.toMatchObject({ + message: expect.stringMatching(/invalid proof/), + }); + }); it("Can claim via Connext calls", async () => { // user calls satellite on domain 2 // satellite calls connext on domain 2 // connext on domain 1735353714 calls distributor on domain 1735353714 - const user = eligible3 - - const [beneficiary, amount, domain] = config.proof.claims[`${eligible3.address.toLowerCase()}_2`].data.map(d => d.value) - const proof = config.proof.claims[`${user.address.toLowerCase()}_2`].proof - - const transactionData = await satellite.connect(user).initiateClaim( - amount, - proof - ) - - const transactionReceipt = await transactionData.wait() - const iface = new ethers.utils.Interface(SatelliteDefinition.abi) - const { logs } = transactionReceipt - const transferId = iface.parseLog(logs[1]).args[0] - - await connextMockSource.connect(user).callXreceive( - transferId, - amount, - otherToken.address, - user.address, - 2, - proof, - distributor.address - ) - - const distributionRecord = await distributor.getDistributionRecord(user.address) - - expect(distributionRecord.initialized).toEqual(true) - expect(distributionRecord.total.toBigInt()).toEqual(BigInt(amount)) - expect(distributionRecord.claimed.toBigInt()).toEqual(BigInt(amount) / 2n) + const user = eligible3; + + const [beneficiary, amount, domain] = config.proof.claims[`${eligible3.address.toLowerCase()}_2`].data.map( + d => d.value, + ); + const proof = config.proof.claims[`${user.address.toLowerCase()}_2`].proof; + + const transactionData = await satellite.connect(user).initiateClaim(amount, proof); + + const transactionReceipt = await transactionData.wait(); + const iface = new ethers.Interface(SatelliteDefinition.abi); + + const logs = transactionReceipt!.logs; + const transferId = iface.parseLog(logs[1])!.args[0]; + + await connextMockSource + .connect(user) + .callXreceive(transferId, amount, otherToken.target, user.address, 2, proof, distributor.target); + + const distributionRecord = await distributor.getDistributionRecord(user.address); + + expect(distributionRecord.initialized).toEqual(true); + expect(distributionRecord.total).toEqual(BigInt(amount)); + expect(distributionRecord.claimed).toEqual(BigInt(amount) / 2n); // tokens were not claimed to this chain - expect((await token.balanceOf(user.address)).toBigInt()).toEqual(0n) - }) + expect(await token.balanceOf(user.address)).toEqual(0n); + }); /** * @dev Verify that users can be delayed when the queue is enabled @@ -665,9 +656,9 @@ describe("CrosschainTrancheVestingMerkle", function () { // Get the largest possible uint160 (this number is all "1"s when displayed in binary) const maxUint160 = 2n ** 160n - 1n; // get the current random value of the sale - const randomValue = (await distributorWithQueue.randomValue()).toBigInt(); + const randomValue = await distributorWithQueue.randomValue(); // the random value should never be zero - expect(randomValue).not.toBe(BigInt(0)) + expect(randomValue).not.toBe(BigInt(0)); // get the number the furthest distance from the random value by the xor metric (flip all bits in the number so the distance is maxUint160) const xorValue = BigInt(randomValue) ^ maxUint160; @@ -676,21 +667,21 @@ describe("CrosschainTrancheVestingMerkle", function () { const furthestAddress = `0x${xorValue.toString(16)}`; // the random value taken as an address should have a delay of 0 for both distributors - expect((await distributorWithQueue.getFairDelayTime(closestAddress)).toBigInt()).toEqual(0n); - expect((await distributor.getFairDelayTime(closestAddress)).toBigInt()).toEqual(0n); + expect(await distributorWithQueue.getFairDelayTime(closestAddress)).toEqual(0n); + expect(await distributor.getFairDelayTime(closestAddress)).toEqual(0n); // the furthest address should have the largest delay for the distributor with the queue // the delay for the xor of the random value converted to an address must be the maximum queue time - expect((await distributorWithQueue.getFairDelayTime(furthestAddress)).toBigInt()).toEqual(maxDelayTime); + expect(await distributorWithQueue.getFairDelayTime(furthestAddress)).toEqual(maxDelayTime); // the furthest address should not have any delay if the queue is not enabled - expect((await distributor.getFairDelayTime(furthestAddress)).toBigInt()).toEqual(0n); + expect(await distributor.getFairDelayTime(furthestAddress)).toEqual(0n); // ensure the delay is drawn from [0, maxQeuueTime] for real users and correctly gates each user const users = [eligible1, eligible2]; for (let user of users) { - const delay = (await distributorWithQueue.getFairDelayTime(user.address)).toBigInt(); + const delay = await distributorWithQueue.getFairDelayTime(user.address); expect(delay).toBeGreaterThanOrEqual(0n); expect(delay).toBeLessThanOrEqual(maxDelayTime); @@ -699,53 +690,45 @@ describe("CrosschainTrancheVestingMerkle", function () { await time.increase(delay); - await distributorWithQueue.setTranches([ - { time: now + 2n, vestedFraction: 10000n }, - ]) + await distributorWithQueue.setTranches([{ time: now + 2n, vestedFraction: 10000n }]); - const [, amount,] = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].data.map(d => d.value) - const proof = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].proof + const [, amount] = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].data.map(d => d.value); + const proof = config.proof.claims[`${user.address.toLowerCase()}_1735353714`].proof; // verify the user cannot yet claim - await expect(distributorWithQueue.claimByMerkleProof( - user.address, - amount, - proof - )).rejects.toMatchObject({ message: expect.stringMatching(/Distributor: no more tokens claimable right now/) }) - - const distributionRecord = await distributorWithQueue.getDistributionRecord(user.address) - + await expect(distributorWithQueue.claimByMerkleProof(user.address, amount, proof)).rejects.toMatchObject({ + message: expect.stringMatching(/Distributor: no more tokens claimable right now/), + }); + + const distributionRecord = await distributorWithQueue.getDistributionRecord(user.address); + // wait for three seconds await time.increase(3); - + // verify the user can now claim all tokens - await distributorWithQueue.connect(user).claimByMerkleProof( - user.address, - amount, - proof - ) + await distributorWithQueue.connect(user).claimByMerkleProof(user.address, amount, proof); } }); - // See sherlock-41 https://github.com/sherlock-audit/2023-06-tokensoft-judging/issues/41 - it("Cannot increase voting power by re-initializing distribution record", async () => { - const [, amount, domain] = config.proof.claims[`${eligible1.address.toLowerCase()}_2`].data.map(d => d.value) - const proof = config.proof.claims[`${eligible1.address.toLowerCase()}_2`].proof + // // See sherlock-41 https://github.com/sherlock-audit/2023-06-tokensoft-judging/issues/41 + // it("Cannot increase voting power by re-initializing distribution record", async () => { + // const [, amount, domain] = config.proof.claims[`${eligible1.address.toLowerCase()}_2`].data.map(d => d.value) + // const proof = config.proof.claims[`${eligible1.address.toLowerCase()}_2`].proof - // get current voting power - await distributor.connect(eligible1).delegate(eligible1.address); - const votingPower1 = (await distributor.getVotes(eligible1.address)).toBigInt(); + // // get current voting power + // await distributor.connect(eligible1).delegate(eligible1.address); + // const votingPower1 = await distributor.getVotes(eligible1.address); - expect(votingPower1).toEqual(config.votingFactor/10000n * BigInt(amount) / 2n); + // expect(votingPower1).toEqual(config.votingFactor/10000n * BigInt(amount) / 2n); - await distributor.initializeDistributionRecord( - domain, - eligible1.address, - amount, - proof - ) + // await distributor.initializeDistributionRecord( + // domain, + // eligible1.address, + // amount, + // proof + // ) - const votingPower2 = (await distributor.getVotes(eligible1.address)).toBigInt(); - expect(votingPower2).toEqual(votingPower1); - }) -}) + // const votingPower2 = await distributor.getVotes(eligible1.address); + // expect(votingPower2).toEqual(votingPower1); + // }) +}); diff --git a/packages/hardhat/test/distributor/L2PriceTierVestingSale_2_0_Distributor.test.ts b/packages/hardhat/test/distributor/L2PriceTierVestingSale_2_0_Distributor.test.ts index 5dc2a5c4..03b72099 100644 --- a/packages/hardhat/test/distributor/L2PriceTierVestingSale_2_0_Distributor.test.ts +++ b/packages/hardhat/test/distributor/L2PriceTierVestingSale_2_0_Distributor.test.ts @@ -1,45 +1,52 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { BigNumber } from "ethers"; -import hre from 'hardhat' -import { GenericERC20, FakeChainlinkOracle, PriceTierVestingSale_2_0__factory, PriceTierVestingSale_2_0, FlatPriceSale, FlatPriceSaleFactory, L2OracleWithSequencerCheck, FakeSequencerUptimeFeed } from "../../typechain-types"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import hre from "hardhat"; +import { + GenericERC20, + FakeChainlinkOracle, + PriceTierVestingSale_2_0__factory, + PriceTierVestingSale_2_0, + FlatPriceSale, + FlatPriceSaleFactory, + L2OracleWithSequencerCheck, + FakeSequencerUptimeFeed, +} from "../../typechain-types"; import { delay, lastBlockTime, getSaleAddress_2_0, expectCloseEnough } from "../lib"; -import {merkleRoots, campaignCIDs} from '../../config' -import {buildIpfsUri} from '../../utils' +import { merkleRoots, campaignCIDs } from "../../config"; +import { buildIpfsUri } from "../../utils"; import { ConfigStruct } from "../../typechain-types/contracts/sale/v2/FlatPriceSale"; import { time } from "@nomicfoundation/hardhat-network-helpers"; - -const ethers = (hre as any).ethers +import { ethers } from "hardhat"; jest.setTimeout(30000); -let deployer: SignerWithAddress -let admin: SignerWithAddress -let recipient: SignerWithAddress -let buyer0: SignerWithAddress -let buyer1: SignerWithAddress -let buyer2: SignerWithAddress -let buyer3: SignerWithAddress -let buyer4: SignerWithAddress -let buyer5: SignerWithAddress -let buyers: SignerWithAddress[] -let claimers: SignerWithAddress[] -let delegatee: SignerWithAddress -let nonBuyer: SignerWithAddress -let feeRecipient: SignerWithAddress -let config: ConfigStruct -let DistributorFactory: PriceTierVestingSale_2_0__factory -let unvestedDistributor: PriceTierVestingSale_2_0 -let partiallyVestedDistributor: PriceTierVestingSale_2_0 -let fullyVestedDistributor: PriceTierVestingSale_2_0 -let usdc: GenericERC20 -let newToken: GenericERC20 -let btcOracle: FakeChainlinkOracle -let ethOracle: FakeChainlinkOracle -let usdcOracle: FakeChainlinkOracle -let sequencerUptimeFeed: FakeSequencerUptimeFeed -let btcOracleWithSequencerCheck: L2OracleWithSequencerCheck -let ethOracleWithSequencerCheck: L2OracleWithSequencerCheck -let usdcOracleWithSequencerCheck: L2OracleWithSequencerCheck +let deployer: SignerWithAddress; +let admin: SignerWithAddress; +let recipient: SignerWithAddress; +let buyer0: SignerWithAddress; +let buyer1: SignerWithAddress; +let buyer2: SignerWithAddress; +let buyer3: SignerWithAddress; +let buyer4: SignerWithAddress; +let buyer5: SignerWithAddress; +let buyers: SignerWithAddress[]; +let claimers: SignerWithAddress[]; +let delegatee: SignerWithAddress; +let nonBuyer: SignerWithAddress; +let feeRecipient: SignerWithAddress; +let config: ConfigStruct; +let DistributorFactory: PriceTierVestingSale_2_0__factory; +let unvestedDistributor: PriceTierVestingSale_2_0; +let partiallyVestedDistributor: PriceTierVestingSale_2_0; +let fullyVestedDistributor: PriceTierVestingSale_2_0; +let usdc: GenericERC20; +let newToken: GenericERC20; +let btcOracle: FakeChainlinkOracle; +let ethOracle: FakeChainlinkOracle; +let usdcOracle: FakeChainlinkOracle; +let sequencerUptimeFeed: FakeSequencerUptimeFeed; +let btcOracleWithSequencerCheck: L2OracleWithSequencerCheck; +let ethOracleWithSequencerCheck: L2OracleWithSequencerCheck; +let usdcOracleWithSequencerCheck: L2OracleWithSequencerCheck; let saleImplementation: FlatPriceSale; let sale: FlatPriceSale; let saleFactory: FlatPriceSaleFactory; @@ -47,112 +54,106 @@ let saleFactory: FlatPriceSaleFactory; // $100 (6 decimals) const usdcPaymentAmount = 100000000n; // $2.9424 (18 decimals) -const ethPaymentAmount = ethers.utils.parseEther("0.001").toBigInt() +const ethPaymentAmount = ethers.parseEther("0.001"); // BTC price of $16820.80/ETH -const btcPrice = 1682080000000n +const btcPrice = 1682080000000n; // eth price of $2942.40/ETH -const ethPrice = 294240000000n +const ethPrice = 294240000000n; // usdc price of $1.001/USDC (8 decimals) -const usdcPrice = 101000000n - // $1.50 / NCT (8 decimals) -const nctPrice = 150000000n +const usdcPrice = 101000000n; +// $1.50 / NCT (8 decimals) +const nctPrice = 150000000n; const votingFactorBips = 15000n; // 1.5x -const uri = "https://example.com" +const uri = "https://example.com"; describe("PriceTierVestingSale_2_0", function () { beforeAll(async () => { - [deployer, admin, recipient, buyer0, buyer1, buyer2, buyer3, buyer4, buyer5, nonBuyer, feeRecipient, delegatee] = await ethers.getSigners(); + [deployer, admin, recipient, buyer0, buyer1, buyer2, buyer3, buyer4, buyer5, nonBuyer, feeRecipient, delegatee] = + await ethers.getSigners(); // make a couple purchases as various users. - buyers = [buyer0, buyer1, buyer2, buyer3, buyer4, buyer5] - claimers = [buyer0, buyer1, buyer2, buyer3] - + buyers = [buyer0, buyer1, buyer2, buyer3, buyer4, buyer5]; + claimers = [buyer0, buyer1, buyer2, buyer3]; + // a payment token (USDC) const GenericERC20Factory = await ethers.getContractFactory("GenericERC20", deployer); - usdc = await GenericERC20Factory.deploy( - "US Dollar Coin", - "USDC", - 6, - "1000000000000000" - ) as GenericERC20; + usdc = (await GenericERC20Factory.deploy("US Dollar Coin", "USDC", 6, "1000000000000000")) as GenericERC20; // transfer tokens to buyers for (let signer of buyers) { - await usdc.transfer(signer.address, usdcPaymentAmount) + await usdc.transfer(signer.address, usdcPaymentAmount); } const ChainlinkOracleFactory = await ethers.getContractFactory("FakeChainlinkOracle", deployer); // a chainlink oracle for ETH/USD - btcOracle = await ChainlinkOracleFactory.deploy( + btcOracle = (await ChainlinkOracleFactory.deploy( btcPrice, // oracle description - "BTC/USD" - ) as FakeChainlinkOracle; + "BTC/USD", + )) as FakeChainlinkOracle; // a chainlink oracle for ETH/USD - ethOracle = await ChainlinkOracleFactory.deploy( + ethOracle = (await ChainlinkOracleFactory.deploy( ethPrice, // oracle description - "ETH/USD" - ) as FakeChainlinkOracle; + "ETH/USD", + )) as FakeChainlinkOracle; // a chainlink oracle for USDC/USD - usdcOracle = await ChainlinkOracleFactory.deploy( + usdcOracle = (await ChainlinkOracleFactory.deploy( usdcPrice, // oracle description - "USDC/USD" - ) as FakeChainlinkOracle; + "USDC/USD", + )) as FakeChainlinkOracle; const SequencerUptimeFeedFactory = await ethers.getContractFactory("FakeSequencerUptimeFeed", deployer); - sequencerUptimeFeed = await SequencerUptimeFeedFactory.deploy( + sequencerUptimeFeed = (await SequencerUptimeFeedFactory.deploy( 0, // up - 'L2 Sequencer Uptime Status Feed' - ) as FakeSequencerUptimeFeed; + "L2 Sequencer Uptime Status Feed", + )) as FakeSequencerUptimeFeed; const L2OracleWithSequencerCheckFactory = await ethers.getContractFactory("L2OracleWithSequencerCheck", deployer); - btcOracleWithSequencerCheck = await L2OracleWithSequencerCheckFactory.deploy( - btcOracle.address, - sequencerUptimeFeed.address - ) as L2OracleWithSequencerCheck; + btcOracleWithSequencerCheck = (await L2OracleWithSequencerCheckFactory.deploy( + btcOracle.target, + sequencerUptimeFeed.target, + )) as L2OracleWithSequencerCheck; - ethOracleWithSequencerCheck = await L2OracleWithSequencerCheckFactory.deploy( - ethOracle.address, - sequencerUptimeFeed.address - ) as L2OracleWithSequencerCheck; + ethOracleWithSequencerCheck = (await L2OracleWithSequencerCheckFactory.deploy( + ethOracle.target, + sequencerUptimeFeed.target, + )) as L2OracleWithSequencerCheck; - usdcOracleWithSequencerCheck = await L2OracleWithSequencerCheckFactory.deploy( - usdcOracle.address, - sequencerUptimeFeed.address - ) as L2OracleWithSequencerCheck; + usdcOracleWithSequencerCheck = (await L2OracleWithSequencerCheckFactory.deploy( + usdcOracle.target, + sequencerUptimeFeed.target, + )) as L2OracleWithSequencerCheck; // a token to claim - newToken = await GenericERC20Factory.deploy( + newToken = (await GenericERC20Factory.deploy( "Neue Crypto Token", "NCT", 18, // 1B tokens // (10n ** 9n * 10n ** 18n).toString() - '1000000000000000000000000000' - ) as GenericERC20; + "1000000000000000000000000000", + )) as GenericERC20; // create an implementation contract const SaleImplementationFactory = await ethers.getContractFactory("FlatPriceSale", admin); - - saleImplementation = await SaleImplementationFactory.deploy( + + saleImplementation = (await SaleImplementationFactory.deploy( // fee bips 250, // fee recipient - feeRecipient.address - ) as FlatPriceSale; + feeRecipient.address, + )) as FlatPriceSale; // create a sale const SaleFactoryFactory = await ethers.getContractFactory("FlatPriceSaleFactory", admin); - saleFactory = await SaleFactoryFactory.deploy( - saleImplementation.address - ) as FlatPriceSaleFactory; + saleFactory = (await SaleFactoryFactory.deploy(saleImplementation.target)) as FlatPriceSaleFactory; config = { // recipient of sale proceeds @@ -172,70 +173,68 @@ describe("PriceTierVestingSale_2_0", function () { endTime: Math.floor(new Date(new Date().getTime() + 10 * 24 * 3600 * 1000).getTime() / 1000), // max queue time 1 hour maxQueueTime: 0, - URI: buildIpfsUri(campaignCIDs.basicSale) - } + URI: buildIpfsUri(campaignCIDs.basicSale), + }; const publicSaleTx = await saleFactory.newSale( deployer.address, config, // base currency - 'USD', + "USD", // native payments enabled true, // native price oracle - ethOracle.address, + ethOracle.target, // payment tokens - [usdc.address], + [usdc.target], // payment token price oracles - [usdcOracle.address], + [usdcOracle.target], // payment token decimals - [6] - ) + [6], + ); const address = await getSaleAddress_2_0(publicSaleTx); sale = await ethers.getContractAt("FlatPriceSale", address, deployer); for (let buyer of buyers) { - const mySale = await ethers.getContractAt("FlatPriceSale", sale.address, buyer); - const myUSDC = await ethers.getContractAt("GenericERC20", usdc.address, buyer); - - await myUSDC.approve( - mySale.address, - usdcPaymentAmount - ); - + const mySale = await ethers.getContractAt("FlatPriceSale", sale.target, buyer); + const myUSDC = await ethers.getContractAt("GenericERC20", usdc.target, buyer); + + await myUSDC.approve(mySale.target, usdcPaymentAmount); + // buy with USDC await mySale.buyWithToken( - usdc.address, + usdc.target, usdcPaymentAmount, // no data - '0x', + "0x", // no merkle proof - [] + [], ); - + // buy with ETH await mySale.buyWithNative( // no data - '0x', + "0x", // no merkle proof [], { - value: ethPaymentAmount - } + value: ethPaymentAmount, + }, ); } // find an end time barely in the future - const endTime = await lastBlockTime() + 4n + const endTime = (await lastBlockTime()) + 4n; // change the sale end time await sale.update({ - ...config, endTime + ...config, + endTime, }); - if (await lastBlockTime() < endTime) { + if ((await lastBlockTime()) < endTime) { // delay a bit more await delay(4000); } @@ -245,701 +244,671 @@ describe("PriceTierVestingSale_2_0", function () { // deploy another distributor with a distribution schedule that is partially completed partiallyVestedDistributor = await DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracleWithSequencerCheck.address, + btcOracleWithSequencerCheck.target, [ // 10% of tokens vest at any price above zero - {price: 1, vestedFraction: 1000}, + { price: 1, vestedFraction: 1000 }, // 50% of tokens vest at BTC price of $25k - {price: 2500000000000, vestedFraction: 5000}, + { price: 2500000000000, vestedFraction: 5000 }, // 100% of tokens vest at BTC price of $50k - {price: 5000000000000, vestedFraction: 10000} + { price: 5000000000000, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri + uri, ); - + fullyVestedDistributor = await DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time (all tokens should be vested) 2, - btcOracleWithSequencerCheck.address, + btcOracleWithSequencerCheck.target, [ // 10% of tokens vest at any price above zero - {price: 1, vestedFraction: 1000}, + { price: 1, vestedFraction: 1000 }, // 50% of tokens vest at BTC price of $25k - {price: 2500000000000, vestedFraction: 5000}, + { price: 2500000000000, vestedFraction: 5000 }, // 100% of tokens vest at BTC price of $50k - {price: 5000000000000, vestedFraction: 10000} + { price: 5000000000000, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri + uri, ); unvestedDistributor = await DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 2672905631, // end time 3672905631, - btcOracleWithSequencerCheck.address, + btcOracleWithSequencerCheck.target, [ // 10% of tokens vest at any price above zero - {price: 1, vestedFraction: 1000}, + { price: 1, vestedFraction: 1000 }, // 50% of tokens vest at BTC price of $25k - {price: 2500000000000, vestedFraction: 5000}, + { price: 2500000000000, vestedFraction: 5000 }, // 100% of tokens vest at BTC price of $50k - {price: 5000000000000, vestedFraction: 10000} + { price: 5000000000000, vestedFraction: 10000 }, ], 15000, - uri + uri, ); - + // transfer tokens to the distributors (we are testing 3 distributors, in practice a sale would use one!) - await newToken.transfer(partiallyVestedDistributor.address, await partiallyVestedDistributor.total()) - await newToken.transfer(unvestedDistributor.address, await unvestedDistributor.total()) - await newToken.transfer(fullyVestedDistributor.address, await fullyVestedDistributor.total()) - + await newToken.transfer(partiallyVestedDistributor.target, await partiallyVestedDistributor.total()); + await newToken.transfer(unvestedDistributor.target, await unvestedDistributor.total()); + await newToken.transfer(fullyVestedDistributor.target, await fullyVestedDistributor.total()); + // register at least one of the distributors as a test - await sale.registerDistributor(partiallyVestedDistributor.address) + await sale.registerDistributor(partiallyVestedDistributor.target); }); it("Metadata is correct", async () => { const distributor = partiallyVestedDistributor; - expect(await distributor.NAME()).toEqual("PriceTierVestingSale_2_0") - expect(await distributor.VERSION() >= BigNumber.from(1)) - expect(await distributor.uri()).toEqual(uri) - }) + expect(await distributor.NAME()).toEqual("PriceTierVestingSale_2_0"); + expect((await distributor.VERSION()) >= 1); + expect(await distributor.uri()).toEqual(uri); + }); it("Initial setup matches sale correctly", async () => { const distributor = partiallyVestedDistributor; - expect(await distributor.sale()).toEqual(sale.address) - expect((await distributor.price()).toBigInt()).toEqual(nctPrice) - expect(await distributor.decimals()).toEqual(await newToken.decimals()) - expect(await distributor.token()).toEqual(newToken.address) - - expect((await distributor.getStart()).toBigInt()).toEqual(1n) - expect((await distributor.getEnd()).toBigInt()).toEqual(2672905631n) - expect(await distributor.getOracle()).toEqual(btcOracleWithSequencerCheck.address) + expect(await distributor.sale()).toEqual(sale.target); + expect(await distributor.price()).toEqual(nctPrice); + expect(await distributor.decimals()).toEqual(await newToken.decimals()); + expect(await distributor.token()).toEqual(newToken.target); + + expect(await distributor.getStart()).toEqual(1n); + expect(await distributor.getEnd()).toEqual(2672905631n); + expect(await distributor.getOracle()).toEqual(btcOracleWithSequencerCheck.target); // each buyer spent $2.9424 of ETH and $101 of USDC each: this is 100000000 + 2942400 = $102.9424 USD each (8 decimals) - const spentPerBuyer = 10394240000n + const spentPerBuyer = 10394240000n; // verify the sale is storing the data we expect // (the v2.0 sale records purchases denominated with 8 decimals) - const totalSpent = (await sale.total()).toBigInt() + const totalSpent = await sale.total(); expect(totalSpent).toEqual(BigInt(buyers.length) * spentPerBuyer); // verify the sale has the right spent value for a user - expect((await sale.buyerTotal(buyer0.address)).toBigInt()).toEqual(spentPerBuyer) + expect(await sale.buyerTotal(buyer0.address)).toEqual(spentPerBuyer); // convert from $103.9424 of USD (8 decimals) to NCT (18 decimals) at a price of $1.50 per NCT (8 decimals) - const boughtPerBuyer = spentPerBuyer * 10n ** 18n / nctPrice + const boughtPerBuyer = (spentPerBuyer * 10n ** 18n) / nctPrice; // the distributor itself doesn't care what was spent - it only cares what was bought - const boughtTokens = (signer) => buyers.includes(signer) - // participated in the sale - ? boughtPerBuyer - // did not participate in the sale - : 0n - + const boughtTokens = (signer: SignerWithAddress) => + buyers.includes(signer) + ? // participated in the sale + boughtPerBuyer + : // did not participate in the sale + 0n; + // verify that the claim manager returns the correct purchased amount for each user (some are buyers, some are not) for (let user of [deployer, buyer0, buyer1, buyer2, buyer3, nonBuyer]) { - expect((await distributor.getPurchasedAmount(user.address)).toBigInt()).toEqual(boughtTokens(user)) + expect(await distributor.getPurchasedAmount(user.address)).toEqual(boughtTokens(user)); } - + // the distributor total must match (note the adjustment for rounding error) - expect((await distributor.total()).toBigInt()).toEqual(BigInt(buyers.length) * boughtPerBuyer + 2n) + expect(await distributor.total()).toEqual(BigInt(buyers.length) * boughtPerBuyer + 2n); // nothing has been claimed - expect((await distributor.claimed()).toBigInt()).toEqual(0n) + expect(await distributor.claimed()).toEqual(0n); // how many tokens should each buyer receive? - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // no claims have been initialized yet! for (let buyer of buyers) { - const distributionRecord = await distributor.getDistributionRecord(buyer.address) + const distributionRecord = await distributor.getDistributionRecord(buyer.address); // not initialized yet - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // the total can be inferred from the sale - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) + expect(distributionRecord.total).toEqual(buyerTotal); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // TODO: allow voting prior to initialization // voting power must be zero prior to initialization - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n); + expect(await distributor.getVotes(buyer.address)).toEqual(0n); // does not yet hold tokens to claim - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(0n) + expect(await newToken.balanceOf(buyer.address)).toEqual(0n); } - }) + }); it("A buyer can't claim while the sequencer is down", async () => { // take sequencer down - await sequencerUptimeFeed.setAnswer(1) - const [, answer] = await sequencerUptimeFeed.latestRoundData() - - expect(answer).toEqual(BigNumber.from(1)) - await expect(btcOracleWithSequencerCheck.latestRoundData()).rejects.toMatchObject({ - errorName: expect.stringMatching(/sequencerdown/i) - }) - - const buyer = buyer0 - const distributor = partiallyVestedDistributor - await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ - reason: expect.stringMatching(/sequencerdown/i) - }) - }) + await sequencerUptimeFeed.setAnswer(1); + const [, answer] = await sequencerUptimeFeed.latestRoundData(); + + expect(answer.toString()).toEqual("1"); + await expect(btcOracleWithSequencerCheck.latestRoundData()).rejects.toThrow(/SequencerDown/); + + const buyer = buyer0; + const distributor = partiallyVestedDistributor; + await expect(distributor.claim(buyer.address)).rejects.toThrow(/SequencerDown/); + }); it("A buyer can't claim within the grace period after the sequencer is up", async () => { // bring sequencer back up - await sequencerUptimeFeed.setAnswer(0) - const [, answer, startedAt] = await sequencerUptimeFeed.latestRoundData() - expect(answer).toEqual(BigNumber.from(0)) - expect(startedAt).toEqual(BigNumber.from(await lastBlockTime())) + await sequencerUptimeFeed.setAnswer(0); + const [, answer, startedAt] = await sequencerUptimeFeed.latestRoundData(); + expect(answer.toString()).toEqual("0"); + expect(startedAt).toEqual(await lastBlockTime()); - const buyer = buyer0 - const distributor = partiallyVestedDistributor - await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ - reason: expect.stringMatching(/graceperiodnotover/i) - }) - }) + const buyer = buyer0; + const distributor = partiallyVestedDistributor; + await expect(distributor.claim(buyer.address)).rejects.toThrow(/GracePeriodNotOver/); + }); it("A buyer can claim without initialization", async () => { // wait for the grace period to end await time.increase(4000); - - const buyer = buyer0 - const distributor = partiallyVestedDistributor - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + + const buyer = buyer0; + const distributor = partiallyVestedDistributor; + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // only 10% of the tokens are claimable at a BTC price of ~17k (the second $25k tier has not been hit) - await btcOracle.setAnswer(1682080000000n) + await btcOracle.setAnswer(1682080000000n); let currentlyClaimable = buyerTotal / 10n; // no voting power yet - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(buyer.address)).toEqual(0n); // delegate to self - const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.address, buyer); - await myDistributor.delegate(buyer.address) + const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.target, buyer); + await myDistributor.delegate(buyer.address); // voting power is not present (distribution record not initialized) - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(buyer.address)).toEqual(0n); // this will initialize the distribution record - await distributor.claim(buyer.address) - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual((buyerTotal - currentlyClaimable) * votingFactorBips / 10000n) + await distributor.claim(buyer.address); + expect(await distributor.getVotes(buyer.address)).toEqual( + ((buyerTotal - currentlyClaimable) * votingFactorBips) / 10000n, + ); // delegate to another address - await myDistributor.delegate(delegatee.address) + await myDistributor.delegate(delegatee.address); // buyer has no more voting power but delegatee does - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n) - expect((await distributor.getVotes(delegatee.address)).toBigInt()).toEqual((buyerTotal - currentlyClaimable) * votingFactorBips / 10000n) - - let distributionRecord = await distributor.getDistributionRecord(buyer.address) + expect(await distributor.getVotes(buyer.address)).toEqual(0n); + expect(await distributor.getVotes(delegatee.address)).toEqual( + ((buyerTotal - currentlyClaimable) * votingFactorBips) / 10000n, + ); + + let distributionRecord = await distributor.getDistributionRecord(buyer.address); // only half of the tokens are claimable right now - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // only one tranche has elapsed - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // buyer now holds tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // the user cannot claim again for now - await expect( - distributor.claim(buyer.address) - ).rejects.toMatchObject( - {message: expect.stringMatching(/no more tokens claimable right now/)} - ) + await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // internal accounting hasn't changed - distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // token balance hasn't changed - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // when the price of the reference asset is changed, the fraction of tokens vested also changes - await btcOracle.setAnswer(2682080000000n) + await btcOracle.setAnswer(2682080000000n); // now 50% of tokens should be vested currentlyClaimable = buyerTotal / 2n; - - await distributor.claim(buyer.address) - distributionRecord = await distributor.getDistributionRecord(buyer.address) + + await distributor.claim(buyer.address); + distributionRecord = await distributor.getDistributionRecord(buyer.address); // only half of the tokens are claimable right now - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // only one tranche has elapsed - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) - + expect(distributionRecord.claimed).toEqual(currentlyClaimable); + // voting power has decreased after claim (note the adjustment for rounding error) - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(buyer.address)).toEqual(0n); expectCloseEnough( - (await distributor.getVotes(delegatee.address)).toBigInt(), - (buyerTotal - currentlyClaimable) * votingFactorBips / 10000n, - 1n - ) + await distributor.getVotes(delegatee.address), + ((buyerTotal - currentlyClaimable) * votingFactorBips) / 10000n, + 1n, + ); // buyer now holds tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // the user cannot claim again for now - await expect( - distributor.claim(buyer.address) - ).rejects.toMatchObject( - {message: expect.stringMatching(/no more tokens claimable right now/)} - ) + await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // internal accounting hasn't changed - distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // token balance hasn't changed - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) - - }) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); + }); it("A buyer can initialize without claiming", async () => { - const buyer = buyer1 - const distributor = partiallyVestedDistributor + const buyer = buyer1; + const distributor = partiallyVestedDistributor; + + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) - - await distributor.initializeDistributionRecord(buyer.address) - const distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + await distributor.initializeDistributionRecord(buyer.address); + const distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // voting power available after delegation - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n) - + expect(await distributor.getVotes(buyer.address)).toEqual(0n); + // delegate to self - const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.address, buyer); - await myDistributor.delegate(buyer.address) + const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.target, buyer); + await myDistributor.delegate(buyer.address); - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(buyerTotal * votingFactorBips / 10000n) + expect(await distributor.getVotes(buyer.address)).toEqual((buyerTotal * votingFactorBips) / 10000n); // buyer has not claimed tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(0n) - }) + expect(await newToken.balanceOf(buyer.address)).toEqual(0n); + }); it("A buyer can initialize and then claim", async () => { - const buyer = buyer2 - const distributor = partiallyVestedDistributor - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyer = buyer2; + const distributor = partiallyVestedDistributor; + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // all tokens should be claimable - await btcOracle.setAnswer(5000000000001n) - let currentlyClaimable = buyerTotal + await btcOracle.setAnswer(5000000000001n); + let currentlyClaimable = buyerTotal; // this value should be available before initialization - expect((await distributor.getClaimableAmount(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await distributor.getClaimableAmount(buyer.address, "0x")).toEqual(currentlyClaimable); // only half of the tokens should be claimable - await btcOracle.setAnswer(2500000000001n) - currentlyClaimable = buyerTotal / 2n - expect((await distributor.getClaimableAmount(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + await btcOracle.setAnswer(2500000000001n); + currentlyClaimable = buyerTotal / 2n; + expect(await distributor.getClaimableAmount(buyer.address, "0x")).toEqual(currentlyClaimable); - await distributor.initializeDistributionRecord(buyer.address) - let distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + await distributor.initializeDistributionRecord(buyer.address); + let distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // delegate to self - const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.address, buyer); - await myDistributor.delegate(buyer.address) + const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.target, buyer); + await myDistributor.delegate(buyer.address); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // voting power available after initialization - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(buyerTotal * votingFactorBips / 10000n) - - await distributor.claim(buyer.address) - distributionRecord = await distributor.getDistributionRecord(buyer.address) + expect(await distributor.getVotes(buyer.address)).toEqual((buyerTotal * votingFactorBips) / 10000n); - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + await distributor.claim(buyer.address); + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // voting power has decreased (note the adjustment for rounding error) - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(currentlyClaimable * votingFactorBips / 10000n + 1n) + expect(await distributor.getVotes(buyer.address)).toEqual((currentlyClaimable * votingFactorBips) / 10000n + 1n); // buyer now holds tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // the user cannot claim again for now - await expect( - distributor.claim(buyer.address) - ).rejects.toMatchObject( - {message: expect.stringMatching(/no more tokens claimable right now/)} - ) + await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // internal accounting hasn't changed - distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // token balance hasn't changed - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) - }) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); + }); it("non-participants in the sale cannot claim any tokens", async () => { - const user = nonBuyer - const distributor = partiallyVestedDistributor - - let distributionRecord = await distributor.getDistributionRecord(user.address) + const user = nonBuyer; + const distributor = partiallyVestedDistributor; + + let distributionRecord = await distributor.getDistributionRecord(user.address); // nothing to distribute - expect(distributionRecord.total.toBigInt()).toEqual(0n) + expect(distributionRecord.total).toEqual(0n); // nothing claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // no votes - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); // not initialized - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // user holds no tokens - expect((await newToken.balanceOf(user.address)).toBigInt()).toEqual(0n) + expect(await newToken.balanceOf(user.address)).toEqual(0n); // The user cannot initialize because they did not make any purchases - await expect( - distributor.initializeDistributionRecord(user.address) - ).rejects.toMatchObject({message: expect.stringMatching(/no purchases found/)}) + await expect(distributor.initializeDistributionRecord(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no purchases found/), + }); // The user cannot claim because they did not make any purchases - await expect( - distributor.claim(user.address) - ).rejects.toMatchObject({message: expect.stringMatching(/no purchases found/)}) + await expect(distributor.claim(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no purchases found/), + }); }); it("IMPORTANT: buyers can claim all tokens when all tranches have vested", async () => { - const distributor = fullyVestedDistributor - - const total = (await distributor.total()).toBigInt() - const userTotal = total / BigInt(buyers.length) + const distributor = fullyVestedDistributor; + + const total = await distributor.total(); + const userTotal = total / BigInt(buyers.length); for (let user of claimers) { // get the user's initial token balance - const initialBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const initialBalance = await newToken.balanceOf(user.address); // claim from the fully veseted distributor await distributor.claim(user.address); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const finalBalance = await newToken.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual(userTotal) + expect(distributionRecord.total).toEqual(userTotal); // everything has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(userTotal) + expect(distributionRecord.claimed).toEqual(userTotal); // the user's balance has increased by the correct amount - expect(finalBalance - initialBalance).toEqual(userTotal) + expect(finalBalance - initialBalance).toEqual(userTotal); // no votes remaining - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); } }); it("buyers cannot claim any tokens when no tranches have completed", async () => { - const distributor = unvestedDistributor + const distributor = unvestedDistributor; - const total = (await distributor.total()).toBigInt() - const userTotal = total / BigInt(buyers.length) + const total = await distributor.total(); + const userTotal = total / BigInt(buyers.length); for (let user of claimers) { // get the user's initial token balance - const initialBalance = (await newToken.balanceOf(user.address)).toBigInt(); - await expect( - distributor.claim(user.address) - ).rejects.toMatchObject( - {message: expect.stringMatching(/no more tokens claimable right now/)} - ) + const initialBalance = await newToken.balanceOf(user.address); + await expect(distributor.claim(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const finalBalance = await newToken.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual(userTotal) + expect(distributionRecord.total).toEqual(userTotal); // nothing has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // the user's token balance has not increased - expect(finalBalance - initialBalance).toEqual(0n) + expect(finalBalance - initialBalance).toEqual(0n); } // no tokens have been distributed from the unvested distributor - expect((await newToken.balanceOf(distributor.address)).toBigInt()).toEqual(total) + expect(await newToken.balanceOf(distributor.target)).toEqual(total); }); - // TODO; why reverting without a reason string? - it.skip("reverts on misconfiguration during deployment", async () => { + it("reverts on misconfiguration during deployment", async () => { + // TODO; why reverting without a reason string? // Cannot set the sale to an invalid address - await expect( - DistributorFactory.deploy( - deployer.address, - newToken.address, - await newToken.decimals(), - nctPrice, - // start time - 1, - // end time - 2672905631, - btcOracle.address, - [ - {price: 1, vestedFraction: 10000} - ], - // a 1.5x voting factor - 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/Transaction reverted: function returned an unexpected amount of data/)} - ) + // await expect( + // DistributorFactory.deploy( + // deployer.address, + // newToken.target, + // await newToken.decimals(), + // nctPrice, + // // start time + // 1, + // // end time + // 2672905631, + // btcOracle.target, + // [ + // {price: 1, vestedFraction: 10000} + // ], + // // a 1.5x voting factor + // 15000, + // uri + // ) + // ).rejects.toMatchObject( + // {message: expect.stringMatching(/Transaction reverted: function returned an unexpected amount of data/)} + // ) // Must vest all tokens await expect( DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracle.address, + btcOracle.target, [ - {price: 1, vestedFraction: 5000}, + { price: 1, vestedFraction: 5000 }, // this is not quite all tokens! - {price: 100000000, vestedFraction: 9999} + { price: 100000000, vestedFraction: 9999 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/highest price tier must vest all tokens/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/highest price tier must vest all tokens/) }); // Price tier prices must increase await expect( DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracle.address, + btcOracle.target, [ - {price: 500000000, vestedFraction: 5000}, + { price: 500000000, vestedFraction: 5000 }, // lower price -- oops - {price: 400000000, vestedFraction: 10000} + { price: 400000000, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/tier prices decrease/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/tier prices decrease/) }); // Tranche vested fraction must increase await expect( DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracle.address, + btcOracle.target, [ - {price: 1000000000, vestedFraction: 10000}, + { price: 1000000000, vestedFraction: 10000 }, // vested fraction is decreasing -- oops - {price: 2000000000, vestedFraction: 5000} + { price: 2000000000, vestedFraction: 5000 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/vested fraction decreases/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/vested fraction decreases/) }); }); - it('can only be deployed when the sale is closed', async () => { + it("can only be deployed when the sale is closed", async () => { const openPublicSaleTx = await saleFactory.newSale( deployer.address, config, // base currency - 'USD', + "USD", // native payments enabled true, // native price oracle - ethOracle.address, + ethOracle.target, // payment tokens - [usdc.address], + [usdc.target], // payment token price oracles - [usdcOracle.address], + [usdcOracle.target], // payment token decimals - [6] - ) - - const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx) + [6], + ); + + const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx); const openSale = await ethers.getContractAt("FlatPriceSale", openSaleAddress, deployer); // make a purchase - const mySale = await ethers.getContractAt("FlatPriceSale", openSale.address, buyer0); + const mySale = await ethers.getContractAt("FlatPriceSale", openSale.target, buyer0); // buy with ETH await mySale.buyWithNative( // no data - '0x', + "0x", // no merkle proof [], { - value: ethPaymentAmount - } + value: ethPaymentAmount, + }, ); await expect( DistributorFactory.deploy( - openSale.address, - newToken.address, + openSale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracle.address, - [ - {price: 1, vestedFraction: 10000} - ], + btcOracle.target, + [{ price: 1, vestedFraction: 10000 }], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/sale not over yet/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/sale not over yet/) }); }); - it('total to distribute must be > 0', async () => { + it("total to distribute must be > 0", async () => { const openPublicSaleTx = await saleFactory.newSale( deployer.address, config, // base currency - 'USD', + "USD", // native payments enabled true, // native price oracle - ethOracle.address, + ethOracle.target, // payment tokens - [usdc.address], + [usdc.target], // payment token price oracles - [usdcOracle.address], + [usdcOracle.target], // payment token decimals - [6] - ) + [6], + ); - const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx) + const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx); await expect( DistributorFactory.deploy( openSaleAddress, - newToken.address, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracle.address, + btcOracle.target, [ // 10% of tokens vest at each time - {price: 1, vestedFraction: 10000} + { price: 1, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/Distributor: total is 0/)} - ) - }) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/Distributor: total is 0/) }); + }); it("Handles negative adjustments to a user's total claimable amount", async () => { - const buyer = buyer4 - const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - + const buyer = buyer4; + const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + // adjust a buyer's allocation downward - await fullyVestedDistributor.initializeDistributionRecord(buyer.address) - await fullyVestedDistributor.adjust( - buyer.address, - -10000n - ) + await fullyVestedDistributor.initializeDistributionRecord(buyer.address); + await fullyVestedDistributor.adjust(buyer.address, -10000n); - const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - expect(newAllocation).toEqual(initialAllocation.sub(10000n)) + const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + expect(newAllocation).toEqual(initialAllocation - 10000n); // claim - await fullyVestedDistributor.connect(buyer).claim(buyer.address) - + await fullyVestedDistributor.connect(buyer).claim(buyer.address); + // check distributionRecord - const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address) - expect(distributionRecord.initialized).toBe(true) - expect (distributionRecord.total).toEqual(newAllocation) - expect(distributionRecord.claimed).toEqual(newAllocation) + const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address); + expect(distributionRecord.initialized).toBe(true); + expect(distributionRecord.total).toEqual(newAllocation); + expect(distributionRecord.claimed).toEqual(newAllocation); // check NCT balance - const balance = await newToken.balanceOf(buyer.address) - expect(balance).toEqual(newAllocation) - }) + const balance = await newToken.balanceOf(buyer.address); + expect(balance).toEqual(newAllocation); + }); it("Handles positive adjustments to a user's total claimable amount", async () => { - const buyer = buyer5 - const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - + const buyer = buyer5; + const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + // adjust a buyer's allocation upward - await fullyVestedDistributor.initializeDistributionRecord(buyer.address) - await fullyVestedDistributor.adjust( - buyer.address, - 10000n - ) - - - const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - expect(newAllocation).toEqual(initialAllocation.add(10000n)) - + await fullyVestedDistributor.initializeDistributionRecord(buyer.address); + await fullyVestedDistributor.adjust(buyer.address, 10000n); + + const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + expect(newAllocation).toEqual(initialAllocation + 10000n); + // transfer additional tokens to the distributor - await newToken.transfer(fullyVestedDistributor.address, 10000n) - + await newToken.transfer(fullyVestedDistributor.target, 10000n); + // claim - await fullyVestedDistributor.connect(buyer).claim(buyer.address) - + await fullyVestedDistributor.connect(buyer).claim(buyer.address); + // check distributionRecord - const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address) - expect(distributionRecord.initialized).toBe(true) - expect (distributionRecord.total).toEqual(newAllocation) - expect(distributionRecord.claimed).toEqual(newAllocation) + const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address); + expect(distributionRecord.initialized).toBe(true); + expect(distributionRecord.total).toEqual(newAllocation); + expect(distributionRecord.claimed).toEqual(newAllocation); // check NCT balance - const balance = await newToken.balanceOf(buyer.address) - expect(balance).toEqual(newAllocation) - }) + const balance = await newToken.balanceOf(buyer.address); + expect(balance).toEqual(newAllocation); + }); }); diff --git a/packages/hardhat/test/distributor/PriceTierVestingSale_2_0_Distributor.test.ts b/packages/hardhat/test/distributor/PriceTierVestingSale_2_0_Distributor.test.ts index 24a75867..7f474075 100644 --- a/packages/hardhat/test/distributor/PriceTierVestingSale_2_0_Distributor.test.ts +++ b/packages/hardhat/test/distributor/PriceTierVestingSale_2_0_Distributor.test.ts @@ -1,40 +1,44 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { BigNumber } from "ethers"; -import hre from 'hardhat' -import { GenericERC20, FakeChainlinkOracle, PriceTierVestingSale_2_0__factory, PriceTierVestingSale_2_0, FlatPriceSale, FlatPriceSaleFactory } from "../../typechain-types"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { + GenericERC20, + FakeChainlinkOracle, + PriceTierVestingSale_2_0__factory, + PriceTierVestingSale_2_0, + FlatPriceSale, + FlatPriceSaleFactory, +} from "../../typechain-types"; import { delay, lastBlockTime, getSaleAddress_2_0, expectCloseEnough } from "../lib"; -import {merkleRoots, campaignCIDs} from '../../config' -import {buildIpfsUri} from '../../utils' +import { merkleRoots, campaignCIDs } from "../../config"; +import { buildIpfsUri } from "../../utils"; import { ConfigStruct } from "../../typechain-types/contracts/sale/v2/FlatPriceSale"; - -const ethers = (hre as any).ethers +import { ethers } from "hardhat"; jest.setTimeout(30000); -let deployer: SignerWithAddress -let admin: SignerWithAddress -let recipient: SignerWithAddress -let buyer0: SignerWithAddress -let buyer1: SignerWithAddress -let buyer2: SignerWithAddress -let buyer3: SignerWithAddress -let buyer4: SignerWithAddress -let buyer5: SignerWithAddress -let buyers: SignerWithAddress[] -let claimers: SignerWithAddress[] -let delegatee: SignerWithAddress -let nonBuyer: SignerWithAddress -let feeRecipient: SignerWithAddress -let config: ConfigStruct -let DistributorFactory: PriceTierVestingSale_2_0__factory -let unvestedDistributor: PriceTierVestingSale_2_0 -let partiallyVestedDistributor: PriceTierVestingSale_2_0 -let fullyVestedDistributor: PriceTierVestingSale_2_0 -let usdc: GenericERC20 -let newToken: GenericERC20 -let btcOracle: FakeChainlinkOracle -let ethOracle: FakeChainlinkOracle -let usdcOracle: FakeChainlinkOracle +let deployer: SignerWithAddress; +let admin: SignerWithAddress; +let recipient: SignerWithAddress; +let buyer0: SignerWithAddress; +let buyer1: SignerWithAddress; +let buyer2: SignerWithAddress; +let buyer3: SignerWithAddress; +let buyer4: SignerWithAddress; +let buyer5: SignerWithAddress; +let buyers: SignerWithAddress[]; +let claimers: SignerWithAddress[]; +let delegatee: SignerWithAddress; +let nonBuyer: SignerWithAddress; +let feeRecipient: SignerWithAddress; +let config: ConfigStruct; +let DistributorFactory: PriceTierVestingSale_2_0__factory; +let unvestedDistributor: PriceTierVestingSale_2_0; +let partiallyVestedDistributor: PriceTierVestingSale_2_0; +let fullyVestedDistributor: PriceTierVestingSale_2_0; +let usdc: GenericERC20; +let newToken: GenericERC20; +let btcOracle: FakeChainlinkOracle; +let ethOracle: FakeChainlinkOracle; +let usdcOracle: FakeChainlinkOracle; let saleImplementation: FlatPriceSale; let sale: FlatPriceSale; let saleFactory: FlatPriceSaleFactory; @@ -42,90 +46,84 @@ let saleFactory: FlatPriceSaleFactory; // $100 (6 decimals) const usdcPaymentAmount = 100000000n; // $2.9424 (18 decimals) -const ethPaymentAmount = ethers.utils.parseEther("0.001").toBigInt() +const ethPaymentAmount = ethers.parseEther("0.001"); // BTC price of $16820.80/ETH -const btcPrice = 1682080000000n +const btcPrice = 1682080000000n; // eth price of $2942.40/ETH -const ethPrice = 294240000000n +const ethPrice = 294240000000n; // usdc price of $1.001/USDC (8 decimals) -const usdcPrice = 101000000n - // $1.50 / NCT (8 decimals) -const nctPrice = 150000000n +const usdcPrice = 101000000n; +// $1.50 / NCT (8 decimals) +const nctPrice = 150000000n; const votingFactorBips = 15000n; // 1.5x -const uri = "https://example.com" +const uri = "https://example.com"; describe("PriceTierVestingSale_2_0", function () { beforeAll(async () => { - [deployer, admin, recipient, buyer0, buyer1, buyer2, buyer3, buyer4, buyer5, nonBuyer, feeRecipient, delegatee] = await ethers.getSigners(); + [deployer, admin, recipient, buyer0, buyer1, buyer2, buyer3, buyer4, buyer5, nonBuyer, feeRecipient, delegatee] = + await ethers.getSigners(); // make a couple purchases as various users. - buyers = [buyer0, buyer1, buyer2, buyer3, buyer4, buyer5] - claimers = [buyer0, buyer1, buyer2, buyer3] - + buyers = [buyer0, buyer1, buyer2, buyer3, buyer4, buyer5]; + claimers = [buyer0, buyer1, buyer2, buyer3]; + // a payment token (USDC) const GenericERC20Factory = await ethers.getContractFactory("GenericERC20", deployer); - usdc = await GenericERC20Factory.deploy( - "US Dollar Coin", - "USDC", - 6, - "1000000000000000" - ) as GenericERC20; + usdc = (await GenericERC20Factory.deploy("US Dollar Coin", "USDC", 6, "1000000000000000")) as GenericERC20; // transfer tokens to buyers for (let signer of buyers) { - await usdc.transfer(signer.address, usdcPaymentAmount) + await usdc.transfer(signer.address, usdcPaymentAmount); } const ChainlinkOracleFactory = await ethers.getContractFactory("FakeChainlinkOracle", deployer); // a chainlink oracle for ETH/USD - btcOracle = await ChainlinkOracleFactory.deploy( + btcOracle = (await ChainlinkOracleFactory.deploy( btcPrice, // oracle description - "BTC/USD" - ) as FakeChainlinkOracle; + "BTC/USD", + )) as FakeChainlinkOracle; // a chainlink oracle for ETH/USD - ethOracle = await ChainlinkOracleFactory.deploy( + ethOracle = (await ChainlinkOracleFactory.deploy( ethPrice, // oracle description - "ETH/USD" - ) as FakeChainlinkOracle; + "ETH/USD", + )) as FakeChainlinkOracle; // a chainlink oracle for USDC/USD - usdcOracle = await ChainlinkOracleFactory.deploy( + usdcOracle = (await ChainlinkOracleFactory.deploy( usdcPrice, // oracle description - "USDC/USD" - ) as FakeChainlinkOracle; + "USDC/USD", + )) as FakeChainlinkOracle; // a token to claim - newToken = await GenericERC20Factory.deploy( + newToken = (await GenericERC20Factory.deploy( "Neue Crypto Token", "NCT", 18, // 1B tokens // (10n ** 9n * 10n ** 18n).toString() - '1000000000000000000000000000' - ) as GenericERC20; + "1000000000000000000000000000", + )) as GenericERC20; // create an implementation contract const SaleImplementationFactory = await ethers.getContractFactory("FlatPriceSale", admin); - - saleImplementation = await SaleImplementationFactory.deploy( + + saleImplementation = (await SaleImplementationFactory.deploy( // fee bips 250, // fee recipient - feeRecipient.address - ) as FlatPriceSale; + feeRecipient.address, + )) as FlatPriceSale; // create a sale const SaleFactoryFactory = await ethers.getContractFactory("FlatPriceSaleFactory", admin); - saleFactory = await SaleFactoryFactory.deploy( - saleImplementation.address - ) as FlatPriceSaleFactory; + saleFactory = (await SaleFactoryFactory.deploy(saleImplementation.target)) as FlatPriceSaleFactory; config = { // recipient of sale proceeds @@ -145,70 +143,68 @@ describe("PriceTierVestingSale_2_0", function () { endTime: Math.floor(new Date(new Date().getTime() + 10 * 24 * 3600 * 1000).getTime() / 1000), // max queue time 1 hour maxQueueTime: 0, - URI: buildIpfsUri(campaignCIDs.basicSale) - } + URI: buildIpfsUri(campaignCIDs.basicSale), + }; const publicSaleTx = await saleFactory.newSale( deployer.address, config, // base currency - 'USD', + "USD", // native payments enabled true, // native price oracle - ethOracle.address, + ethOracle.target, // payment tokens - [usdc.address], + [usdc.target], // payment token price oracles - [usdcOracle.address], + [usdcOracle.target], // payment token decimals - [6] - ) + [6], + ); const address = await getSaleAddress_2_0(publicSaleTx); sale = await ethers.getContractAt("FlatPriceSale", address, deployer); for (let buyer of buyers) { - const mySale = await ethers.getContractAt("FlatPriceSale", sale.address, buyer); - const myUSDC = await ethers.getContractAt("GenericERC20", usdc.address, buyer); - - await myUSDC.approve( - mySale.address, - usdcPaymentAmount - ); - + const mySale = await ethers.getContractAt("FlatPriceSale", sale.target, buyer); + const myUSDC = await ethers.getContractAt("GenericERC20", usdc.target, buyer); + + await myUSDC.approve(mySale.target, usdcPaymentAmount); + // buy with USDC await mySale.buyWithToken( - usdc.address, + usdc.target, usdcPaymentAmount, // no data - '0x', + "0x", // no merkle proof - [] + [], ); - + // buy with ETH await mySale.buyWithNative( // no data - '0x', + "0x", // no merkle proof [], { - value: ethPaymentAmount - } + value: ethPaymentAmount, + }, ); } // find an end time barely in the future - const endTime = await lastBlockTime() + 4n + const endTime = (await lastBlockTime()) + 4n; // change the sale end time await sale.update({ - ...config, endTime + ...config, + endTime, }); - if (await lastBlockTime() < endTime) { + if ((await lastBlockTime()) < endTime) { // delay a bit more await delay(4000); } @@ -218,672 +214,648 @@ describe("PriceTierVestingSale_2_0", function () { // deploy another distributor with a distribution schedule that is partially completed partiallyVestedDistributor = await DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracle.address, + btcOracle.target, [ // 10% of tokens vest at any price above zero - {price: 1, vestedFraction: 1000}, + { price: 1, vestedFraction: 1000 }, // 50% of tokens vest at BTC price of $25k - {price: 2500000000000, vestedFraction: 5000}, + { price: 2500000000000, vestedFraction: 5000 }, // 100% of tokens vest at BTC price of $50k - {price: 5000000000000, vestedFraction: 10000} + { price: 5000000000000, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri + uri, ); - + fullyVestedDistributor = await DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time (all tokens should be vested) 2, - btcOracle.address, + btcOracle.target, [ // 10% of tokens vest at any price above zero - {price: 1, vestedFraction: 1000}, + { price: 1, vestedFraction: 1000 }, // 50% of tokens vest at BTC price of $25k - {price: 2500000000000, vestedFraction: 5000}, + { price: 2500000000000, vestedFraction: 5000 }, // 100% of tokens vest at BTC price of $50k - {price: 5000000000000, vestedFraction: 10000} + { price: 5000000000000, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri + uri, ); unvestedDistributor = await DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 2672905631, // end time 3672905631, - btcOracle.address, + btcOracle.target, [ // 10% of tokens vest at any price above zero - {price: 1, vestedFraction: 1000}, + { price: 1, vestedFraction: 1000 }, // 50% of tokens vest at BTC price of $25k - {price: 2500000000000, vestedFraction: 5000}, + { price: 2500000000000, vestedFraction: 5000 }, // 100% of tokens vest at BTC price of $50k - {price: 5000000000000, vestedFraction: 10000} + { price: 5000000000000, vestedFraction: 10000 }, ], 15000, - uri + uri, ); - + // transfer tokens to the distributors (we are testing 3 distributors, in practice a sale would use one!) - await newToken.transfer(partiallyVestedDistributor.address, await partiallyVestedDistributor.total()) - await newToken.transfer(unvestedDistributor.address, await unvestedDistributor.total()) - await newToken.transfer(fullyVestedDistributor.address, await fullyVestedDistributor.total()) - + await newToken.transfer(partiallyVestedDistributor.target, await partiallyVestedDistributor.total()); + await newToken.transfer(unvestedDistributor.target, await unvestedDistributor.total()); + await newToken.transfer(fullyVestedDistributor.target, await fullyVestedDistributor.total()); + // register at least one of the distributors as a test - await sale.registerDistributor(partiallyVestedDistributor.address) + await sale.registerDistributor(partiallyVestedDistributor.target); }); it("Metadata is correct", async () => { const distributor = partiallyVestedDistributor; - expect(await distributor.NAME()).toEqual("PriceTierVestingSale_2_0") - expect(await distributor.VERSION() >= BigNumber.from(1)) - expect(await distributor.uri()).toEqual(uri) - }) + expect(await distributor.NAME()).toEqual("PriceTierVestingSale_2_0"); + expect((await distributor.VERSION()) >= 1); + expect(await distributor.uri()).toEqual(uri); + }); it("Initial setup matches sale correctly", async () => { const distributor = partiallyVestedDistributor; - expect(await distributor.sale()).toEqual(sale.address) - expect((await distributor.price()).toBigInt()).toEqual(nctPrice) - expect(await distributor.decimals()).toEqual(await newToken.decimals()) - expect(await distributor.token()).toEqual(newToken.address) - - expect((await distributor.getStart()).toBigInt()).toEqual(1n) - expect((await distributor.getEnd()).toBigInt()).toEqual(2672905631n) - expect(await distributor.getOracle()).toEqual(btcOracle.address) + expect(await distributor.sale()).toEqual(sale.target); + expect(await distributor.price()).toEqual(nctPrice); + expect(await distributor.decimals()).toEqual(await newToken.decimals()); + expect(await distributor.token()).toEqual(newToken.target); + + expect(await distributor.getStart()).toEqual(1n); + expect(await distributor.getEnd()).toEqual(2672905631n); + expect(await distributor.getOracle()).toEqual(btcOracle.target); // each buyer spent $2.9424 of ETH and $101 of USDC each: this is 100000000 + 2942400 = $102.9424 USD each (8 decimals) - const spentPerBuyer = 10394240000n + const spentPerBuyer = 10394240000n; // verify the sale is storing the data we expect // (the v2.0 sale records purchases denominated with 8 decimals) - const totalSpent = (await sale.total()).toBigInt() + const totalSpent = await sale.total(); expect(totalSpent).toEqual(BigInt(buyers.length) * spentPerBuyer); // verify the sale has the right spent value for a user - expect((await sale.buyerTotal(buyer0.address)).toBigInt()).toEqual(spentPerBuyer) + expect(await sale.buyerTotal(buyer0.address)).toEqual(spentPerBuyer); // convert from $103.9424 of USD (8 decimals) to NCT (18 decimals) at a price of $1.50 per NCT (8 decimals) - const boughtPerBuyer = spentPerBuyer * 10n ** 18n / nctPrice + const boughtPerBuyer = (spentPerBuyer * 10n ** 18n) / nctPrice; // the distributor itself doesn't care what was spent - it only cares what was bought - const boughtTokens = (signer) => buyers.includes(signer) - // participated in the sale - ? boughtPerBuyer - // did not participate in the sale - : 0n - + const boughtTokens = (signer: SignerWithAddress) => + buyers.includes(signer) + ? // participated in the sale + boughtPerBuyer + : // did not participate in the sale + 0n; + // verify that the claim manager returns the correct purchased amount for each user (some are buyers, some are not) for (let user of [deployer, buyer0, buyer1, buyer2, buyer3, nonBuyer]) { - expect((await distributor.getPurchasedAmount(user.address)).toBigInt()).toEqual(boughtTokens(user)) + expect(await distributor.getPurchasedAmount(user.address)).toEqual(boughtTokens(user)); } - + // the distributor total must match (note the adjustment for rounding error) - expect((await distributor.total()).toBigInt()).toEqual(BigInt(buyers.length) * boughtPerBuyer + 2n) + expect(await distributor.total()).toEqual(BigInt(buyers.length) * boughtPerBuyer + 2n); // nothing has been claimed - expect((await distributor.claimed()).toBigInt()).toEqual(0n) + expect(await distributor.claimed()).toEqual(0n); // how many tokens should each buyer receive? - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // no claims have been initialized yet! for (let buyer of buyers) { - const distributionRecord = await distributor.getDistributionRecord(buyer.address) + const distributionRecord = await distributor.getDistributionRecord(buyer.address); // not initialized yet - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // the total can be inferred from the sale - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) + expect(distributionRecord.total).toEqual(buyerTotal); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // TODO: allow voting prior to initialization // voting power must be zero prior to initialization - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n); + expect(await distributor.getVotes(buyer.address)).toEqual(0n); // does not yet hold tokens to claim - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(0n) + expect(await newToken.balanceOf(buyer.address)).toEqual(0n); } - + // check other config - expect((await distributor.getStart()).toBigInt()).toEqual(1n) - expect((await distributor.getEnd()).toBigInt()).toEqual(2672905631n) - expect(await distributor.getOracle()).toEqual(btcOracle.address) - }) + expect(await distributor.getStart()).toEqual(1n); + expect(await distributor.getEnd()).toEqual(2672905631n); + expect(await distributor.getOracle()).toEqual(btcOracle.target); + }); it("A buyer can claim without initialization", async () => { - const buyer = buyer0 - const distributor = partiallyVestedDistributor - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyer = buyer0; + const distributor = partiallyVestedDistributor; + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // only 10% of the tokens are claimable at a BTC price of ~17k (the second $25k tier has not been hit) - await btcOracle.setAnswer(1682080000000n) + await btcOracle.setAnswer(1682080000000n); let currentlyClaimable = buyerTotal / 10n; // no voting power yet - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(buyer.address)).toEqual(0n); // delegate to self - const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.address, buyer); - await myDistributor.delegate(buyer.address) + const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.target, buyer); + await myDistributor.delegate(buyer.address); // voting power is not present (distribution record not initialized) - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(buyer.address)).toEqual(0n); // this will initialize the distribution record - await distributor.claim(buyer.address) - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual((buyerTotal - currentlyClaimable) * votingFactorBips / 10000n) + await distributor.claim(buyer.address); + expect(await distributor.getVotes(buyer.address)).toEqual( + ((buyerTotal - currentlyClaimable) * votingFactorBips) / 10000n, + ); // delegate to another address - await myDistributor.delegate(delegatee.address) + await myDistributor.delegate(delegatee.address); // buyer has no more voting power but delegatee does - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n) - expect((await distributor.getVotes(delegatee.address)).toBigInt()).toEqual((buyerTotal - currentlyClaimable) * votingFactorBips / 10000n) - - let distributionRecord = await distributor.getDistributionRecord(buyer.address) + expect(await distributor.getVotes(buyer.address)).toEqual(0n); + expect(await distributor.getVotes(delegatee.address)).toEqual( + ((buyerTotal - currentlyClaimable) * votingFactorBips) / 10000n, + ); + + let distributionRecord = await distributor.getDistributionRecord(buyer.address); // only half of the tokens are claimable right now - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // only one tranche has elapsed - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // buyer now holds tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // the user cannot claim again for now - await expect( - distributor.claim(buyer.address) - ).rejects.toMatchObject( - {message: expect.stringMatching(/no more tokens claimable right now/)} - ) + await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // internal accounting hasn't changed - distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // token balance hasn't changed - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // when the price of the reference asset is changed, the fraction of tokens vested also changes - await btcOracle.setAnswer(2682080000000n) + await btcOracle.setAnswer(2682080000000n); // now 50% of tokens should be vested currentlyClaimable = buyerTotal / 2n; - - await distributor.claim(buyer.address) - distributionRecord = await distributor.getDistributionRecord(buyer.address) + + await distributor.claim(buyer.address); + distributionRecord = await distributor.getDistributionRecord(buyer.address); // only half of the tokens are claimable right now - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // only one tranche has elapsed - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) - + expect(distributionRecord.claimed).toEqual(currentlyClaimable); + // voting power has decreased after claim (note the adjustment for rounding error) - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(buyer.address)).toEqual(0n); expectCloseEnough( - (await distributor.getVotes(delegatee.address)).toBigInt(), - (buyerTotal - currentlyClaimable) * votingFactorBips / 10000n, - 1n - ) + await distributor.getVotes(delegatee.address), + ((buyerTotal - currentlyClaimable) * votingFactorBips) / 10000n, + 1n, + ); // buyer now holds tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // the user cannot claim again for now - await expect( - distributor.claim(buyer.address) - ).rejects.toMatchObject( - {message: expect.stringMatching(/no more tokens claimable right now/)} - ) + await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // internal accounting hasn't changed - distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // token balance hasn't changed - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) - - }) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); + }); it("A buyer can initialize without claiming", async () => { - const buyer = buyer1 - const distributor = partiallyVestedDistributor + const buyer = buyer1; + const distributor = partiallyVestedDistributor; - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) - - await distributor.initializeDistributionRecord(buyer.address) - const distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); + + await distributor.initializeDistributionRecord(buyer.address); + const distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // voting power available after delegation - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n) - + expect(await distributor.getVotes(buyer.address)).toEqual(0n); + // delegate to self - const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.address, buyer); - await myDistributor.delegate(buyer.address) + const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.target, buyer); + await myDistributor.delegate(buyer.address); - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(buyerTotal * votingFactorBips / 10000n) + expect(await distributor.getVotes(buyer.address)).toEqual((buyerTotal * votingFactorBips) / 10000n); // buyer has not claimed tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(0n) - }) + expect(await newToken.balanceOf(buyer.address)).toEqual(0n); + }); it("A buyer can initialize and then claim", async () => { - const buyer = buyer2 - const distributor = partiallyVestedDistributor - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyer = buyer2; + const distributor = partiallyVestedDistributor; + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // all tokens should be claimable - await btcOracle.setAnswer(5000000000001n) - let currentlyClaimable = buyerTotal + await btcOracle.setAnswer(5000000000001n); + let currentlyClaimable = buyerTotal; // this value should be available before initialization - expect((await distributor.getClaimableAmount(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await distributor.getClaimableAmount(buyer.address, "0x")).toEqual(currentlyClaimable); // only half of the tokens should be claimable - await btcOracle.setAnswer(2500000000001n) - currentlyClaimable = buyerTotal / 2n - expect((await distributor.getClaimableAmount(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + await btcOracle.setAnswer(2500000000001n); + currentlyClaimable = buyerTotal / 2n; + expect(await distributor.getClaimableAmount(buyer.address, "0x")).toEqual(currentlyClaimable); - await distributor.initializeDistributionRecord(buyer.address) - let distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + await distributor.initializeDistributionRecord(buyer.address); + let distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // delegate to self - const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.address, buyer); - await myDistributor.delegate(buyer.address) + const myDistributor = await ethers.getContractAt("PriceTierVestingSale_2_0", distributor.target, buyer); + await myDistributor.delegate(buyer.address); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // voting power available after initialization - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(buyerTotal * votingFactorBips / 10000n) - - await distributor.claim(buyer.address) - distributionRecord = await distributor.getDistributionRecord(buyer.address) + expect(await distributor.getVotes(buyer.address)).toEqual((buyerTotal * votingFactorBips) / 10000n); - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + await distributor.claim(buyer.address); + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // voting power has decreased (note the adjustment for rounding error) - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(currentlyClaimable * votingFactorBips / 10000n + 1n) + expect(await distributor.getVotes(buyer.address)).toEqual((currentlyClaimable * votingFactorBips) / 10000n + 1n); // buyer now holds tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // the user cannot claim again for now - await expect( - distributor.claim(buyer.address) - ).rejects.toMatchObject( - {message: expect.stringMatching(/no more tokens claimable right now/)} - ) + await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // internal accounting hasn't changed - distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // token balance hasn't changed - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) - }) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); + }); it("non-participants in the sale cannot claim any tokens", async () => { - const user = nonBuyer - const distributor = partiallyVestedDistributor - - let distributionRecord = await distributor.getDistributionRecord(user.address) + const user = nonBuyer; + const distributor = partiallyVestedDistributor; + + let distributionRecord = await distributor.getDistributionRecord(user.address); // nothing to distribute - expect(distributionRecord.total.toBigInt()).toEqual(0n) + expect(distributionRecord.total).toEqual(0n); // nothing claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // no votes - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); // not initialized - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // user holds no tokens - expect((await newToken.balanceOf(user.address)).toBigInt()).toEqual(0n) + expect(await newToken.balanceOf(user.address)).toEqual(0n); // The user cannot initialize because they did not make any purchases - await expect( - distributor.initializeDistributionRecord(user.address) - ).rejects.toMatchObject({message: expect.stringMatching(/no purchases found/)}) + await expect(distributor.initializeDistributionRecord(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no purchases found/), + }); // The user cannot claim because they did not make any purchases - await expect( - distributor.claim(user.address) - ).rejects.toMatchObject({message: expect.stringMatching(/no purchases found/)}) + await expect(distributor.claim(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no purchases found/), + }); }); it("IMPORTANT: buyers can claim all tokens when all tranches have vested", async () => { - const distributor = fullyVestedDistributor - - const total = (await distributor.total()).toBigInt() - const userTotal = total / BigInt(buyers.length) + const distributor = fullyVestedDistributor; + + const total = await distributor.total(); + const userTotal = total / BigInt(buyers.length); for (let user of claimers) { // get the user's initial token balance - const initialBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const initialBalance = await newToken.balanceOf(user.address); // claim from the fully veseted distributor await distributor.claim(user.address); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const finalBalance = await newToken.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual(userTotal) + expect(distributionRecord.total).toEqual(userTotal); // everything has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(userTotal) + expect(distributionRecord.claimed).toEqual(userTotal); // the user's balance has increased by the correct amount - expect(finalBalance - initialBalance).toEqual(userTotal) + expect(finalBalance - initialBalance).toEqual(userTotal); // no votes remaining - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); } }); it("buyers cannot claim any tokens when no tranches have completed", async () => { - const distributor = unvestedDistributor + const distributor = unvestedDistributor; - const total = (await distributor.total()).toBigInt() - const userTotal = total / BigInt(buyers.length) + const total = await distributor.total(); + const userTotal = total / BigInt(buyers.length); for (let user of claimers) { // get the user's initial token balance - const initialBalance = (await newToken.balanceOf(user.address)).toBigInt(); - await expect( - distributor.claim(user.address) - ).rejects.toMatchObject( - {message: expect.stringMatching(/no more tokens claimable right now/)} - ) + const initialBalance = await newToken.balanceOf(user.address); + await expect(distributor.claim(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const finalBalance = await newToken.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual(userTotal) + expect(distributionRecord.total).toEqual(userTotal); // nothing has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // the user's token balance has not increased - expect(finalBalance - initialBalance).toEqual(0n) + expect(finalBalance - initialBalance).toEqual(0n); } // no tokens have been distributed from the unvested distributor - expect((await newToken.balanceOf(distributor.address)).toBigInt()).toEqual(total) + expect(await newToken.balanceOf(distributor.target)).toEqual(total); }); - // TODO; why reverting without a reason string? - it.skip("reverts on misconfiguration during deployment", async () => { - // Cannot set the sale to an invalid address - await expect( - DistributorFactory.deploy( - deployer.address, - newToken.address, - await newToken.decimals(), - nctPrice, - // start time - 1, - // end time - 2672905631, - btcOracle.address, - [ - {price: 1, vestedFraction: 10000} - ], - // a 1.5x voting factor - 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/Transaction reverted: function returned an unexpected amount of data/)} - ) + it("reverts on misconfiguration during deployment", async () => { + // // TODO; why reverting without a reason string? + // // Cannot set the sale to an invalid address + // await expect( + // DistributorFactory.deploy( + // deployer.address, + // newToken.target, + // await newToken.decimals(), + // nctPrice, + // // start time + // 1, + // // end time + // 2672905631, + // btcOracle.target, + // [ + // {price: 1, vestedFraction: 10000} + // ], + // // a 1.5x voting factor + // 15000, + // uri + // ) + // ).rejects.toMatchObject( + // {message: expect.stringMatching(/Transaction reverted: function returned an unexpected amount of data/)} + // ) // Must vest all tokens await expect( DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracle.address, + btcOracle.target, [ - {price: 1, vestedFraction: 5000}, + { price: 1, vestedFraction: 5000 }, // this is not quite all tokens! - {price: 100000000, vestedFraction: 9999} + { price: 100000000, vestedFraction: 9999 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/highest price tier must vest all tokens/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/highest price tier must vest all tokens/) }); // Price tier prices must increase await expect( DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracle.address, + btcOracle.target, [ - {price: 500000000, vestedFraction: 5000}, + { price: 500000000, vestedFraction: 5000 }, // lower price -- oops - {price: 400000000, vestedFraction: 10000} + { price: 400000000, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/tier prices decrease/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/tier prices decrease/) }); // Tranche vested fraction must increase await expect( DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracle.address, + btcOracle.target, [ - {price: 1000000000, vestedFraction: 10000}, + { price: 1000000000, vestedFraction: 10000 }, // vested fraction is decreasing -- oops - {price: 2000000000, vestedFraction: 5000} + { price: 2000000000, vestedFraction: 5000 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/vested fraction decreases/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/vested fraction decreases/) }); }); - it('can only be deployed when the sale is closed', async () => { + it("can only be deployed when the sale is closed", async () => { const openPublicSaleTx = await saleFactory.newSale( deployer.address, config, // base currency - 'USD', + "USD", // native payments enabled true, // native price oracle - ethOracle.address, + ethOracle.target, // payment tokens - [usdc.address], + [usdc.target], // payment token price oracles - [usdcOracle.address], + [usdcOracle.target], // payment token decimals - [6] - ) - - const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx) + [6], + ); + + const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx); const openSale = await ethers.getContractAt("FlatPriceSale", openSaleAddress, deployer); // make a purchase - const mySale = await ethers.getContractAt("FlatPriceSale", openSale.address, buyer0); + const mySale = await ethers.getContractAt("FlatPriceSale", openSale.target, buyer0); // buy with ETH await mySale.buyWithNative( // no data - '0x', + "0x", // no merkle proof [], { - value: ethPaymentAmount - } + value: ethPaymentAmount, + }, ); await expect( DistributorFactory.deploy( - openSale.address, - newToken.address, + openSale.target, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracle.address, - [ - {price: 1, vestedFraction: 10000} - ], + btcOracle.target, + [{ price: 1, vestedFraction: 10000 }], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/sale not over yet/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/sale not over yet/) }); }); - it('total to distribute must be > 0', async () => { + it("total to distribute must be > 0", async () => { const openPublicSaleTx = await saleFactory.newSale( deployer.address, config, // base currency - 'USD', + "USD", // native payments enabled true, // native price oracle - ethOracle.address, + ethOracle.target, // payment tokens - [usdc.address], + [usdc.target], // payment token price oracles - [usdcOracle.address], + [usdcOracle.target], // payment token decimals - [6] - ) + [6], + ); - const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx) + const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx); await expect( DistributorFactory.deploy( openSaleAddress, - newToken.address, + newToken.target, await newToken.decimals(), nctPrice, // start time 1, // end time 2672905631, - btcOracle.address, + btcOracle.target, [ // 10% of tokens vest at each time - {price: 1, vestedFraction: 10000} + { price: 1, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/Distributor: total is 0/)} - ) - }) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/Distributor: total is 0/) }); + }); it("Handles negative adjustments to a user's total claimable amount", async () => { - const buyer = buyer4 - const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - + const buyer = buyer4; + const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + // adjust a buyer's allocation downward - await fullyVestedDistributor.initializeDistributionRecord(buyer.address) - await fullyVestedDistributor.adjust( - buyer.address, - -10000n - ) + await fullyVestedDistributor.initializeDistributionRecord(buyer.address); + await fullyVestedDistributor.adjust(buyer.address, -10000n); - const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - expect(newAllocation).toEqual(initialAllocation.sub(10000n)) + const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + expect(newAllocation).toEqual(initialAllocation - 10000n); // claim - await fullyVestedDistributor.connect(buyer).claim(buyer.address) - + await fullyVestedDistributor.connect(buyer).claim(buyer.address); + // check distributionRecord - const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address) - expect(distributionRecord.initialized).toBe(true) - expect (distributionRecord.total).toEqual(newAllocation) - expect(distributionRecord.claimed).toEqual(newAllocation) + const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address); + expect(distributionRecord.initialized).toBe(true); + expect(distributionRecord.total).toEqual(newAllocation); + expect(distributionRecord.claimed).toEqual(newAllocation); // check NCT balance - const balance = await newToken.balanceOf(buyer.address) - expect(balance).toEqual(newAllocation) - }) + const balance = await newToken.balanceOf(buyer.address); + expect(balance).toEqual(newAllocation); + }); it("Handles positive adjustments to a user's total claimable amount", async () => { - const buyer = buyer5 - const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - + const buyer = buyer5; + const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + // adjust a buyer's allocation upward - await fullyVestedDistributor.initializeDistributionRecord(buyer.address) - await fullyVestedDistributor.adjust( - buyer.address, - 10000n - ) - - - const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - expect(newAllocation).toEqual(initialAllocation.add(10000n)) - + await fullyVestedDistributor.initializeDistributionRecord(buyer.address); + await fullyVestedDistributor.adjust(buyer.address, 10000n); + + const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + expect(newAllocation).toEqual(initialAllocation + 10000n); + // transfer additional tokens to the distributor - await newToken.transfer(fullyVestedDistributor.address, 10000n) - + await newToken.transfer(fullyVestedDistributor.target, 10000n); + // claim - await fullyVestedDistributor.connect(buyer).claim(buyer.address) - + await fullyVestedDistributor.connect(buyer).claim(buyer.address); + // check distributionRecord - const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address) - expect(distributionRecord.initialized).toBe(true) - expect (distributionRecord.total).toEqual(newAllocation) - expect(distributionRecord.claimed).toEqual(newAllocation) + const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address); + expect(distributionRecord.initialized).toBe(true); + expect(distributionRecord.total).toEqual(newAllocation); + expect(distributionRecord.claimed).toEqual(newAllocation); // check NCT balance - const balance = await newToken.balanceOf(buyer.address) - expect(balance).toEqual(newAllocation) - }) + const balance = await newToken.balanceOf(buyer.address); + expect(balance).toEqual(newAllocation); + }); }); diff --git a/packages/hardhat/test/distributor/Satellite.test.ts b/packages/hardhat/test/distributor/Satellite.test.ts index 73681c8c..b226590f 100644 --- a/packages/hardhat/test/distributor/Satellite.test.ts +++ b/packages/hardhat/test/distributor/Satellite.test.ts @@ -1,222 +1,212 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import hre from "hardhat" +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; import { GenericERC20, Satellite, ConnextMock } from "../../typechain-types"; -import SatelliteDefinition from '../../artifacts/contracts/claim/Satellite.sol/Satellite.json' - -const ethers = (hre as any).ethers +import SatelliteDefinition from "../../artifacts/contracts/claim/Satellite.sol/Satellite.json"; +import { ethers } from "hardhat"; jest.setTimeout(30000); type Tranche = { - time: bigint - vestedFraction: bigint -} + time: bigint; + vestedFraction: bigint; +}; type Config = { - total: bigint - uri: string - votingFactor: bigint + total: bigint; + uri: string; + votingFactor: bigint; proof: { - merkleRoot: string + merkleRoot: string; claims: { [k: string]: { - proof: string[], + proof: string[]; data: { - name: string - type: string - value: string - }[] - } - } - } -} - -let deployer: SignerWithAddress -let eligible1: SignerWithAddress -let eligible2: SignerWithAddress -let eligible3: SignerWithAddress -let ineligible: SignerWithAddress -let token: GenericERC20 -let connext: ConnextMock -let satellite: Satellite - -const domain = 2 -const distributorDomain = 1735353714 -const distributorAddress = '0x94750381be1aba0504c666ee1db118f68f0780d4' + name: string; + type: string; + value: string; + }[]; + }; + }; + }; +}; + +let deployer: SignerWithAddress; +let eligible1: SignerWithAddress; +let eligible2: SignerWithAddress; +let eligible3: SignerWithAddress; +let ineligible: SignerWithAddress; +let token: GenericERC20; +let connext: ConnextMock; +let satellite: Satellite; + +const domain = 2; +const distributorDomain = 1735353714; +const distributorAddress = "0x94750381be1aba0504c666ee1db118f68f0780d4"; // distributor config const config: Config = { // 2000 tokens total: 2000n, // any string will work for these unit tests - the uri is not used on-chain - uri: 'https://example.com', + uri: "https://example.com", // no voting before claims votingFactor: 0n, // created using yarn generate-merkle-root proof: { - "merkleRoot": "0xc1778e1119d42ffb00f014fe412946116e02f73b32e324022cedb5256b5b95cd", - "claims": { + merkleRoot: "0xc1778e1119d42ffb00f014fe412946116e02f73b32e324022cedb5256b5b95cd", + claims: { "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc": { - "proof": [ + proof: [ "0x6718c87625cce6cc64ebea422c01216633da3330fe7c9098da88b4734f8bc2a8", - "0xb8cb8af04efd13b603589588a13c9e63474c4d79452a944db4e9c7d2d2c7ec2f" + "0xb8cb8af04efd13b603589588a13c9e63474c4d79452a944db4e9c7d2d2c7ec2f", ], - "data": [ + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc" + name: "beneficiary", + type: "address", + value: "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "1735353714" - } - ] + name: "domain", + type: "uint32", + value: "1735353714", + }, + ], }, "0x70997970c51812dc3a010c7d01b50e0d17dc79c8": { - "proof": [ - "0x76b9712b2409dcb4449bd096a2902b87b13c43a5072e2da15920338790e7972d" - ], - "data": [ + proof: ["0x76b9712b2409dcb4449bd096a2902b87b13c43a5072e2da15920338790e7972d"], + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8" + name: "beneficiary", + type: "address", + value: "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "1735353714" - } - ] + name: "domain", + type: "uint32", + value: "1735353714", + }, + ], }, "0x90f79bf6eb2c4f870365e785982e1f101e93b906": { - "proof": [ + proof: [ "0x73df9df38ba48b812d2bad1c95fa3ba5390bdc5c3aec13e4c598a893c8af4811", - "0xb8cb8af04efd13b603589588a13c9e63474c4d79452a944db4e9c7d2d2c7ec2f" + "0xb8cb8af04efd13b603589588a13c9e63474c4d79452a944db4e9c7d2d2c7ec2f", ], - "data": [ + data: [ { - "name": "beneficiary", - "type": "address", - "value": "0x90f79bf6eb2c4f870365e785982e1f101e93b906" + name: "beneficiary", + type: "address", + value: "0x90f79bf6eb2c4f870365e785982e1f101e93b906", }, { - "name": "amount", - "type": "uint256", - "value": "1000" + name: "amount", + type: "uint256", + value: "1000", }, { - "name": "domain", - "type": "uint32", - "value": "2" - } - ] - } - } - } -} + name: "domain", + type: "uint32", + value: "2", + }, + ], + }, + }, + }, +}; describe("Satellite", function () { beforeAll(async () => { [deployer, eligible1, eligible2, eligible3, ineligible] = await ethers.getSigners(); const connextFactory = await ethers.getContractFactory("ConnextMock", deployer); - connext = await connextFactory.deploy(domain) as ConnextMock + connext = (await connextFactory.deploy(domain)) as ConnextMock; const satelliteFactory = await ethers.getContractFactory("Satellite", deployer); - satellite = await satelliteFactory.deploy( - connext.address, + satellite = (await satelliteFactory.deploy( + connext.target, distributorAddress, distributorDomain, - config.proof.merkleRoot - ) as Satellite + config.proof.merkleRoot, + )) as Satellite; }); it("Metadata is correct", async () => { - expect((await satellite.distributor()).toLowerCase()).toEqual(distributorAddress) - expect(await satellite.distributorDomain()).toEqual(distributorDomain) - expect(await satellite.domain()).toEqual(domain) - expect(await satellite.connext()).toEqual(connext.address) - expect(await satellite.getMerkleRoot()).toEqual(config.proof.merkleRoot) - }) + expect((await satellite.distributor()).toLowerCase()).toEqual(distributorAddress); + // Added .toString() to the below 2 expect's to avoid BigInt serialization issues. + expect((await satellite.distributorDomain()).toString()).toEqual(distributorDomain.toString()); + expect((await satellite.domain()).toString()).toEqual(domain.toString()); + expect(await satellite.connext()).toEqual(connext.target); + expect(await satellite.getMerkleRoot()).toEqual(config.proof.merkleRoot); + }); it("Can change owner", async () => { - await satellite.transferOwnership(eligible1.address) - expect(await satellite.owner()).toEqual(eligible1.address) + await satellite.transferOwnership(eligible1.address); + expect(await satellite.owner()).toEqual(eligible1.address); await expect( - satellite.setMerkleRoot("0xc1778e1119d42ffb00f014fe412946116e02f73b32e324022cedb5256b5b95cd") - ).rejects.toMatchObject( - { message: expect.stringMatching(/caller is not the owner/) } - ) - }) + satellite.setMerkleRoot("0xc1778e1119d42ffb00f014fe412946116e02f73b32e324022cedb5256b5b95cd"), + ).rejects.toMatchObject({ message: expect.stringMatching(/caller is not the owner/) }); + }); it("Can change merkle root", async () => { - await satellite.connect(eligible1).setMerkleRoot("0xc1778e1119d42ffb00f014fe412946116e02f73b32e324022cedb5256b5b95cd") - expect(await satellite.getMerkleRoot()).toEqual("0xc1778e1119d42ffb00f014fe412946116e02f73b32e324022cedb5256b5b95cd") - }) + await satellite + .connect(eligible1) + .setMerkleRoot("0xc1778e1119d42ffb00f014fe412946116e02f73b32e324022cedb5256b5b95cd"); + expect(await satellite.getMerkleRoot()).toEqual( + "0xc1778e1119d42ffb00f014fe412946116e02f73b32e324022cedb5256b5b95cd", + ); + }); it("Can start a subsidized cross-chain claim by calling Connext", async () => { - const user = eligible3 + const user = eligible3; - const [beneficiary, amount, domain] = config.proof.claims[user.address.toLowerCase()].data.map(d => d.value) - const proof = config.proof.claims[user.address.toLowerCase()].proof + const [beneficiary, amount, domain] = config.proof.claims[user.address.toLowerCase()].data.map(d => d.value); + const proof = config.proof.claims[user.address.toLowerCase()].proof; - const transactionData = await satellite.connect(user).initiateClaim( - amount, - proof - ) - const transactionReceipt = await transactionData.wait() - const iface = new ethers.utils.Interface(SatelliteDefinition.abi) - const { logs } = transactionReceipt - const transferId = iface.parseLog(logs[1]).args[0] + const transactionData = await satellite.connect(user).initiateClaim(amount, proof); + const transactionReceipt = await transactionData.wait(); + const iface = new ethers.Interface(SatelliteDefinition.abi); + const logs = transactionReceipt!.logs; + const transferId = iface.parseLog(logs[1])!.args[0]; - expect(transferId).toMatch(/^0x[0-9a-f]{64}$/) - }) + expect(transferId).toMatch(/^0x[0-9a-f]{64}$/); + }); it("Can start a cross-chain claim including a relayer fee by calling Connext", async () => { - const user = eligible3 + const user = eligible3; - const [, amount,] = config.proof.claims[user.address.toLowerCase()].data.map(d => d.value) - const proof = config.proof.claims[user.address.toLowerCase()].proof + const [, amount] = config.proof.claims[user.address.toLowerCase()].data.map(d => d.value); + const proof = config.proof.claims[user.address.toLowerCase()].proof; - const transactionData = await satellite.connect(user).initiateClaim( - amount, - proof, - { value: 1000000000000000n } - ) - const transactionReceipt = await transactionData.wait() - const iface = new ethers.utils.Interface(SatelliteDefinition.abi) - const { logs } = transactionReceipt - const transferId = iface.parseLog(logs[2]).args[0] + const transactionData = await satellite.connect(user).initiateClaim(amount, proof, { value: 1000000000000000n }); + const transactionReceipt = await transactionData.wait(); + const iface = new ethers.Interface(SatelliteDefinition.abi); + const logs = transactionReceipt!.logs; + const transferId = iface.parseLog(logs[2])!.args[0]; - expect(transferId).toMatch(/^0x[0-9a-f]{64}$/) - }) + expect(transferId).toMatch(/^0x[0-9a-f]{64}$/); + }); it("Distributor domain must not match satellite domain", async () => { const satelliteFactory = await ethers.getContractFactory("Satellite", deployer); await expect( satelliteFactory.deploy( - connext.address, + connext.target, distributorAddress, domain, // <-- this is the same as the satellite domain - config.proof.merkleRoot - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/same domain/) } - ) - }) -}) + config.proof.merkleRoot, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/same domain/) }); + }); +}); diff --git a/packages/hardhat/test/distributor/TrancheVestingMerkle.test.ts b/packages/hardhat/test/distributor/TrancheVestingMerkle.test.ts index a0c0067c..0a01c5a3 100644 --- a/packages/hardhat/test/distributor/TrancheVestingMerkle.test.ts +++ b/packages/hardhat/test/distributor/TrancheVestingMerkle.test.ts @@ -1,136 +1,138 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { BigNumber } from "ethers"; -import hre from 'hardhat' -import { GenericERC20, TrancheVestingMerkle__factory, TrancheVestingMerkle, ERC20, GenericERC20__factory } from "../../typechain-types"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import hre from "hardhat"; +import { + GenericERC20, + TrancheVestingMerkle__factory, + TrancheVestingMerkle, + ERC20, + GenericERC20__factory, +} from "../../typechain-types"; import { time } from "@nomicfoundation/hardhat-network-helpers"; -const ethers = (hre as any).ethers +const ethers = (hre as any).ethers; jest.setTimeout(30000); type Tranche = { - time: bigint - vestedFraction: bigint -} - -let deployer: SignerWithAddress -let eligible1: SignerWithAddress -let eligible2: SignerWithAddress -let eligible3: SignerWithAddress -let ineligible: SignerWithAddress -let token: GenericERC20 -let DistributorFactory: TrancheVestingMerkle__factory -let unvestedDistributor: TrancheVestingMerkle -let partiallyVestedDistributor: TrancheVestingMerkle -let fullyVestedDistributor: TrancheVestingMerkle - - -let unvestedTranches: Tranche[] -let partiallyVestedTranches: Tranche[] -let fullyVestedTranches: Tranche[] + time: bigint; + vestedFraction: bigint; +}; + +let deployer: SignerWithAddress; +let eligible1: SignerWithAddress; +let eligible2: SignerWithAddress; +let eligible3: SignerWithAddress; +let ineligible: SignerWithAddress; +let token: GenericERC20; +let DistributorFactory: TrancheVestingMerkle__factory; +let unvestedDistributor: TrancheVestingMerkle; +let partiallyVestedDistributor: TrancheVestingMerkle; +let fullyVestedDistributor: TrancheVestingMerkle; + +let unvestedTranches: Tranche[]; +let partiallyVestedTranches: Tranche[]; +let fullyVestedTranches: Tranche[]; type Config = { - total: bigint - uri: string - votingFactor: bigint + total: bigint; + uri: string; + votingFactor: bigint; proof: { - merkleRoot: string + merkleRoot: string; claims: { [k: string]: { - proof: string[], + proof: string[]; data: { - name: string - type: string - value: string - }[] - } - } - } -} + name: string; + type: string; + value: string; + }[]; + }; + }; + }; +}; // distribute a million tokens in total const config: Config = { // 7500 tokens total: 7500000000000000000002n, // any string will work for these unit tests - the uri is not used on-chain - uri: 'https://example.com', + uri: "https://example.com", // 2x, denominated in fractionDenominator of 1e4 (basis points) votingFactor: 2n * 10n ** 4n, // created using yarn generate-merkle-root proof: { - "merkleRoot": "0xf32ce147ef6c8e7a07fbe3ce1ae1aef2405a59b50db2a8ede14f4e75bfe7d949", - "claims": { + merkleRoot: "0xf32ce147ef6c8e7a07fbe3ce1ae1aef2405a59b50db2a8ede14f4e75bfe7d949", + claims: { "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65": { - "proof": [ + proof: [ "0x2407fcb79b873fc44e17093017a9d2ecd688419972e57cf95e726c0cb2cc1911", - "0xaaaad2f6e9b5bab2f21b412af6c8cd0747c84dbc38a5b6ac613d00132de8d366" + "0xaaaad2f6e9b5bab2f21b412af6c8cd0747c84dbc38a5b6ac613d00132de8d366", ], - "data": [ + data: [ { - "name": "index", - "type": "uint256", - "value": '2' + name: "index", + type: "uint256", + value: "2", }, { - "name": "beneficiary", - "type": "address", - "value": "0x15d34aaf54267db7d7c367839aaf71a00a2c6a65" + name: "beneficiary", + type: "address", + value: "0x15d34aaf54267db7d7c367839aaf71a00a2c6a65", }, { - "name": "amount", - "type": "uint256", - "value": "1" - } - ] + name: "amount", + type: "uint256", + value: "1", + }, + ], }, "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC": { - "proof": [ + proof: [ "0x524b4658f483b7a148d5c638908ef5156c0b69227bf010e9bbc94068c62e3438", - "0xaaaad2f6e9b5bab2f21b412af6c8cd0747c84dbc38a5b6ac613d00132de8d366" + "0xaaaad2f6e9b5bab2f21b412af6c8cd0747c84dbc38a5b6ac613d00132de8d366", ], - "data": [ + data: [ { - "name": "index", - "type": "uint256", - "value": '0' + name: "index", + type: "uint256", + value: "0", }, { - "name": "beneficiary", - "type": "address", - "value": "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc" + name: "beneficiary", + type: "address", + value: "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc", }, { - "name": "amount", - "type": "uint256", - "value": "2500000000000000000000" - } - ] + name: "amount", + type: "uint256", + value: "2500000000000000000000", + }, + ], }, "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": { - "proof": [ - "0xa4170e52dc35c1127b67e1c2f5466fce9673e61b44e077b7023f7c994d55c5dd" - ], - "data": [ + proof: ["0xa4170e52dc35c1127b67e1c2f5466fce9673e61b44e077b7023f7c994d55c5dd"], + data: [ { - "name": "index", - "type": "uint256", - "value": '1' + name: "index", + type: "uint256", + value: "1", }, { - "name": "beneficiary", - "type": "address", - "value": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8" + name: "beneficiary", + type: "address", + value: "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", }, { - "name": "amount", - "type": "uint256", - "value": "5000000000000000000000" - } - ] - } - } - } -} + name: "amount", + type: "uint256", + value: "5000000000000000000000", + }, + ], + }, + }, + }, +}; describe("TrancheVestingMerkle", function () { beforeAll(async () => { @@ -141,229 +143,227 @@ describe("TrancheVestingMerkle", function () { [deployer, eligible1, eligible2, ineligible, eligible3] = await ethers.getSigners(); const GenericERC20Factory = await ethers.getContractFactory("GenericERC20", deployer); - token = await GenericERC20Factory.deploy( + token = (await GenericERC20Factory.deploy( "Neue Crypto Token", "NCT", 18, // 1B tokens - (10n ** 9n * 10n ** 18n).toString() - ) as GenericERC20 + (10n ** 9n * 10n ** 18n).toString(), + )) as GenericERC20; DistributorFactory = await ethers.getContractFactory("TrancheVestingMerkle", deployer); // get the last block time after a recent transaction to make sure it is recent unvestedTranches = [ - {time: now + 100n, vestedFraction: 1000n}, - {time: now + 200n, vestedFraction: 5000n}, - {time: now + 300n, vestedFraction: 10000n}, - ] + { time: now + 100n, vestedFraction: 1000n }, + { time: now + 200n, vestedFraction: 5000n }, + { time: now + 300n, vestedFraction: 10000n }, + ]; partiallyVestedTranches = [ - {time: now - 100n, vestedFraction: 1000n}, - {time: now - 1n, vestedFraction: 5000n}, - {time: now + 100n, vestedFraction: 10000n}, - ] + { time: now - 100n, vestedFraction: 1000n }, + { time: now - 1n, vestedFraction: 5000n }, + { time: now + 100n, vestedFraction: 10000n }, + ]; fullyVestedTranches = [ - {time: now - 100n, vestedFraction: 1000n}, - {time: now - 50n, vestedFraction: 5000n}, - {time: now - 10n, vestedFraction: 10000n}, - ] + { time: now - 100n, vestedFraction: 1000n }, + { time: now - 50n, vestedFraction: 5000n }, + { time: now - 10n, vestedFraction: 10000n }, + ]; // deploy a distributor that has not started vesting (cliff in the future) unvestedDistributor = await DistributorFactory.deploy( - token.address, + token.target, config.total, config.uri, config.votingFactor, unvestedTranches, config.proof.merkleRoot, - 0 + 0, ); // deploy another distributor that is mid-vesting partiallyVestedDistributor = await DistributorFactory.deploy( - token.address, + token.target, config.total, config.uri, config.votingFactor, partiallyVestedTranches, config.proof.merkleRoot, - 0 + 0, ); fullyVestedDistributor = await DistributorFactory.deploy( - token.address, + token.target, config.total, config.uri, config.votingFactor, fullyVestedTranches, config.proof.merkleRoot, - 0 + 0, ); // transfer tokens to the distributors - await token.transfer(partiallyVestedDistributor.address, await partiallyVestedDistributor.total()) - await token.transfer(unvestedDistributor.address, await unvestedDistributor.total()) - await token.transfer(fullyVestedDistributor.address, await fullyVestedDistributor.total()) + await token.transfer(partiallyVestedDistributor.target, await partiallyVestedDistributor.total()); + await token.transfer(unvestedDistributor.target, await unvestedDistributor.total()); + await token.transfer(fullyVestedDistributor.target, await fullyVestedDistributor.total()); }); it("Metadata is correct", async () => { const distributor = partiallyVestedDistributor; - expect(await distributor.NAME()).toEqual("TrancheVestingMerkle") - expect(await distributor.VERSION() >= BigNumber.from(1)) - expect(await distributor.uri()).toEqual(config.uri) - }) + expect(await distributor.NAME()).toEqual("TrancheVestingMerkle"); + expect((await distributor.VERSION()) >= 1); + expect(await distributor.uri()).toEqual(config.uri); + }); it("Initial distributor configuration is correct", async () => { - const distributorTranches = [unvestedTranches, partiallyVestedTranches, fullyVestedTranches] - + const distributorTranches = [unvestedTranches, partiallyVestedTranches, fullyVestedTranches]; + for (let [i, distributor] of [unvestedDistributor, partiallyVestedDistributor, fullyVestedDistributor].entries()) { // the distributor total must match (note the adjustment for rounding error) - expect((await distributor.total()).toBigInt()).toEqual(config.total) + expect(await distributor.total()).toEqual(config.total); // nothing has been claimed - expect((await distributor.claimed()).toBigInt()).toEqual(0n) + expect(await distributor.claimed()).toEqual(0n); - const tranches = await distributor.getTranches() + const tranches = await distributor.getTranches(); - expect(tranches.length).toEqual(distributorTranches[i].length) + expect(tranches.length).toEqual(distributorTranches[i].length); for (let [j, tranche] of tranches.entries()) { - expect(tranche.time.toBigInt()).toEqual(distributorTranches[i][j].time) - expect(tranche.vestedFraction.toBigInt()).toEqual(distributorTranches[i][j].vestedFraction) + expect(tranche.time).toEqual(distributorTranches[i][j].time); + expect(tranche.vestedFraction).toEqual(distributorTranches[i][j].vestedFraction); } // no claims have been initialized yet! for (let user of [eligible1, eligible2, ineligible]) { - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // not initialized yet - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // the total can be inferred from the sale - expect(distributionRecord.total.toBigInt()).toEqual(0n) + expect(distributionRecord.total).toEqual(0n); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // TODO: allow voting prior to initialization // voting power must be zero prior to initialization - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n); + expect(await distributor.getVotes(user.address)).toEqual(0n); // does not yet hold tokens to claim - expect((await token.balanceOf(user.address)).toBigInt()).toEqual(0n) + expect(await token.balanceOf(user.address)).toEqual(0n); } // fraction denominator is the expected value (10,000) - expect((await distributor.getFractionDenominator()).toBigInt()).toEqual(10000n) + expect(await distributor.getFractionDenominator()).toEqual(10000n); } - }) + }); it("A user can claim without initialization", async () => { - const user = eligible1 - const distributor = partiallyVestedDistributor + const user = eligible1; + const distributor = partiallyVestedDistributor; - const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - const proof = config.proof.claims[user.address].proof + const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + const proof = config.proof.claims[user.address].proof; - await distributor.claim(index, beneficiary, amount, proof) + await distributor.claim(index, beneficiary, amount, proof); // 50% of tokens have already vested const claimable = BigInt(amount) / 2n; - let distributionRecord = await distributor.getDistributionRecord(user.address) + let distributionRecord = await distributor.getDistributionRecord(user.address); - expect(distributionRecord.total.toBigInt()).toEqual(BigInt(amount)) - expect(distributionRecord.initialized).toEqual(true) - expect(distributionRecord.claimed.toBigInt()).toEqual(claimable) + expect(distributionRecord.total).toEqual(BigInt(amount)); + expect(distributionRecord.initialized).toEqual(true); + expect(distributionRecord.claimed).toEqual(claimable); // delegate to self - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) - const myDistributor = await ethers.getContractAt("TrancheVestingMerkle", distributor.address, user); - await myDistributor.delegate(user.address) - - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(2n * BigInt(distributionRecord.total.toBigInt() - distributionRecord.claimed.toBigInt())) - expect((await token.balanceOf(user.address)).toBigInt()).toEqual(claimable) + expect(await distributor.getVotes(user.address)).toEqual(0n); + const myDistributor = await ethers.getContractAt("TrancheVestingMerkle", distributor.target, user); + await myDistributor.delegate(user.address); + + expect(await distributor.getVotes(user.address)).toEqual( + 2n * BigInt(distributionRecord.total - distributionRecord.claimed), + ); + expect(await token.balanceOf(user.address)).toEqual(claimable); // the distributor metrics are now updated - expect((await distributor.claimed()).toBigInt()).toEqual(distributionRecord.claimed.toBigInt()) - }) + expect(await distributor.claimed()).toEqual(distributionRecord.claimed); + }); it("A buyer can initialize before claiming", async () => { - const user = eligible2 - const distributor = partiallyVestedDistributor - const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - const proof = config.proof.claims[user.address].proof + const user = eligible2; + const distributor = partiallyVestedDistributor; + const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + const proof = config.proof.claims[user.address].proof; // 50% of tokens have already vested const claimable = BigInt(amount) / 2n; - - await distributor.initializeDistributionRecord(index, beneficiary, amount, proof) - let distributionRecord = await distributor.getDistributionRecord(user.address) + await distributor.initializeDistributionRecord(index, beneficiary, amount, proof); - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(config.proof.claims[user.address].data[2].value) - ) + let distributionRecord = await distributor.getDistributionRecord(user.address); + + expect(distributionRecord.total).toEqual(BigInt(config.proof.claims[user.address].data[2].value)); // no votes prior to delegation - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); // delegate to self - const myDistributor = await ethers.getContractAt("TrancheVestingMerkle", distributor.address, user); - await myDistributor.delegate(user.address) + const myDistributor = await ethers.getContractAt("TrancheVestingMerkle", distributor.target, user); + await myDistributor.delegate(user.address); - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(config.proof.claims[user.address].data[2].value) - ) + expect(distributionRecord.total).toEqual(BigInt(config.proof.claims[user.address].data[2].value)); // now the user has votes - expect(distributionRecord.initialized).toEqual(true) - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(2n * BigInt(amount)) + expect(distributionRecord.initialized).toEqual(true); + expect(distributionRecord.claimed).toEqual(0n); + expect(await distributor.getVotes(user.address)).toEqual(2n * BigInt(amount)); // the user has no balance - expect((await token.balanceOf(user.address)).toBigInt(),).toEqual(0n) + expect(await token.balanceOf(user.address)).toEqual(0n); // the admin increases the voting factor - await distributor.setVoteFactor(1230000n) + await distributor.setVoteFactor(1230000n); // now we claim! - await distributor.claim(index, beneficiary, amount, proof) + await distributor.claim(index, beneficiary, amount, proof); // the voting factor has been updated by claiming (half of voting power remains at the 123x factor) - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(123n * BigInt(amount) / 2n) + expect(await distributor.getVotes(user.address)).toEqual((123n * BigInt(amount)) / 2n); // the admin resets the voting factor - await distributor.setVoteFactor(config.votingFactor) + await distributor.setVoteFactor(config.votingFactor); // the voting factor for this user can be fixed again - await distributor.initializeDistributionRecord(index, beneficiary, amount, proof) - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(2n * BigInt(amount) / 2n) + await distributor.initializeDistributionRecord(index, beneficiary, amount, proof); + expect(await distributor.getVotes(user.address)).toEqual((2n * BigInt(amount)) / 2n); - distributionRecord = await distributor.getDistributionRecord(user.address) + distributionRecord = await distributor.getDistributionRecord(user.address); - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(amount) - ) - expect(distributionRecord.initialized).toEqual(true) - expect(distributionRecord.claimed.toBigInt()).toEqual(claimable) + expect(distributionRecord.total).toEqual(BigInt(amount)); + expect(distributionRecord.initialized).toEqual(true); + expect(distributionRecord.claimed).toEqual(claimable); // only unclaimed tokens provide voting power from the distributor - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(2n * BigInt(distributionRecord.total.toBigInt() - distributionRecord.claimed.toBigInt())) + expect(await distributor.getVotes(user.address)).toEqual( + 2n * BigInt(distributionRecord.total - distributionRecord.claimed), + ); // the user now has a balance - expect((await token.balanceOf(user.address)).toBigInt()).toEqual(claimable) - }) + expect(await token.balanceOf(user.address)).toEqual(claimable); + }); it("non-participants in the sale cannot claim any tokens", async () => { - const user = ineligible - const distributor = partiallyVestedDistributor + const user = ineligible; + const distributor = partiallyVestedDistributor; - let distributionRecord = await distributor.getDistributionRecord(user.address) + let distributionRecord = await distributor.getDistributionRecord(user.address); // nothing to distribute - expect(distributionRecord.total.toBigInt()).toEqual(0n) + expect(distributionRecord.total).toEqual(0n); // nothing claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // no votes - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); // not initialized - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // user holds no tokens - expect((await token.balanceOf(user.address)).toBigInt()).toEqual(0n) + expect(await token.balanceOf(user.address)).toEqual(0n); // The user cannot initialize because they are not in the merkle proof - using another addresses' values will not work await expect( @@ -372,8 +372,8 @@ describe("TrancheVestingMerkle", function () { user.address, // beneficiary config.proof.claims[eligible1.address].data[2].value, // amount config.proof.claims[eligible1.address].proof, // proof - ) - ).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }) + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }); // The user cannot claim because they are not in the merkle proof await expect( @@ -382,233 +382,219 @@ describe("TrancheVestingMerkle", function () { user.address, // beneficiary config.proof.claims[eligible2.address].data[2].value, // amount config.proof.claims[eligible2.address].proof, // proof - ) - ).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }) + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }); }); it("users can claim all tokens when all tranches have vested", async () => { - const distributor = fullyVestedDistributor + const distributor = fullyVestedDistributor; for (let user of [eligible1, eligible2]) { - const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - const proof = config.proof.claims[user.address].proof + const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + const proof = config.proof.claims[user.address].proof; // get the user's initial token balance - const initialBalance = (await token.balanceOf(user.address)).toBigInt(); + const initialBalance = await token.balanceOf(user.address); // claim from the fully vested distributor - await distributor.claim(index, beneficiary, amount, proof) + await distributor.claim(index, beneficiary, amount, proof); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await token.balanceOf(user.address)).toBigInt(); + const finalBalance = await token.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(amount) - ) + expect(distributionRecord.total).toEqual(BigInt(amount)); // everything has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual( - BigInt(amount) - ) + expect(distributionRecord.claimed).toEqual(BigInt(amount)); // the user's balance has increased by the correct amount - expect(finalBalance - initialBalance).toEqual( - BigInt(amount) - ) + expect(finalBalance - initialBalance).toEqual(BigInt(amount)); // no votes remaining - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); } // all tokens have been distributed from the fully vested distributor (within rounding error) - expect((await token.balanceOf(distributor.address)).toNumber()).toBeLessThan(100) + expect(await token.balanceOf(distributor.target)).toBeLessThan(100); }); it("users cannot claim any tokens before the cliff has expired", async () => { - const distributor = unvestedDistributor + const distributor = unvestedDistributor; - const total = (await distributor.total()).toBigInt() + const total = await distributor.total(); for (let user of [eligible1, eligible2]) { - const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - const proof = config.proof.claims[user.address].proof + const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + const proof = config.proof.claims[user.address].proof; // get the user's initial token balance - const initialBalance = (await token.balanceOf(user.address)).toBigInt(); + const initialBalance = await token.balanceOf(user.address); // TODO: why does this fail sometimes (i.e. the tx should revert but does not) - await expect( - distributor.claim(index, beneficiary, amount, proof) - ).rejects.toMatchObject( - { message: expect.stringMatching(/no more tokens claimable right now/) } - ) + await expect(distributor.claim(index, beneficiary, amount, proof)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await token.balanceOf(user.address)).toBigInt(); + const finalBalance = await token.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual( + expect(distributionRecord.total).toEqual( 0n, // distribution records have not yet been initalized - ) + ); // nothing has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // the user's token balance has not increased - expect(finalBalance - initialBalance).toEqual(0n) + expect(finalBalance - initialBalance).toEqual(0n); } // no tokens have been distributed from the unvested distributor - expect((await token.balanceOf(distributor.address)).toBigInt()).toEqual(total) + expect(await token.balanceOf(distributor.target)).toEqual(total); }); it("reverts on misconfiguration during deployment", async () => { let now = await time.latest(); // must vest all tokens - await expect(DistributorFactory.deploy( - token.address, - config.total, - config.uri, - config.votingFactor, - [ - {time: 1, vestedFraction: 1}, - {time: 2, vestedFraction: 9999} - ], - config.proof.merkleRoot, - 0 - )).rejects.toMatchObject( - {message: expect.stringMatching(/last tranche must vest all tokens/)} - ) + await expect( + DistributorFactory.deploy( + token.target, + config.total, + config.uri, + config.votingFactor, + [ + { time: 1, vestedFraction: 1 }, + { time: 2, vestedFraction: 9999 }, + ], + config.proof.merkleRoot, + 0, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/last tranche must vest all tokens/) }); // tranche time must increase - await expect(DistributorFactory.deploy( - token.address, - config.total, - config.uri, - config.votingFactor, - [ - {time: 1, vestedFraction: 1}, - {time: 1, vestedFraction: 2}, - {time: 3, vestedFraction: 10000} - ], - config.proof.merkleRoot, - 0 - )).rejects.toMatchObject( - {message: expect.stringMatching(/tranche time must increase/)} - ) + await expect( + DistributorFactory.deploy( + token.target, + config.total, + config.uri, + config.votingFactor, + [ + { time: 1, vestedFraction: 1 }, + { time: 1, vestedFraction: 2 }, + { time: 3, vestedFraction: 10000 }, + ], + config.proof.merkleRoot, + 0, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/tranche time must increase/) }); // tranche vested fraction must increase - await expect(DistributorFactory.deploy( - token.address, - config.total, - config.uri, - config.votingFactor, - [ - {time: 1, vestedFraction: 1}, - {time: 2, vestedFraction: 1}, - {time: 3, vestedFraction: 10000} - ], - config.proof.merkleRoot, - 0 - )).rejects.toMatchObject( - {message: expect.stringMatching(/tranche vested fraction must increase/)} - ) + await expect( + DistributorFactory.deploy( + token.target, + config.total, + config.uri, + config.votingFactor, + [ + { time: 1, vestedFraction: 1 }, + { time: 2, vestedFraction: 1 }, + { time: 3, vestedFraction: 10000 }, + ], + config.proof.merkleRoot, + 0, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/tranche vested fraction must increase/) }); // total cannot be zero await expect( DistributorFactory.deploy( - token.address, + token.target, 0n, config.uri, config.votingFactor, partiallyVestedTranches, config.proof.merkleRoot, - 0 - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/Distributor: total is 0/) } - ) + 0, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/Distributor: total is 0/) }); // cannot accidentally use tranches with times in milliseconds past the epoch - await expect(DistributorFactory.deploy( - token.address, - config.total, - config.uri, - config.votingFactor, - [ - // oops - time in milliseconds - {time: new Date().getTime(), vestedFraction: 10000} - ], - config.proof.merkleRoot, - 0 - )).rejects.toMatchObject( - {message: expect.stringMatching(/vesting ends after 4102444800/)} - ) - }) + await expect( + DistributorFactory.deploy( + token.target, + config.total, + config.uri, + config.votingFactor, + [ + // oops - time in milliseconds + { time: new Date().getTime(), vestedFraction: 10000 }, + ], + config.proof.merkleRoot, + 0, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/vesting ends after 4102444800/) }); + }); it("correctly sets tranches after deployment", async () => { - const distributor = unvestedDistributor + const distributor = unvestedDistributor; - const checkSomeTranches = async tranches => { + const checkSomeTranches = async (tranches: Tranche[]) => { for (let i = 0; i < 10; i++) { // check for more tranches than we expect if (i < newTranches.length) { - const [time, vestedFraction] = await distributor.getTranche(i) - expect(time.toBigInt()).toEqual(tranches[i].time) - expect(vestedFraction.toBigInt()).toEqual(tranches[i].vestedFraction) + const [time, vestedFraction] = await distributor.getTranche(i); + expect(time).toEqual(tranches[i].time); + expect(vestedFraction).toEqual(tranches[i].vestedFraction); } else { - await expect( - distributor.getTranche(i) - ).rejects.toMatchObject( - { message: expect.stringMatching(/reverted with panic code 50/) } - ) + await expect(distributor.getTranche(i)).rejects.toThrow(/reverted with panic code 0x32/); } } - } + }; // set vesting schedule to use a different number of tranches let newTranches = [ - {time: 1n, vestedFraction: 111n}, - {time: 2n, vestedFraction: 10000n}, - ] + { time: 1n, vestedFraction: 111n }, + { time: 2n, vestedFraction: 10000n }, + ]; await distributor.setTranches(newTranches); await checkSomeTranches(newTranches); newTranches = [ - {time: 3n, vestedFraction: 1n}, - {time: 4n, vestedFraction: 22n}, - {time: 5n, vestedFraction: 333n}, - {time: 6n, vestedFraction: 4444n}, - {time: 7n, vestedFraction: 5555n}, - {time: 8n, vestedFraction: 10000n}, - ] - - await distributor.setTranches(newTranches) - await checkSomeTranches(newTranches) + { time: 3n, vestedFraction: 1n }, + { time: 4n, vestedFraction: 22n }, + { time: 5n, vestedFraction: 333n }, + { time: 6n, vestedFraction: 4444n }, + { time: 7n, vestedFraction: 5555n }, + { time: 8n, vestedFraction: 10000n }, + ]; + + await distributor.setTranches(newTranches); + await checkSomeTranches(newTranches); }); // users can still claim after the voting factor is updated - // see Sherlock-56: + // see Sherlock-56: it("users can claim despite voting factor rounding", async () => { const distributor = fullyVestedDistributor; const user = eligible3; - const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - const proof = config.proof.claims[user.address].proof + const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + const proof = config.proof.claims[user.address].proof; // set voting factor to 0.9x - await distributor.setVoteFactor(9000n) + await distributor.setVoteFactor(9000n); - await distributor.initializeDistributionRecord(index, beneficiary, amount, proof) - await distributor.connect(user).delegate(user.address) + await distributor.initializeDistributionRecord(index, beneficiary, amount, proof); + await distributor.connect(user).delegate(user.address); // should have 0 votes due to rounding (0.9 * 1 => 0) - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); // adjust quantity for this user (note - this is not secure for merkle-based distributors but still a good bug to catch) - await distributor.adjust(user.address, 1n) + await distributor.adjust(user.address, 1n); // should have 1 vote (0.9 * 2 => 1) - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(1n) + expect(await distributor.getVotes(user.address)).toEqual(1n); // can still claim - await distributor.claim(index, beneficiary, amount, proof) + await distributor.claim(index, beneficiary, amount, proof); // should have 0 votes remaining - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) - }) -}) + expect(await distributor.getVotes(user.address)).toEqual(0n); + }); +}); diff --git a/packages/hardhat/test/distributor/TrancheVestingSale_1_3_Distributor.test.ts b/packages/hardhat/test/distributor/TrancheVestingSale_1_3_Distributor.test.ts index f341f333..6c6b9b26 100644 --- a/packages/hardhat/test/distributor/TrancheVestingSale_1_3_Distributor.test.ts +++ b/packages/hardhat/test/distributor/TrancheVestingSale_1_3_Distributor.test.ts @@ -1,93 +1,86 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { BigNumber } from "ethers"; -import hre from 'hardhat' -import { TrancheVestingSale_1_3, SaleManager_v_1_3, GenericERC20, FakeChainlinkOracle, TrancheVestingSale_1_3__factory } from "../../typechain-types"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import { + TrancheVestingSale_1_3, + SaleManager_v_1_3, + GenericERC20, + FakeChainlinkOracle, + TrancheVestingSale_1_3__factory, +} from "../../typechain-types"; import { delay, expectCloseEnough, getSaleId, lastBlockTime } from "../lib"; - -const ethers = (hre as any).ethers +import { ethers } from "hardhat"; jest.setTimeout(30000); -let deployer: SignerWithAddress -let admin: SignerWithAddress -let recipient: SignerWithAddress -let buyer0: SignerWithAddress -let buyer1: SignerWithAddress -let buyer2: SignerWithAddress -let buyer3: SignerWithAddress -let buyer4: SignerWithAddress -let buyer5: SignerWithAddress -let buyers: SignerWithAddress[] -let claimers: SignerWithAddress[] -let nonBuyer: SignerWithAddress -let DistributorFactory: TrancheVestingSale_1_3__factory -let unvestedDistributor: TrancheVestingSale_1_3 -let partiallyVestedDistributor: TrancheVestingSale_1_3 -let fullyVestedDistributor: TrancheVestingSale_1_3 -let publicSaleId: string -let usdc: GenericERC20 -let newToken: GenericERC20 -let chainlinkOracle: FakeChainlinkOracle +let deployer: SignerWithAddress; +let admin: SignerWithAddress; +let recipient: SignerWithAddress; +let buyer0: SignerWithAddress; +let buyer1: SignerWithAddress; +let buyer2: SignerWithAddress; +let buyer3: SignerWithAddress; +let buyer4: SignerWithAddress; +let buyer5: SignerWithAddress; +let buyers: SignerWithAddress[]; +let claimers: SignerWithAddress[]; +let nonBuyer: SignerWithAddress; +let DistributorFactory: TrancheVestingSale_1_3__factory; +let unvestedDistributor: TrancheVestingSale_1_3; +let partiallyVestedDistributor: TrancheVestingSale_1_3; +let fullyVestedDistributor: TrancheVestingSale_1_3; +let publicSaleId: string; +let usdc: GenericERC20; +let newToken: GenericERC20; +let chainlinkOracle: FakeChainlinkOracle; let saleManager: SaleManager_v_1_3; // $100 const usdcPaymentAmount = 100000000n; // $2.9424 -const ethPaymentAmount = ethers.utils.parseEther("0.001").toBigInt() +const ethPaymentAmount = ethers.parseEther("0.001"); // eth price of $2942.40 -const ethPrice = 294240000000n -const nctPrice = 1500000n // $1.50 USDC / NCT +const ethPrice = 294240000000n; +const nctPrice = 1500000n; // $1.50 USDC / NCT const votingFactorBips = 15000n; // 1.5x -const uri = "https://example.com" - +const uri = "https://example.com"; describe("TrancheVestingSale_1_3", function () { beforeAll(async () => { [deployer, admin, recipient, buyer0, buyer1, buyer2, buyer3, buyer4, buyer5, nonBuyer] = await ethers.getSigners(); // make a couple purchases as various users. - buyers = [buyer0, buyer1, buyer2, buyer3, buyer4, buyer5] - claimers = [buyer0, buyer1, buyer2, buyer3] + buyers = [buyer0, buyer1, buyer2, buyer3, buyer4, buyer5]; + claimers = [buyer0, buyer1, buyer2, buyer3]; // a payment token (USDC) const GenericERC20Factory = await ethers.getContractFactory("GenericERC20", deployer); - usdc = await GenericERC20Factory.deploy( - "US Dollar Coin", - "USDC", - 6, - "1000000000000000" - ) as GenericERC20; + usdc = (await GenericERC20Factory.deploy("US Dollar Coin", "USDC", 6, "1000000000000000")) as GenericERC20; // transfer tokens to buyers for (let signer of buyers) { - await usdc.transfer(signer.address, usdcPaymentAmount) + await usdc.transfer(signer.address, usdcPaymentAmount); } // a chainlink oracle for ETH/USD const ChainlinkOracle = await ethers.getContractFactory("FakeChainlinkOracle", deployer); - chainlinkOracle = await ChainlinkOracle.deploy( + chainlinkOracle = (await ChainlinkOracle.deploy( ethPrice, // oracle description - "ETH/USD" - ) as FakeChainlinkOracle + "ETH/USD", + )) as FakeChainlinkOracle; // a token to claim - newToken = await GenericERC20Factory.deploy( + newToken = (await GenericERC20Factory.deploy( "Neue Crypto Token", "NCT", 18, // 1B tokens // (10n ** 9n * 10n ** 18n).toString() - '1000000000000000000000000000' - ) as GenericERC20 + "1000000000000000000000000000", + )) as GenericERC20; // create a sale const SaleManagerFactory = await ethers.getContractFactory("SaleManager_v_1_3", admin); - saleManager = await SaleManagerFactory.deploy( - usdc.address, - 6, - chainlinkOracle.address - ) as SaleManager_v_1_3 + saleManager = (await SaleManagerFactory.deploy(usdc.target, 6, chainlinkOracle.target)) as SaleManager_v_1_3; // a public sale const publicSaleTx = await saleManager.newSale( @@ -101,45 +94,42 @@ describe("TrancheVestingSale_1_3", function () { 0, // max queue time "ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/2", nctPrice.toString(), - 18 // NCT has 18 decimals + 18, // NCT has 18 decimals ); - publicSaleId = await getSaleId(publicSaleTx) + publicSaleId = await getSaleId(publicSaleTx); for (let signer of buyers) { - const mySaleManager = await ethers.getContractAt("SaleManager_v_1_3", saleManager.address, signer); - const myUSDC = await ethers.getContractAt("GenericERC20", usdc.address, signer); + const mySaleManager = await ethers.getContractAt("SaleManager_v_1_3", saleManager.target, signer); + const myUSDC = await ethers.getContractAt("GenericERC20", usdc.target, signer); - await myUSDC.approve( - mySaleManager.address, - usdcPaymentAmount - ); + await myUSDC.approve(mySaleManager.target, usdcPaymentAmount); // buy with USDC - await mySaleManager.functions['buy(bytes32,uint256,bytes32[])']( + await mySaleManager["buy(bytes32,uint256,bytes32[])"]( publicSaleId, usdcPaymentAmount, // no merkle proof - [] + [], ); // buy with ETH - await mySaleManager.functions["buy(bytes32,bytes32[])"]( + await mySaleManager["buy(bytes32,bytes32[])"]( publicSaleId, // no merkle proof [], { - value: ethPaymentAmount - } + value: ethPaymentAmount, + }, ); } // set the end time barely in the future - const endTime = await lastBlockTime() + 4n + const endTime = (await lastBlockTime()) + 4n; await saleManager.setEnd(publicSaleId, endTime); - if (await lastBlockTime() < endTime) { + if ((await lastBlockTime()) < endTime) { // delay a bit more await delay(4000); } @@ -149,29 +139,29 @@ describe("TrancheVestingSale_1_3", function () { // deploy another distributor with a distribution schedule that is in the past partiallyVestedDistributor = await DistributorFactory.deploy( - saleManager.address, + saleManager.target, publicSaleId, - newToken.address, + newToken.target, [ // 10% of tokens vested a very long time ago { time: 1, vestedFraction: 1000 }, // 50% of tokens have already vested { time: 1665188605, vestedFraction: 5000 }, // 50% of tokens vest in the future - { time: 2664826464, vestedFraction: 10000 } + { time: 2664826464, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri + uri, ); // register at least one of the distributors as a courtesy to the subgraph - await saleManager.registerClaimManager(publicSaleId, partiallyVestedDistributor.address) + await saleManager.registerClaimManager(publicSaleId, partiallyVestedDistributor.target); fullyVestedDistributor = await DistributorFactory.deploy( - saleManager.address, + saleManager.target, publicSaleId, - newToken.address, + newToken.target, [ // 10% of tokens vest at each time { time: 1, vestedFraction: 1000 }, @@ -183,403 +173,376 @@ describe("TrancheVestingSale_1_3", function () { { time: 7, vestedFraction: 7000 }, { time: 8, vestedFraction: 8000 }, { time: 9, vestedFraction: 9000 }, - { time: 10, vestedFraction: 10000 } + { time: 10, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri + uri, ); unvestedDistributor = await DistributorFactory.deploy( - saleManager.address, + saleManager.target, publicSaleId, - newToken.address, + newToken.target, [ // no tokens have vested yet - { time: 4000000000, vestedFraction: 10000 } + { time: 4000000000, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri + uri, ); // transfer tokens to the distributors (we are testing 3 distributors, in practice a sale would use one!) - await newToken.transfer(partiallyVestedDistributor.address, await partiallyVestedDistributor.total()) - await newToken.transfer(unvestedDistributor.address, await unvestedDistributor.total()) - await newToken.transfer(fullyVestedDistributor.address, await fullyVestedDistributor.total()) + await newToken.transfer(partiallyVestedDistributor.target, await partiallyVestedDistributor.total()); + await newToken.transfer(unvestedDistributor.target, await unvestedDistributor.total()); + await newToken.transfer(fullyVestedDistributor.target, await fullyVestedDistributor.total()); }); it("Metadata is correct", async () => { const distributor = partiallyVestedDistributor; - expect(await distributor.NAME()).toEqual("TrancheVestingSale_1_3") - expect(await distributor.VERSION() >= BigNumber.from(1)) - expect(await distributor.uri()).toEqual(uri) - }) + expect(await distributor.NAME()).toEqual("TrancheVestingSale_1_3"); + expect((await distributor.VERSION()) >= 1); + expect(await distributor.uri()).toEqual(uri); + }); it("Initial setup matches sale correctly", async () => { const distributor = partiallyVestedDistributor; - expect(await distributor.saleManager()).toEqual(saleManager.address) - expect(await distributor.saleId()).toEqual(publicSaleId) - expect(await distributor.token()).toEqual(newToken.address) + expect(await distributor.saleManager()).toEqual(saleManager.target); + expect(await distributor.saleId()).toEqual(publicSaleId); + expect(await distributor.token()).toEqual(newToken.target); // verify the sale is storing the data we expect // each buyer spent $2.9424 of ETH and $100 of USDC each: this is 100000000 + 2942400 = 102942400 USDC each // (the v1.3 sale records purchases denominated in the payment token) - const totalSpent = (await saleManager.getTotalSpent(publicSaleId)).toBigInt() + const totalSpent = await saleManager.getTotalSpent(publicSaleId); expect(totalSpent).toEqual(BigInt(buyers.length) * 102942400n); // each bought token cost $1.50 and has 18 decimals instead of 6 - const totalBought = (await saleManager.spentToBought(publicSaleId, totalSpent)).toBigInt() - expect(totalBought).toEqual(totalSpent * 10n ** 18n / nctPrice); + const totalBought = await saleManager.spentToBought(publicSaleId, totalSpent); + expect(totalBought).toEqual((totalSpent * 10n ** 18n) / nctPrice); // convert from $102.9424 of 6 decimal USDC to 18 decimal NCT at a price of $1.50 per NCT) (or zero for non-buyers) - const boughtTokens = (signer) => buyers.includes(signer) - ? 102942400n * 10n ** 18n / nctPrice - : 0n + const boughtTokens = (signer: SignerWithAddress) => + buyers.includes(signer) ? (102942400n * 10n ** 18n) / nctPrice : 0n; for (let user of [deployer, buyer0, buyer1, buyer2, buyer3, buyer4, buyer5, nonBuyer]) { // verify that the claim manager returns the correct purchased amount for each user (some are buyers, some are not) - expect((await distributor.getPurchasedAmount(user.address)).toBigInt()).toEqual(boughtTokens(user)) + expect(await distributor.getPurchasedAmount(user.address)).toEqual(boughtTokens(user)); } // the distributor total must match - expect((await distributor.total()).toBigInt()).toEqual(totalBought) + expect(await distributor.total()).toEqual(totalBought); // nothing has been claimed - expect((await distributor.claimed()).toBigInt()).toEqual(0n) + expect(await distributor.claimed()).toEqual(0n); // how many tokens should each buyer receive? - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // no claims have been initialized yet! for (let buyer of buyers) { - const distributionRecord = await distributor.getDistributionRecord(buyer.address) + const distributionRecord = await distributor.getDistributionRecord(buyer.address); // not initialized yet - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // the total can be inferred from the sale - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) + expect(distributionRecord.total).toEqual(buyerTotal); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // TODO: allow voting prior to initialization // voting power must be zero prior to initialization - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n); + expect(await distributor.getVotes(buyer.address)).toEqual(0n); // does not yet hold tokens to claim - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(0n) + expect(await newToken.balanceOf(buyer.address)).toEqual(0n); } - }) + }); it("A buyer can claim without initialization", async () => { - const buyer = buyer0 - const distributor = partiallyVestedDistributor - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyer = buyer0; + const distributor = partiallyVestedDistributor; + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // only half of the tokens are claimable right now const currentlyClaimable = buyerTotal / 2n; - await distributor.claim(buyer.address) - let distributionRecord = await distributor.getDistributionRecord(buyer.address) + await distributor.claim(buyer.address); + let distributionRecord = await distributor.getDistributionRecord(buyer.address); // only half of the tokens are claimable right now - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) - + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); + // delegate to self - const myDistributor = await ethers.getContractAt("TrancheVestingSale_1_3", distributor.address, buyer); - await myDistributor.delegate(buyer.address) + const myDistributor = await ethers.getContractAt("TrancheVestingSale_1_3", distributor.target, buyer); + await myDistributor.delegate(buyer.address); // only one tranche has elapsed - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // voting power has decreased after claim - expectCloseEnough( - (await distributor.getVotes(buyer.address)).toBigInt(), - currentlyClaimable * votingFactorBips / 10000n, - 1n - ) + expectCloseEnough(await distributor.getVotes(buyer.address), (currentlyClaimable * votingFactorBips) / 10000n, 1n); // buyer now holds tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // the user cannot claim again for now - await expect( - distributor.claim(buyer.address) - ).rejects.toMatchObject( - { message: expect.stringMatching(/no more tokens claimable right now/) } - ) + await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // internal accounting hasn't changed - distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // token balance hasn't changed - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) - }) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); + }); it("A buyer can initialize without claiming", async () => { - const buyer = buyer1 - const distributor = partiallyVestedDistributor + const buyer = buyer1; + const distributor = partiallyVestedDistributor; - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); - await distributor.initializeDistributionRecord(buyer.address) - const distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + await distributor.initializeDistributionRecord(buyer.address); + const distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // delegate to self - const myDistributor = await ethers.getContractAt("TrancheVestingSale_1_3", distributor.address, buyer); - await myDistributor.delegate(buyer.address) + const myDistributor = await ethers.getContractAt("TrancheVestingSale_1_3", distributor.target, buyer); + await myDistributor.delegate(buyer.address); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // voting power available after initialization - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(buyerTotal * votingFactorBips / 10000n) + expect(await distributor.getVotes(buyer.address)).toEqual((buyerTotal * votingFactorBips) / 10000n); // buyer has not claimed tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(0n) - }) + expect(await newToken.balanceOf(buyer.address)).toEqual(0n); + }); it("A buyer can initialize and then claim", async () => { - const buyer = buyer2 - const distributor = partiallyVestedDistributor + const buyer = buyer2; + const distributor = partiallyVestedDistributor; - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // only half of the tokens are claimable right now const currentlyClaimable = buyerTotal / 2n; - await distributor.initializeDistributionRecord(buyer.address) - let distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + await distributor.initializeDistributionRecord(buyer.address); + let distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // delegate to self - const myDistributor = await ethers.getContractAt("TrancheVestingSale_1_3", distributor.address, buyer); - await myDistributor.delegate(buyer.address) + const myDistributor = await ethers.getContractAt("TrancheVestingSale_1_3", distributor.target, buyer); + await myDistributor.delegate(buyer.address); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // voting power available after initialization - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(buyerTotal * votingFactorBips / 10000n) + expect(await distributor.getVotes(buyer.address)).toEqual((buyerTotal * votingFactorBips) / 10000n); - await distributor.claim(buyer.address) - distributionRecord = await distributor.getDistributionRecord(buyer.address) + await distributor.claim(buyer.address); + distributionRecord = await distributor.getDistributionRecord(buyer.address); - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // voting power has decreased - expectCloseEnough( - (await distributor.getVotes(buyer.address)).toBigInt(), - currentlyClaimable * votingFactorBips / 10000n, - 1n - ) - + expectCloseEnough(await distributor.getVotes(buyer.address), (currentlyClaimable * votingFactorBips) / 10000n, 1n); // buyer now holds tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // the user cannot claim again for now - await expect( - distributor.claim(buyer.address) - ).rejects.toMatchObject( - { message: expect.stringMatching(/no more tokens claimable right now/) } - ) + await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // internal accounting hasn't changed - distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // token balance hasn't changed - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) - }) - + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); + }); it("non-participants in the sale cannot claim any tokens", async () => { - const user = nonBuyer - const distributor = partiallyVestedDistributor + const user = nonBuyer; + const distributor = partiallyVestedDistributor; - let distributionRecord = await distributor.getDistributionRecord(user.address) + let distributionRecord = await distributor.getDistributionRecord(user.address); // nothing to distribute - expect(distributionRecord.total.toBigInt()).toEqual(0n) + expect(distributionRecord.total).toEqual(0n); // nothing claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // no votes - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); // not initialized - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // user holds no tokens - expect((await newToken.balanceOf(user.address)).toBigInt()).toEqual(0n) + expect(await newToken.balanceOf(user.address)).toEqual(0n); // The user cannot initialize because they did not make any purchases - await expect( - distributor.initializeDistributionRecord(user.address) - ).rejects.toMatchObject({ message: expect.stringMatching(/no purchases found/) }) + await expect(distributor.initializeDistributionRecord(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no purchases found/), + }); // The user cannot claim because they did not make any purchases - await expect( - distributor.claim(user.address) - ).rejects.toMatchObject({ message: expect.stringMatching(/no purchases found/) }) + await expect(distributor.claim(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no purchases found/), + }); }); it("IMPORTANT: buyers can claim all tokens when all tranches have vested", async () => { - const distributor = fullyVestedDistributor + const distributor = fullyVestedDistributor; - const total = (await distributor.total()).toBigInt() - const userTotal = total / BigInt(buyers.length) + const total = await distributor.total(); + const userTotal = total / BigInt(buyers.length); for (let user of claimers) { // get the user's initial token balance - const initialBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const initialBalance = await newToken.balanceOf(user.address); // claim from the fully veseted distributor await distributor.claim(user.address); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const finalBalance = await newToken.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual(userTotal) + expect(distributionRecord.total).toEqual(userTotal); // everything has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(userTotal) + expect(distributionRecord.claimed).toEqual(userTotal); // the user's balance has increased by the correct amount - expect(finalBalance - initialBalance).toEqual(userTotal) + expect(finalBalance - initialBalance).toEqual(userTotal); // no votes remaining - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); } }); it("buyers cannot claim any tokens when no tranches have completed", async () => { - const distributor = unvestedDistributor + const distributor = unvestedDistributor; - const total = (await distributor.total()).toBigInt() - const userTotal = total / BigInt(buyers.length) + const total = await distributor.total(); + const userTotal = total / BigInt(buyers.length); for (let user of claimers) { // get the user's initial token balance - const initialBalance = (await newToken.balanceOf(user.address)).toBigInt(); - await expect( - distributor.claim(user.address) - ).rejects.toMatchObject( - { message: expect.stringMatching(/no more tokens claimable right now/) } - ) + const initialBalance = await newToken.balanceOf(user.address); + await expect(distributor.claim(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const finalBalance = await newToken.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual(userTotal) + expect(distributionRecord.total).toEqual(userTotal); // nothing has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // the user's token balance has not increased - expect(finalBalance - initialBalance).toEqual(0n) + expect(finalBalance - initialBalance).toEqual(0n); } // no tokens have been distributed from the unvested distributor - expect((await newToken.balanceOf(distributor.address)).toBigInt()).toEqual(total) + expect(await newToken.balanceOf(distributor.target)).toEqual(total); }); - // TODO: cannot set up invalid distributor tranches - it.skip("reverts on misconfiguration during deployment", async () => { + it("reverts on misconfiguration during deployment", async () => { // Cannot distribute a token with the wrong number of decimals await expect( DistributorFactory.deploy( - saleManager.address, + saleManager.target, publicSaleId, // this is the wrong token - it has 6 decimals instead of the required 18 - usdc.address, + usdc.target, [ { time: 1, vestedFraction: 5000 }, - { time: 2664826464, vestedFraction: 10000 } + { time: 2664826464, vestedFraction: 10000 }, ], 15000, - uri - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/token decimals do not match sale/) } - ) - - // Cannot set the sale to an invalid address - await expect( - DistributorFactory.deploy( - // this is not a valid sale address - deployer.address, - publicSaleId, - newToken.address, - [ - { time: 1, vestedFraction: 5000 }, - { time: 2664826464, vestedFraction: 10000 } - ], - 15000, - uri - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/Transaction reverted: function returned an unexpected amount of data/) } - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/token decimals do not match sale/) }); + + // // TODO: cannot set up invalid distributor tranches + // // Cannot set the sale to an invalid address + // await expect( + // DistributorFactory.deploy( + // // this is not a valid sale address + // deployer.address, + // publicSaleId, + // newToken.target, + // [ + // { time: 1, vestedFraction: 5000 }, + // { time: 2664826464, vestedFraction: 10000 } + // ], + // 15000, + // uri + // ) + // ).rejects.toMatchObject( + // { message: expect.stringMatching(/Transaction reverted: function returned an unexpected amount of data/) } + // ) // Cannot deploy with an invalid sale id await expect( DistributorFactory.deploy( - saleManager.address, + saleManager.target, // a random invalid sale id - '0xb1a5bda84b83f7f014abcf0cf69cab5a4de1c3ececa8123a5e4aaacb01f63f83', - newToken.address, + "0xb1a5bda84b83f7f014abcf0cf69cab5a4de1c3ececa8123a5e4aaacb01f63f83", + newToken.target, [ { time: 1, vestedFraction: 5000 }, - { time: 2664826464, vestedFraction: 10000 } + { time: 2664826464, vestedFraction: 10000 }, ], 15000, - uri - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/invalid sale id/) } - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/invalid sale id/) }); // Must vest all tokens await expect( DistributorFactory.deploy( - saleManager.address, + saleManager.target, publicSaleId, - newToken.address, + newToken.target, [ { time: 1, vestedFraction: 5000 }, // this is not quite all tokens! - { time: 2664826464, vestedFraction: 9999 } + { time: 2664826464, vestedFraction: 9999 }, ], 15000, - uri - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/last tranche must vest all tokens/) } - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/last tranche must vest all tokens/) }); // Tranche times must increase await expect( DistributorFactory.deploy( - saleManager.address, + saleManager.target, publicSaleId, - newToken.address, + newToken.target, [ { time: 1000, vestedFraction: 5000 }, // going backward in time -- oops - { time: 999, vestedFraction: 10000 } + { time: 999, vestedFraction: 10000 }, ], 15000, - uri - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/tranche time must increase/) } - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/tranche time must increase/) }); // Tranche vested fraction must increase await expect( DistributorFactory.deploy( - saleManager.address, + saleManager.target, publicSaleId, - newToken.address, + newToken.target, [ { time: 1, vestedFraction: 10000 }, // vested fraction is decreasing -- oops - { time: 2, vestedFraction: 5000 } + { time: 2, vestedFraction: 5000 }, ], 15000, - uri - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/tranche vested fraction must increase/) } - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/tranche vested fraction must increase/) }); }); - it('can only be deployed when the sale is closed', async () => { + it("can only be deployed when the sale is closed", async () => { // a public sale that is still open const openPublicSaleTx = await saleManager.newSale( recipient.address, @@ -592,41 +555,40 @@ describe("TrancheVestingSale_1_3", function () { 0, "ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/2", nctPrice.toString(), - 18 + 18, ); - const openPublicSaleId = await getSaleId(openPublicSaleTx) + const openPublicSaleId = await getSaleId(openPublicSaleTx); // make a purchase - const mySaleManager = await ethers.getContractAt("SaleManager_v_1_3", saleManager.address, buyer0); + const mySaleManager = await ethers.getContractAt("SaleManager_v_1_3", saleManager.target, buyer0); // buy with ETH - await mySaleManager.functions["buy(bytes32,bytes32[])"]( + await mySaleManager["buy(bytes32,bytes32[])"]( openPublicSaleId, // no merkle proof [], { - value: ethPaymentAmount - } + value: ethPaymentAmount, + }, ); - await expect(DistributorFactory.deploy( - saleManager.address, - openPublicSaleId, - newToken.address, - [ - { time: 1, vestedFraction: 5000 }, - { time: 2, vestedFraction: 10000 } - ], - 15000, - uri - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/TVS_1_3_D: sale not over/) } - ) + await expect( + DistributorFactory.deploy( + saleManager.target, + openPublicSaleId, + newToken.target, + [ + { time: 1, vestedFraction: 5000 }, + { time: 2, vestedFraction: 10000 }, + ], + 15000, + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/TVS_1_3_D: sale not over/) }); }); - it('total to distribute must be > 0', async () => { + it("total to distribute must be > 0", async () => { // a public sale that is still open const openPublicSaleTx = await saleManager.newSale( recipient.address, @@ -639,84 +601,76 @@ describe("TrancheVestingSale_1_3", function () { 0, "ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/2", nctPrice.toString(), - 18 + 18, ); - const openPublicSaleId = await getSaleId(openPublicSaleTx) + const openPublicSaleId = await getSaleId(openPublicSaleTx); - await expect(DistributorFactory.deploy( - saleManager.address, - openPublicSaleId, - newToken.address, - [ - { time: 1, vestedFraction: 5000 }, - { time: 2, vestedFraction: 10000 } - ], - 15000, - uri - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/Distributor: total is 0/) } - ) + await expect( + DistributorFactory.deploy( + saleManager.target, + openPublicSaleId, + newToken.target, + [ + { time: 1, vestedFraction: 5000 }, + { time: 2, vestedFraction: 10000 }, + ], + 15000, + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/Distributor: total is 0/) }); }); it("Handles negative adjustments to a user's total claimable amount", async () => { - const buyer = buyer4 - const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - + const buyer = buyer4; + const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + // adjust a buyer's allocation downward - await fullyVestedDistributor.initializeDistributionRecord(buyer.address) - await fullyVestedDistributor.adjust( - buyer.address, - -10000n - ) + await fullyVestedDistributor.initializeDistributionRecord(buyer.address); + await fullyVestedDistributor.adjust(buyer.address, -10000n); - const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - expect(newAllocation).toEqual(initialAllocation.sub(10000n)) + const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + expect(newAllocation).toEqual(initialAllocation - 10000n); // claim - await fullyVestedDistributor.connect(buyer).claim(buyer.address) - + await fullyVestedDistributor.connect(buyer).claim(buyer.address); + // check distributionRecord - const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address) - expect(distributionRecord.initialized).toBe(true) - expect (distributionRecord.total).toEqual(newAllocation) - expect(distributionRecord.claimed).toEqual(newAllocation) + const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address); + expect(distributionRecord.initialized).toBe(true); + expect(distributionRecord.total).toEqual(newAllocation); + expect(distributionRecord.claimed).toEqual(newAllocation); // check NCT balance - const balance = await newToken.balanceOf(buyer.address) - expect(balance).toEqual(newAllocation) - }) + const balance = await newToken.balanceOf(buyer.address); + expect(balance).toEqual(newAllocation); + }); it("Handles positive adjustments to a user's total claimable amount", async () => { - const buyer = buyer5 - const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - + const buyer = buyer5; + const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + // adjust a buyer's allocation upward - await fullyVestedDistributor.initializeDistributionRecord(buyer.address) - await fullyVestedDistributor.adjust( - buyer.address, - 10000n - ) - - - const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - expect(newAllocation).toEqual(initialAllocation.add(10000n)) - + await fullyVestedDistributor.initializeDistributionRecord(buyer.address); + await fullyVestedDistributor.adjust(buyer.address, 10000n); + + const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + expect(newAllocation).toEqual(initialAllocation + 10000n); + // transfer additional tokens to the distributor - await newToken.transfer(fullyVestedDistributor.address, 10000n) - + await newToken.transfer(fullyVestedDistributor.target, 10000n); + // claim - await fullyVestedDistributor.connect(buyer).claim(buyer.address) - + await fullyVestedDistributor.connect(buyer).claim(buyer.address); + // check distributionRecord - const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address) - expect(distributionRecord.initialized).toBe(true) - expect (distributionRecord.total).toEqual(newAllocation) - expect(distributionRecord.claimed).toEqual(newAllocation) + const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address); + expect(distributionRecord.initialized).toBe(true); + expect(distributionRecord.total).toEqual(newAllocation); + expect(distributionRecord.claimed).toEqual(newAllocation); // check NCT balance - const balance = await newToken.balanceOf(buyer.address) - expect(balance).toEqual(newAllocation) - }) + const balance = await newToken.balanceOf(buyer.address); + expect(balance).toEqual(newAllocation); + }); }); diff --git a/packages/hardhat/test/distributor/TrancheVestingSale_2_0_Distributor.test.ts b/packages/hardhat/test/distributor/TrancheVestingSale_2_0_Distributor.test.ts index 750dc1d8..4922f44a 100644 --- a/packages/hardhat/test/distributor/TrancheVestingSale_2_0_Distributor.test.ts +++ b/packages/hardhat/test/distributor/TrancheVestingSale_2_0_Distributor.test.ts @@ -1,40 +1,44 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { BigNumber } from "ethers"; -import hre from 'hardhat' -import { GenericERC20, FakeChainlinkOracle, TrancheVestingSale_2_0__factory, TrancheVestingSale_2_0, FlatPriceSale, FlatPriceSaleFactory } from "../../typechain-types"; +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import hre from "hardhat"; +import { + GenericERC20, + FakeChainlinkOracle, + TrancheVestingSale_2_0__factory, + TrancheVestingSale_2_0, + FlatPriceSale, + FlatPriceSaleFactory, +} from "../../typechain-types"; import { delay, lastBlockTime, getSaleAddress_2_0, makeMonthlyTranches, expectCloseEnough } from "../lib"; -import {merkleRoots, campaignCIDs} from '../../config' -import {buildIpfsUri} from '../../utils' +import { merkleRoots, campaignCIDs } from "../../config"; +import { buildIpfsUri } from "../../utils"; import { ConfigStruct } from "../../typechain-types/contracts/sale/v2/FlatPriceSale"; - -const ethers = (hre as any).ethers - +import { ethers } from "hardhat"; jest.setTimeout(30000); -let deployer: SignerWithAddress -let admin: SignerWithAddress -let recipient: SignerWithAddress -let buyer0: SignerWithAddress -let buyer1: SignerWithAddress -let buyer2: SignerWithAddress -let buyer3: SignerWithAddress -let buyer4: SignerWithAddress -let buyer5: SignerWithAddress -let buyers: SignerWithAddress[] -let claimers: SignerWithAddress[] -let nonBuyer: SignerWithAddress -let feeRecipient: SignerWithAddress -let config: ConfigStruct -let DistributorFactory: TrancheVestingSale_2_0__factory -let unvestedDistributor: TrancheVestingSale_2_0 -let partiallyVestedDistributor: TrancheVestingSale_2_0 -let fullyVestedDistributor: TrancheVestingSale_2_0 -let publicSaleId: string -let usdc: GenericERC20 -let newToken: GenericERC20 -let ethOracle: FakeChainlinkOracle -let usdcOracle: FakeChainlinkOracle +let deployer: SignerWithAddress; +let admin: SignerWithAddress; +let recipient: SignerWithAddress; +let buyer0: SignerWithAddress; +let buyer1: SignerWithAddress; +let buyer2: SignerWithAddress; +let buyer3: SignerWithAddress; +let buyer4: SignerWithAddress; +let buyer5: SignerWithAddress; +let buyers: SignerWithAddress[]; +let claimers: SignerWithAddress[]; +let nonBuyer: SignerWithAddress; +let feeRecipient: SignerWithAddress; +let config: ConfigStruct; +let DistributorFactory: TrancheVestingSale_2_0__factory; +let unvestedDistributor: TrancheVestingSale_2_0; +let partiallyVestedDistributor: TrancheVestingSale_2_0; +let fullyVestedDistributor: TrancheVestingSale_2_0; +let publicSaleId: string; +let usdc: GenericERC20; +let newToken: GenericERC20; +let ethOracle: FakeChainlinkOracle; +let usdcOracle: FakeChainlinkOracle; let saleImplementation: FlatPriceSale; let sale: FlatPriceSale; let saleFactory: FlatPriceSaleFactory; @@ -42,80 +46,74 @@ let saleFactory: FlatPriceSaleFactory; // $100 (6 decimals) const usdcPaymentAmount = 100000000n; // $2.9424 (18 decimals) -const ethPaymentAmount = ethers.utils.parseEther("0.001").toBigInt() +const ethPaymentAmount = ethers.parseEther("0.001"); // eth price of $2942.40/ETH -const ethPrice = 294240000000n +const ethPrice = 294240000000n; // usdc price of $1.001/USDC (8 decimals) -const usdcPrice = 101000000n - // $1.50 / NCT (8 decimals) -const nctPrice = 150000000n +const usdcPrice = 101000000n; +// $1.50 / NCT (8 decimals) +const nctPrice = 150000000n; const votingFactorBips = 15000n; // 1.5x -const uri = "https://example.com" +const uri = "https://example.com"; describe("TrancheVestingSale_2_0", function () { beforeAll(async () => { - [deployer, admin, recipient, buyer0, buyer1, buyer2, buyer3, buyer4, buyer5, nonBuyer, feeRecipient ] = await ethers.getSigners(); + [deployer, admin, recipient, buyer0, buyer1, buyer2, buyer3, buyer4, buyer5, nonBuyer, feeRecipient] = + await ethers.getSigners(); // make a couple purchases as various users. - buyers = [buyer0, buyer1, buyer2, buyer3, buyer4, buyer5] - claimers = [buyer0, buyer1, buyer2, buyer3] - + buyers = [buyer0, buyer1, buyer2, buyer3, buyer4, buyer5]; + claimers = [buyer0, buyer1, buyer2, buyer3]; + // a payment token (USDC) const GenericERC20Factory = await ethers.getContractFactory("GenericERC20", deployer); - usdc = await GenericERC20Factory.deploy( - "US Dollar Coin", - "USDC", - 6, - "1000000000000000" - ) as GenericERC20; + usdc = (await GenericERC20Factory.deploy("US Dollar Coin", "USDC", 6, "1000000000000000")) as GenericERC20; // transfer tokens to buyers for (let signer of buyers) { - await usdc.transfer(signer.address, usdcPaymentAmount) + await usdc.transfer(signer.address, usdcPaymentAmount); } const ChainlinkOracleFactory = await ethers.getContractFactory("FakeChainlinkOracle", deployer); // a chainlink oracle for ETH/USD - ethOracle = await ChainlinkOracleFactory.deploy( + ethOracle = (await ChainlinkOracleFactory.deploy( ethPrice, // oracle description - "ETH/USD" - ) as FakeChainlinkOracle; + "ETH/USD", + )) as FakeChainlinkOracle; // a chainlink oracle for USDC/USD - usdcOracle = await ChainlinkOracleFactory.deploy( + usdcOracle = (await ChainlinkOracleFactory.deploy( usdcPrice, // oracle description - "ETH/USD" - ) as FakeChainlinkOracle; + "ETH/USD", + )) as FakeChainlinkOracle; // a token to claim - newToken = await GenericERC20Factory.deploy( + newToken = (await GenericERC20Factory.deploy( "Neue Crypto Token", "NCT", 18, // 1B tokens // (10n ** 9n * 10n ** 18n).toString() - '1000000000000000000000000000' - ) as GenericERC20; + "1000000000000000000000000000", + )) as GenericERC20; // create an implementation contract const SaleImplementationFactory = await ethers.getContractFactory("FlatPriceSale", admin); - - saleImplementation = await SaleImplementationFactory.deploy( + + saleImplementation = (await SaleImplementationFactory.deploy( // fee bips 250, // fee recipient - feeRecipient.address - ) as FlatPriceSale; + feeRecipient.address, + )) as FlatPriceSale; // create a sale const SaleFactoryFactory = await ethers.getContractFactory("FlatPriceSaleFactory", admin); - saleFactory = await SaleFactoryFactory.deploy( - saleImplementation.address - ) as FlatPriceSaleFactory; + saleFactory = (await SaleFactoryFactory.deploy(saleImplementation.target)) as FlatPriceSaleFactory; config = { // recipient of sale proceeds @@ -135,70 +133,67 @@ describe("TrancheVestingSale_2_0", function () { endTime: Math.floor(new Date(new Date().getTime() + 10 * 24 * 3600 * 1000).getTime() / 1000), // max queue time 1 hour maxQueueTime: 0, - URI: buildIpfsUri(campaignCIDs.basicSale) - } + URI: buildIpfsUri(campaignCIDs.basicSale), + }; const publicSaleTx = await saleFactory.newSale( deployer.address, config, // base currency - 'USD', + "USD", // native payments enabled true, // native price oracle - ethOracle.address, + ethOracle.target, // payment tokens - [usdc.address], + [usdc.target], // payment token price oracles - [usdcOracle.address], + [usdcOracle.target], // payment token decimals - [6] - ) - + [6], + ); const address = await getSaleAddress_2_0(publicSaleTx); sale = await ethers.getContractAt("FlatPriceSale", address, deployer); for (let buyer of buyers) { - const mySale = await ethers.getContractAt("FlatPriceSale", sale.address, buyer); - const myUSDC = await ethers.getContractAt("GenericERC20", usdc.address, buyer); - - await myUSDC.approve( - mySale.address, - usdcPaymentAmount - ); - + const mySale = await ethers.getContractAt("FlatPriceSale", sale.target, buyer); + const myUSDC = await ethers.getContractAt("GenericERC20", usdc.target, buyer); + + await myUSDC.approve(mySale.target, usdcPaymentAmount); + // buy with USDC await mySale.buyWithToken( - usdc.address, + usdc.target, usdcPaymentAmount, // no data - '0x', + "0x", // no merkle proof - [] + [], ); - + // buy with ETH await mySale.buyWithNative( // no data - '0x', + "0x", // no merkle proof [], { - value: ethPaymentAmount - } + value: ethPaymentAmount, + }, ); } // find an end time barely in the future - const endTime = await lastBlockTime() + 4n + const endTime = (await lastBlockTime()) + 4n; // change the sale end time await sale.update({ - ...config, endTime + ...config, + endTime, }); - if (await lastBlockTime() < endTime) { + if ((await lastBlockTime()) < endTime) { // delay a bit more await delay(4000); } @@ -208,572 +203,550 @@ describe("TrancheVestingSale_2_0", function () { // deploy another distributor with a distribution schedule that is in the past partiallyVestedDistributor = await DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, [ // 10% of tokens vested a very long time ago - {time: 1, vestedFraction: 1000}, + { time: 1, vestedFraction: 1000 }, // 50% of tokens have already vested - {time: 1665188605, vestedFraction: 5000}, + { time: 1665188605, vestedFraction: 5000 }, // 50% of tokens vest in the future - {time: 2664826464, vestedFraction: 10000} + { time: 2664826464, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri + uri, ); - + fullyVestedDistributor = await DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, [ // 10% of tokens vest at each time - {time: 1, vestedFraction: 1000}, - {time: 2, vestedFraction: 2000}, - {time: 3, vestedFraction: 3000}, - {time: 4, vestedFraction: 4000}, - {time: 5, vestedFraction: 5000}, - {time: 6, vestedFraction: 6000}, - {time: 7, vestedFraction: 7000}, - {time: 8, vestedFraction: 8000}, - {time: 9, vestedFraction: 9000}, - {time: 10, vestedFraction: 10000} + { time: 1, vestedFraction: 1000 }, + { time: 2, vestedFraction: 2000 }, + { time: 3, vestedFraction: 3000 }, + { time: 4, vestedFraction: 4000 }, + { time: 5, vestedFraction: 5000 }, + { time: 6, vestedFraction: 6000 }, + { time: 7, vestedFraction: 7000 }, + { time: 8, vestedFraction: 8000 }, + { time: 9, vestedFraction: 9000 }, + { time: 10, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri + uri, ); unvestedDistributor = await DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, [ // no tokens have vested yet - {time: 4000000000, vestedFraction: 10000} + { time: 4000000000, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri + uri, ); - + // transfer tokens to the distributors (we are testing 3 distributors, in practice a sale would use one!) - await newToken.transfer(partiallyVestedDistributor.address, await partiallyVestedDistributor.total()) - await newToken.transfer(unvestedDistributor.address, await unvestedDistributor.total()) - await newToken.transfer(fullyVestedDistributor.address, await fullyVestedDistributor.total()) - + await newToken.transfer(partiallyVestedDistributor.target, await partiallyVestedDistributor.total()); + await newToken.transfer(unvestedDistributor.target, await unvestedDistributor.total()); + await newToken.transfer(fullyVestedDistributor.target, await fullyVestedDistributor.total()); + // register at least one of the distributors as a test - await sale.registerDistributor(partiallyVestedDistributor.address) + await sale.registerDistributor(partiallyVestedDistributor.target); }); it("Metadata is correct", async () => { const distributor = partiallyVestedDistributor; - expect(await distributor.NAME()).toEqual("TrancheVestingSale_2_0") - expect(await distributor.VERSION() >= BigNumber.from(1)) - expect(await distributor.uri()).toEqual(uri) - }) + expect(await distributor.NAME()).toEqual("TrancheVestingSale_2_0"); + expect((await distributor.VERSION()) >= 1); + expect(await distributor.uri()).toEqual(uri); + }); it("Initial setup matches sale correctly", async () => { const distributor = partiallyVestedDistributor; - expect(await distributor.sale()).toEqual(sale.address) - expect((await distributor.price()).toBigInt()).toEqual(nctPrice) - expect(await distributor.decimals()).toEqual(await newToken.decimals()) - expect(await distributor.token()).toEqual(newToken.address) + expect(await distributor.sale()).toEqual(sale.target); + expect(await distributor.price()).toEqual(nctPrice); + expect(await distributor.decimals()).toEqual(await newToken.decimals()); + expect(await distributor.token()).toEqual(newToken.target); // each buyer spent $2.9424 of ETH and $101 of USDC each: this is 100000000 + 2942400 = $102.9424 USD each (8 decimals) - const spentPerBuyer = 10394240000n + const spentPerBuyer = 10394240000n; // verify the sale is storing the data we expect // (the v2.0 sale records purchases denominated with 8 decimals) - const totalSpent = (await sale.total()).toBigInt() + const totalSpent = await sale.total(); expect(totalSpent).toEqual(BigInt(buyers.length) * spentPerBuyer); // verify the sale has the right spent value for a user - expect((await sale.buyerTotal(buyer0.address)).toBigInt()).toEqual(spentPerBuyer) + expect(await sale.buyerTotal(buyer0.address)).toEqual(spentPerBuyer); // convert from $103.9424 of USD (8 decimals) to NCT (18 decimals) at a price of $1.50 per NCT (8 decimals) - const boughtPerBuyer = spentPerBuyer * 10n ** 18n / nctPrice + const boughtPerBuyer = (spentPerBuyer * 10n ** 18n) / nctPrice; // the distributor itself doesn't care what was spent - it only cares what was bought - const boughtTokens = (signer) => buyers.includes(signer) - // participated in the sale - ? boughtPerBuyer - // did not participate in the sale - : 0n - + const boughtTokens = (signer: any) => + buyers.includes(signer) + ? // participated in the sale + boughtPerBuyer + : // did not participate in the sale + 0n; + // verify that the claim manager returns the correct purchased amount for each user (some are buyers, some are not) for (let user of [deployer, buyer0, buyer1, buyer2, buyer3, nonBuyer]) { - expect((await distributor.getPurchasedAmount(user.address)).toBigInt()).toEqual(boughtTokens(user)) + expect(await distributor.getPurchasedAmount(user.address)).toEqual(boughtTokens(user)); } - + // the distributor total must match (note the adjustment for rounding error) - expect((await distributor.total()).toBigInt()).toEqual(BigInt(buyers.length) * boughtPerBuyer + 2n) + expect(await distributor.total()).toEqual(BigInt(buyers.length) * boughtPerBuyer + 2n); // nothing has been claimed - expect((await distributor.claimed()).toBigInt()).toEqual(0n) + expect(await distributor.claimed()).toEqual(0n); // how many tokens should each buyer receive? - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // no claims have been initialized yet! for (let buyer of buyers) { - const distributionRecord = await distributor.getDistributionRecord(buyer.address) + const distributionRecord = await distributor.getDistributionRecord(buyer.address); // not initialized yet - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // the total can be inferred from the sale - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) + expect(distributionRecord.total).toEqual(buyerTotal); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // TODO: allow voting prior to initialization // voting power must be zero prior to initialization - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(0n); + expect(await distributor.getVotes(buyer.address)).toEqual(0n); // does not yet hold tokens to claim - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(0n) + expect(await newToken.balanceOf(buyer.address)).toEqual(0n); } - }) + }); it("A buyer can claim without initialization", async () => { - const buyer = buyer0 - const distributor = partiallyVestedDistributor - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyer = buyer0; + const distributor = partiallyVestedDistributor; + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // only half of the tokens are claimable right now const currentlyClaimable = buyerTotal / 2n; - - await distributor.claim(buyer.address) - let distributionRecord = await distributor.getDistributionRecord(buyer.address) + + await distributor.claim(buyer.address); + let distributionRecord = await distributor.getDistributionRecord(buyer.address); // only half of the tokens are claimable right now - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // only one tranche has elapsed - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // delegate to self - const myDistributor = await ethers.getContractAt("ContinuousVestingMerkle", distributor.address, buyer); - await myDistributor.delegate(buyer.address) - + const myDistributor = await ethers.getContractAt("ContinuousVestingMerkle", distributor.target, buyer); + await myDistributor.delegate(buyer.address); + // voting power has decreased after claim (within rounding error) expectCloseEnough( - (await distributor.getVotes(buyer.address)).toBigInt(), - (buyerTotal - currentlyClaimable) * votingFactorBips / 10000n, - 1n - ) + await distributor.getVotes(buyer.address), + ((buyerTotal - currentlyClaimable) * votingFactorBips) / 10000n, + 1n, + ); // buyer now holds tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // the user cannot claim again for now - await expect( - distributor.claim(buyer.address) - ).rejects.toMatchObject( - {message: expect.stringMatching(/no more tokens claimable right now/)} - ) + await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // internal accounting hasn't changed - distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // token balance hasn't changed - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) - }) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); + }); it("A buyer can initialize without claiming", async () => { - const buyer = buyer1 - const distributor = partiallyVestedDistributor + const buyer = buyer1; + const distributor = partiallyVestedDistributor; - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); const currentlyClaimable = buyerTotal / 2n; // getClaimableAmount() works prior to initialization - expect((await distributor.getClaimableAmount(buyer.address)).toBigInt()).toEqual(currentlyClaimable) - - await distributor.initializeDistributionRecord(buyer.address) - const distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + expect(await distributor.getClaimableAmount(buyer.address, "0x")).toEqual(currentlyClaimable); + + await distributor.initializeDistributionRecord(buyer.address); + const distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // getClaimableAmount() works after initialization - expect((await distributor.getClaimableAmount(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await distributor.getClaimableAmount(buyer.address, "0x")).toEqual(currentlyClaimable); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // delegate to self - const myDistributor = await ethers.getContractAt("ContinuousVestingMerkle", distributor.address, buyer); - await myDistributor.delegate(buyer.address) + const myDistributor = await ethers.getContractAt("ContinuousVestingMerkle", distributor.target, buyer); + await myDistributor.delegate(buyer.address); // voting power available after initialization - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(buyerTotal * votingFactorBips / 10000n) + expect(await distributor.getVotes(buyer.address)).toEqual((buyerTotal * votingFactorBips) / 10000n); // buyer has not claimed tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(0n) - }) + expect(await newToken.balanceOf(buyer.address)).toEqual(0n); + }); it("A buyer can initialize and then claim", async () => { - const buyer = buyer2 - const distributor = partiallyVestedDistributor + const buyer = buyer2; + const distributor = partiallyVestedDistributor; - const buyerTotal = (await distributor.total()).toBigInt() / BigInt(buyers.length) + const buyerTotal = (await distributor.total()) / BigInt(buyers.length); // only half of the tokens are claimable right now const currentlyClaimable = buyerTotal / 2n; // getClaimableAmount() works prior to initialization - expect((await distributor.getClaimableAmount(buyer.address)).toBigInt()).toEqual(currentlyClaimable) - - await distributor.initializeDistributionRecord(buyer.address) - let distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.total.toBigInt()).toEqual(buyerTotal) - expect(distributionRecord.initialized).toEqual(true) + expect(await distributor.getClaimableAmount(buyer.address, "0x")).toEqual(currentlyClaimable); + + await distributor.initializeDistributionRecord(buyer.address); + let distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.total).toEqual(buyerTotal); + expect(distributionRecord.initialized).toEqual(true); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // delegate to self - const myDistributor = await ethers.getContractAt("ContinuousVestingMerkle", distributor.address, buyer); - await myDistributor.delegate(buyer.address) - + const myDistributor = await ethers.getContractAt("ContinuousVestingMerkle", distributor.target, buyer); + await myDistributor.delegate(buyer.address); + // voting power available after initialization - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(buyerTotal * votingFactorBips / 10000n) + expect(await distributor.getVotes(buyer.address)).toEqual((buyerTotal * votingFactorBips) / 10000n); - await distributor.claim(buyer.address) - distributionRecord = await distributor.getDistributionRecord(buyer.address) + await distributor.claim(buyer.address); + distributionRecord = await distributor.getDistributionRecord(buyer.address); - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // voting power has decreased (note the adjustment for rounding error) - expect((await distributor.getVotes(buyer.address)).toBigInt()).toEqual(currentlyClaimable * votingFactorBips / 10000n + 1n) + expect(await distributor.getVotes(buyer.address)).toEqual((currentlyClaimable * votingFactorBips) / 10000n + 1n); // buyer now holds tokens - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); // the user cannot claim again for now - await expect( - distributor.claim(buyer.address) - ).rejects.toMatchObject( - {message: expect.stringMatching(/no more tokens claimable right now/)} - ) + await expect(distributor.claim(buyer.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // internal accounting hasn't changed - distributionRecord = await distributor.getDistributionRecord(buyer.address) - expect(distributionRecord.claimed.toBigInt()).toEqual(currentlyClaimable) + distributionRecord = await distributor.getDistributionRecord(buyer.address); + expect(distributionRecord.claimed).toEqual(currentlyClaimable); // token balance hasn't changed - expect((await newToken.balanceOf(buyer.address)).toBigInt()).toEqual(currentlyClaimable) - }) + expect(await newToken.balanceOf(buyer.address)).toEqual(currentlyClaimable); + }); it("non-participants in the sale cannot claim any tokens", async () => { - const user = nonBuyer - const distributor = partiallyVestedDistributor - - let distributionRecord = await distributor.getDistributionRecord(user.address) + const user = nonBuyer; + const distributor = partiallyVestedDistributor; + + let distributionRecord = await distributor.getDistributionRecord(user.address); // nothing to distribute - expect(distributionRecord.total.toBigInt()).toEqual(0n) + expect(distributionRecord.total).toEqual(0n); // nothing claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // no votes - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); // not initialized - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // user holds no tokens - expect((await newToken.balanceOf(user.address)).toBigInt()).toEqual(0n) + expect(await newToken.balanceOf(user.address)).toEqual(0n); // The user cannot initialize because they did not make any purchases - await expect( - distributor.initializeDistributionRecord(user.address) - ).rejects.toMatchObject({message: expect.stringMatching(/no purchases found/)}) + await expect(distributor.initializeDistributionRecord(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no purchases found/), + }); // The user cannot claim because they did not make any purchases - await expect( - distributor.claim(user.address) - ).rejects.toMatchObject({message: expect.stringMatching(/no purchases found/)}) + await expect(distributor.claim(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no purchases found/), + }); }); it("IMPORTANT: buyers can claim all tokens when all tranches have vested", async () => { - const distributor = fullyVestedDistributor - - const total = (await distributor.total()).toBigInt() - const userTotal = total / BigInt(buyers.length) + const distributor = fullyVestedDistributor; + + const total = await distributor.total(); + const userTotal = total / BigInt(buyers.length); for (let user of claimers) { // get the user's initial token balance - const initialBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const initialBalance = await newToken.balanceOf(user.address); // claim from the fully veseted distributor await distributor.claim(user.address); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const finalBalance = await newToken.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual(userTotal) + expect(distributionRecord.total).toEqual(userTotal); // everything has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(userTotal) + expect(distributionRecord.claimed).toEqual(userTotal); // the user's balance has increased by the correct amount - expect(finalBalance - initialBalance).toEqual(userTotal) + expect(finalBalance - initialBalance).toEqual(userTotal); // no votes remaining - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); } }); it("buyers cannot claim any tokens when no tranches have completed", async () => { - const distributor = unvestedDistributor + const distributor = unvestedDistributor; - const total = (await distributor.total()).toBigInt() - const userTotal = total / BigInt(buyers.length) + const total = await distributor.total(); + const userTotal = total / BigInt(buyers.length); for (let user of claimers) { // get the user's initial token balance - const initialBalance = (await newToken.balanceOf(user.address)).toBigInt(); - await expect( - distributor.claim(user.address) - ).rejects.toMatchObject( - {message: expect.stringMatching(/no more tokens claimable right now/)} - ) + const initialBalance = await newToken.balanceOf(user.address); + await expect(distributor.claim(user.address)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await newToken.balanceOf(user.address)).toBigInt(); + const finalBalance = await newToken.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual(userTotal) + expect(distributionRecord.total).toEqual(userTotal); // nothing has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // the user's token balance has not increased - expect(finalBalance - initialBalance).toEqual(0n) + expect(finalBalance - initialBalance).toEqual(0n); } // no tokens have been distributed from the unvested distributor - expect((await newToken.balanceOf(distributor.address)).toBigInt()).toEqual(total) + expect(await newToken.balanceOf(distributor.target)).toEqual(total); }); - // TODO: why does error message not match? - it.skip("reverts on misconfiguration during deployment", async () => { - // Cannot set the sale to an invalid address - await expect( - DistributorFactory.deploy( - deployer.address, - newToken.address, - await newToken.decimals(), - nctPrice, - [ - // no tokens have vested yet - {time: 4000000000, vestedFraction: 10000} - ], - // a 1.5x voting factor - 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/Transaction reverted: function returned an unexpected amount of data/)} - ) + it("reverts on misconfiguration during deployment", async () => { + // // TODO: why does error message not match? + // // Cannot set the sale to an invalid address + // await expect( + // DistributorFactory.deploy( + // deployer.address, + // newToken.target, + // await newToken.decimals(), + // nctPrice, + // [ + // // no tokens have vested yet + // {time: 4000000000, vestedFraction: 10000} + // ], + // // a 1.5x voting factor + // 15000, + // uri + // ) + // ).rejects.toMatchObject( + // {message: expect.stringMatching(/Transaction reverted: function returned an unexpected amount of data/)} + // ) // Must vest all tokens await expect( DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, [ - {time: 1, vestedFraction: 5000}, + { time: 1, vestedFraction: 5000 }, // this is not quite all tokens! - {time: 2664826464, vestedFraction: 9999} + { time: 2664826464, vestedFraction: 9999 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/last tranche must vest all tokens/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/last tranche must vest all tokens/) }); // Tranche times must increase await expect( DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, [ - {time: 1000, vestedFraction: 5000}, + { time: 1000, vestedFraction: 5000 }, // going backward in time -- oops - {time: 999, vestedFraction: 10000} + { time: 999, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/tranche time must increase/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/tranche time must increase/) }); // Tranche vested fraction must increase await expect( DistributorFactory.deploy( - sale.address, - newToken.address, + sale.target, + newToken.target, await newToken.decimals(), nctPrice, [ - {time: 1, vestedFraction: 10000}, + { time: 1, vestedFraction: 10000 }, // vested fraction is decreasing -- oops - {time: 2, vestedFraction: 5000} + { time: 2, vestedFraction: 5000 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/tranche vested fraction must increase/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/tranche vested fraction must increase/) }); }); - it('can only be deployed when the sale is closed', async () => { + it("can only be deployed when the sale is closed", async () => { const openPublicSaleTx = await saleFactory.newSale( deployer.address, config, // base currency - 'USD', + "USD", // native payments enabled true, // native price oracle - ethOracle.address, + ethOracle.target, // payment tokens - [usdc.address], + [usdc.target], // payment token price oracles - [usdcOracle.address], + [usdcOracle.target], // payment token decimals - [6] - ) - - const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx) + [6], + ); + + const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx); const openSale = await ethers.getContractAt("FlatPriceSale", openSaleAddress, deployer); // make a purchase - const mySale = await ethers.getContractAt("FlatPriceSale", openSale.address, buyer0); + const mySale = await ethers.getContractAt("FlatPriceSale", openSale.target, buyer0); // buy with ETH await mySale.buyWithNative( // no data - '0x', + "0x", // no merkle proof [], { - value: ethPaymentAmount - } + value: ethPaymentAmount, + }, ); await expect( DistributorFactory.deploy( - openSale.address, - newToken.address, + openSale.target, + newToken.target, await newToken.decimals(), nctPrice, [ // 10% of tokens vest at each time - {time: 1, vestedFraction: 10000} + { time: 1, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/TVS_2_0_D: sale not over/)} - ) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/TVS_2_0_D: sale not over/) }); }); - it('total to distribute must be > 0', async () => { + it("total to distribute must be > 0", async () => { const openPublicSaleTx = await saleFactory.newSale( deployer.address, config, // base currency - 'USD', + "USD", // native payments enabled true, // native price oracle - ethOracle.address, + ethOracle.target, // payment tokens - [usdc.address], + [usdc.target], // payment token price oracles - [usdcOracle.address], + [usdcOracle.target], // payment token decimals - [6] - ) + [6], + ); - const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx) + const openSaleAddress = await getSaleAddress_2_0(openPublicSaleTx); await expect( DistributorFactory.deploy( openSaleAddress, - newToken.address, + newToken.target, await newToken.decimals(), nctPrice, [ // 10% of tokens vest at each time - {time: 1, vestedFraction: 10000} + { time: 1, vestedFraction: 10000 }, ], // a 1.5x voting factor 15000, - uri - ) - ).rejects.toMatchObject( - {message: expect.stringMatching(/Distributor: total is 0/)} - ) - }) + uri, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/Distributor: total is 0/) }); + }); it("Handles negative adjustments to a user's total claimable amount", async () => { - const buyer = buyer4 - const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - + const buyer = buyer4; + const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + // adjust a buyer's allocation downward - await fullyVestedDistributor.initializeDistributionRecord(buyer.address) - await fullyVestedDistributor.adjust( - buyer.address, - -10000n - ) + await fullyVestedDistributor.initializeDistributionRecord(buyer.address); + await fullyVestedDistributor.adjust(buyer.address, -10000n); - const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - expect(newAllocation).toEqual(initialAllocation.sub(10000n)) + const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + expect(newAllocation).toEqual(initialAllocation - 10000n); // claim - await fullyVestedDistributor.connect(buyer).claim(buyer.address) - + await fullyVestedDistributor.connect(buyer).claim(buyer.address); + // check distributionRecord - const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address) - expect(distributionRecord.initialized).toBe(true) - expect (distributionRecord.total).toEqual(newAllocation) - expect(distributionRecord.claimed).toEqual(newAllocation) + const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address); + expect(distributionRecord.initialized).toBe(true); + expect(distributionRecord.total).toEqual(newAllocation); + expect(distributionRecord.claimed).toEqual(newAllocation); // check NCT balance - const balance = await newToken.balanceOf(buyer.address) - expect(balance).toEqual(newAllocation) - }) + const balance = await newToken.balanceOf(buyer.address); + expect(balance).toEqual(newAllocation); + }); it("Handles positive adjustments to a user's total claimable amount", async () => { - const buyer = buyer5 - const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - + const buyer = buyer5; + const initialAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + // adjust a buyer's allocation upward - await fullyVestedDistributor.initializeDistributionRecord(buyer.address) - await fullyVestedDistributor.adjust( - buyer.address, - 10000n - ) - - - const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address) - expect(newAllocation).toEqual(initialAllocation.add(10000n)) - + await fullyVestedDistributor.initializeDistributionRecord(buyer.address); + await fullyVestedDistributor.adjust(buyer.address, 10000n); + + const newAllocation = await fullyVestedDistributor.getClaimableAmount(buyer.address, "0x"); + expect(newAllocation).toEqual(initialAllocation + 10000n); + // transfer additional tokens to the distributor - await newToken.transfer(fullyVestedDistributor.address, 10000n) - + await newToken.transfer(fullyVestedDistributor.target, 10000n); + // claim - await fullyVestedDistributor.connect(buyer).claim(buyer.address) - + await fullyVestedDistributor.connect(buyer).claim(buyer.address); + // check distributionRecord - const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address) - expect(distributionRecord.initialized).toBe(true) - expect (distributionRecord.total).toEqual(newAllocation) - expect(distributionRecord.claimed).toEqual(newAllocation) + const distributionRecord = await fullyVestedDistributor.getDistributionRecord(buyer.address); + expect(distributionRecord.initialized).toBe(true); + expect(distributionRecord.total).toEqual(newAllocation); + expect(distributionRecord.claimed).toEqual(newAllocation); // check NCT balance - const balance = await newToken.balanceOf(buyer.address) - expect(balance).toEqual(newAllocation) - }) + const balance = await newToken.balanceOf(buyer.address); + expect(balance).toEqual(newAllocation); + }); }); diff --git a/packages/hardhat/test/distributor/continuousVestingMerkle.test.ts b/packages/hardhat/test/distributor/continuousVestingMerkle.test.ts index 89bfe403..d2a5bb2a 100644 --- a/packages/hardhat/test/distributor/continuousVestingMerkle.test.ts +++ b/packages/hardhat/test/distributor/continuousVestingMerkle.test.ts @@ -1,133 +1,126 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { BigNumber } from "ethers"; -import hre from 'hardhat' +import { SignerWithAddress } from "@nomicfoundation/hardhat-ethers/signers"; +import hre from "hardhat"; import { GenericERC20, ContinuousVestingMerkle__factory, ContinuousVestingMerkle } from "../../typechain-types"; import { delay, expectCloseEnough } from "../lib"; -import { merkleRoots, campaignCIDs } from '../../config' -import { buildIpfsUri } from '../../utils' import { time } from "@nomicfoundation/hardhat-network-helpers"; -const ethers = (hre as any).ethers +const ethers = (hre as any).ethers; jest.setTimeout(30000); -let deployer: SignerWithAddress // 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 -let eligible1: SignerWithAddress // 0x70997970c51812dc3a010c7d01b50e0d17dc79c8 -let eligible2: SignerWithAddress // 0x90F79bf6EB2c4f870365E785982E1f101E93b906 -let ineligible: SignerWithAddress // 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC -let token: GenericERC20 -let DistributorFactory: ContinuousVestingMerkle__factory -let unvestedDistributor: ContinuousVestingMerkle -let partiallyVestedDistributor: ContinuousVestingMerkle -let fullyVestedDistributor: ContinuousVestingMerkle -let unvestedTimes: [bigint, bigint, bigint] -let partiallyVestedTimes: [bigint, bigint, bigint] -let fullyVestedTimes: [bigint, bigint, bigint] +let deployer: SignerWithAddress; // 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 +let eligible1: SignerWithAddress; // 0x70997970c51812dc3a010c7d01b50e0d17dc79c8 +let eligible2: SignerWithAddress; // 0x90F79bf6EB2c4f870365E785982E1f101E93b906 +let ineligible: SignerWithAddress; // 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC +let token: GenericERC20; +let DistributorFactory: ContinuousVestingMerkle__factory; +let unvestedDistributor: ContinuousVestingMerkle; +let partiallyVestedDistributor: ContinuousVestingMerkle; +let fullyVestedDistributor: ContinuousVestingMerkle; +let unvestedTimes: [bigint, bigint, bigint]; +let partiallyVestedTimes: [bigint, bigint, bigint]; +let fullyVestedTimes: [bigint, bigint, bigint]; type Config = { - total: bigint - uri: string - votingFactor: bigint + total: bigint; + uri: string; + votingFactor: bigint; proof: { - merkleRoot: string + merkleRoot: string; claims: { [k: string]: { - proof: string[], + proof: string[]; data: { - name: string - type: string - value: string - }[] - } - } - } -} + name: string; + type: string; + value: string; + }[]; + }; + }; + }; +}; // distribute a million tokens in total const config: Config = { // 1 million tokens total: 7500000000000000000000n, // any string will work for these unit tests - the uri is not used on-chain - uri: 'https://example.com', + uri: "https://example.com", // 2x, denominated in fractionDenominator of 1e18 votingFactor: 2n * 10n ** 18n, // created using yarn generate-merkle-root proof: { - "merkleRoot": "0x7bc676cc9d8db1f8fa03ca95e63b062cc08d8c0bfbdf5a0f18c3b9aadb66555e", - "claims": { + merkleRoot: "0x7bc676cc9d8db1f8fa03ca95e63b062cc08d8c0bfbdf5a0f18c3b9aadb66555e", + claims: { // eligible1 "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": { - "proof": [ - "0xc8055cac33ef83d8876a5f8eeb53a54b23b84ef8eeea1cd116d15d78cdf24993" - ], - "data": [ + proof: ["0xc8055cac33ef83d8876a5f8eeb53a54b23b84ef8eeea1cd116d15d78cdf24993"], + data: [ { - "name": "index", - "type": "uint256", - "value": '0' + name: "index", + type: "uint256", + value: "0", }, { - "name": "beneficiary", - "type": "address", - "value": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" + name: "beneficiary", + type: "address", + value: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", }, { - "name": "amount", - "type": "uint256", - "value": "5000000000000000000000" - } - ] + name: "amount", + type: "uint256", + value: "5000000000000000000000", + }, + ], }, // eligible2 "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC": { - "proof": [ - "0xa82f515a479cbe664b37f89b05d1e13886cae562847741b55442ff8d9df08993" - ], - "data": [ + proof: ["0xa82f515a479cbe664b37f89b05d1e13886cae562847741b55442ff8d9df08993"], + data: [ { - "name": "index", - "type": "uint256", - "value": '1' + name: "index", + type: "uint256", + value: "1", }, { - "name": "beneficiary", - "type": "address", - "value": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC" + name: "beneficiary", + type: "address", + value: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", }, { - "name": "amount", - "type": "uint256", - "value": "2500000000000000000000" - } - ] + name: "amount", + type: "uint256", + value: "2500000000000000000000", + }, + ], }, - } - } -} + }, + }, +}; const estimateClaimableTokens = (now: bigint, start: bigint, cliff: bigint, end: bigint, total: bigint) => { if (now < start || now < cliff) { - return 0n + return 0n; } if (now > end) { - return total + return total; } - return total * (now - start) / (end - start) -} + return (total * (now - start)) / (end - start); +}; describe("ContinuousVestingMerkle", function () { beforeAll(async () => { [deployer, eligible1, eligible2, ineligible] = await ethers.getSigners(); const GenericERC20Factory = await ethers.getContractFactory("GenericERC20", deployer); - token = await GenericERC20Factory.deploy( + token = (await GenericERC20Factory.deploy( "Neue Crypto Token", "NCT", 18, // 1B tokens - (10n ** 9n * 10n ** 18n).toString() - ) as GenericERC20 + (10n ** 9n * 10n ** 18n).toString(), + )) as GenericERC20; DistributorFactory = await ethers.getContractFactory("ContinuousVestingMerkle", deployer); @@ -137,244 +130,216 @@ describe("ContinuousVestingMerkle", function () { unvestedTimes = [ now - 10000n, // start time 10000 seconds ago now + 10000n, // cliff in 10000 seconds, - now + 20000n, // vesting ends in 20000 seconds - ] + now + 20000n, // vesting ends in 20000 seconds + ]; partiallyVestedTimes = [ now - 5000n, // start time 5000 seconds ago now - 5000n, // cliff 5000 seconds ago - now + 5000n, // vesting ends in 500 seconds - ] + now + 5000n, // vesting ends in 500 seconds + ]; fullyVestedTimes = [ now - 100n, // start: 100 seconds ago now - 50n, // cliff: 50 seconds ago - now, // end: now - ] + now, // end: now + ]; // deploy a distributor that has not started vesting (cliff in the future) unvestedDistributor = await DistributorFactory.deploy( - token.address, + token.target, config.total, config.uri, config.votingFactor, ...unvestedTimes, config.proof.merkleRoot, - 0 + 0, ); // deploy another distributor that is mid-vesting partiallyVestedDistributor = await DistributorFactory.deploy( - token.address, + token.target, config.total, config.uri, config.votingFactor, ...partiallyVestedTimes, config.proof.merkleRoot, - 0 + 0, ); fullyVestedDistributor = await DistributorFactory.deploy( - token.address, + token.target, config.total, config.uri, config.votingFactor, ...fullyVestedTimes, config.proof.merkleRoot, - 0 + 0, ); // transfer tokens to the distributors - await token.transfer(partiallyVestedDistributor.address, await partiallyVestedDistributor.total()) - await token.transfer(unvestedDistributor.address, await unvestedDistributor.total()) - await token.transfer(fullyVestedDistributor.address, await fullyVestedDistributor.total()) + await token.transfer(partiallyVestedDistributor.target, await partiallyVestedDistributor.total()); + await token.transfer(unvestedDistributor.target, await unvestedDistributor.total()); + await token.transfer(fullyVestedDistributor.target, await fullyVestedDistributor.total()); }); it("Metadata is correct", async () => { const distributor = partiallyVestedDistributor; - expect(await distributor.NAME()).toEqual("ContinuousVestingMerkle") - expect(await distributor.VERSION() >= BigNumber.from(1)) - expect(await distributor.uri()).toEqual(config.uri) - }) + expect(await distributor.NAME()).toEqual("ContinuousVestingMerkle"); + expect((await distributor.VERSION()) >= 1); + expect(await distributor.uri()).toEqual(config.uri); + }); it("Initial distributor configuration is correct", async () => { - const distributorTimes = [unvestedTimes, partiallyVestedTimes, fullyVestedTimes] + const distributorTimes = [unvestedTimes, partiallyVestedTimes, fullyVestedTimes]; for (let [i, distributor] of [unvestedDistributor, partiallyVestedDistributor, fullyVestedDistributor].entries()) { // the distributor total must match (note the adjustment for rounding error) - expect((await distributor.total()).toBigInt()).toEqual(config.total) + expect(await distributor.total()).toEqual(config.total); // nothing has been claimed - expect((await distributor.claimed()).toBigInt()).toEqual(0n) + expect(await distributor.claimed()).toEqual(0n); - const [start, cliff, end] = (await distributor.getVestingConfig()).map(v => v.toBigInt()) + const [start, cliff, end] = (await distributor.getVestingConfig()).map(v => v); // distributor remembers vesting times correctly - expect(start).toEqual(distributorTimes[i][0]) - expect(cliff).toEqual(distributorTimes[i][1]) - expect(end).toEqual(distributorTimes[i][2]) + expect(start).toEqual(distributorTimes[i][0]); + expect(cliff).toEqual(distributorTimes[i][1]); + expect(end).toEqual(distributorTimes[i][2]); // no claims have been initialized yet! for (let user of [eligible1, eligible2, ineligible]) { - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // not initialized yet - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // the total can be inferred from the sale - expect(distributionRecord.total.toBigInt()).toEqual(0n) + expect(distributionRecord.total).toEqual(0n); // nothing has been claimed yet - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // TODO: allow voting prior to initialization // voting power must be zero prior to initialization - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n); + expect(await distributor.getVotes(user.address)).toEqual(0n); // does not yet hold tokens to claim - expect((await token.balanceOf(user.address)).toBigInt()).toEqual(0n) + expect(await token.balanceOf(user.address)).toEqual(0n); } // fraction denominator is the expected value (1e18) - expect((await distributor.getFractionDenominator()).toBigInt()).toEqual(10n ** 18n) + expect(await distributor.getFractionDenominator()).toEqual(10n ** 18n); } - }) + }); it("A user can claim without initialization", async () => { - const user = eligible1 - const distributor = partiallyVestedDistributor - - const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - const proof = config.proof.claims[user.address].proof + const user = eligible1; + const distributor = partiallyVestedDistributor; + const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + const proof = config.proof.claims[user.address].proof; - await distributor.claim(index, beneficiary, amount, proof) + await distributor.claim(index, beneficiary, amount, proof); let estimatedClaimable = estimateClaimableTokens( BigInt(await time.latest()), ...partiallyVestedTimes, - BigInt(config.proof.claims[user.address].data[2].value) - ) + BigInt(config.proof.claims[user.address].data[2].value), + ); - let distributionRecord = await distributor.getDistributionRecord(user.address) + let distributionRecord = await distributor.getDistributionRecord(user.address); - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(config.proof.claims[user.address].data[2].value) - ) - expect(distributionRecord.initialized).toEqual(true) + expect(distributionRecord.total).toEqual(BigInt(config.proof.claims[user.address].data[2].value)); + expect(distributionRecord.initialized).toEqual(true); - expectCloseEnough( - distributionRecord.claimed.toBigInt(), - estimatedClaimable, - BigInt(amount) / 100n - ) + expectCloseEnough(distributionRecord.claimed, estimatedClaimable, BigInt(amount) / 100n); // about half of the tokens should be claimable (within ~1%) - expectCloseEnough( - distributionRecord.claimed.toBigInt(), - BigInt(amount) / 2n, - BigInt(amount) / 100n - ) + expectCloseEnough(distributionRecord.claimed, BigInt(amount) / 2n, BigInt(amount) / 100n); - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); // delegate to self - const myDistributor = await ethers.getContractAt("ContinuousVestingMerkle", distributor.address, user); - await myDistributor.delegate(user.address) + const myDistributor = await ethers.getContractAt("ContinuousVestingMerkle", distributor.target, user); + await myDistributor.delegate(user.address); // voting power is present once delegation occurs (within 1%) expectCloseEnough( - (await distributor.getVotes(user.address)).toBigInt(), + await distributor.getVotes(user.address), // a factor of two is applied to all unclaimed tokens for voting power - 2n * BigInt(distributionRecord.total.toBigInt() - distributionRecord.claimed.toBigInt()), - BigInt(amount) / 100n - ) + 2n * BigInt(distributionRecord.total - distributionRecord.claimed), + BigInt(amount) / 100n, + ); // the user now has a balance - expectCloseEnough( - (await token.balanceOf(user.address)).toBigInt(), - estimatedClaimable, - config.total / 100n - ) + expectCloseEnough(await token.balanceOf(user.address), estimatedClaimable, config.total / 100n); // the distributor metrics are now updated - expect((await distributor.claimed()).toBigInt()).toEqual(distributionRecord.claimed.toBigInt()) - }) + expect(await distributor.claimed()).toEqual(distributionRecord.claimed); + }); it("A buyer can initialize and delegate before claiming", async () => { - const user = eligible2 - const distributor = partiallyVestedDistributor - const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - const proof = config.proof.claims[user.address].proof - + const user = eligible2; + const distributor = partiallyVestedDistributor; + const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + const proof = config.proof.claims[user.address].proof; - await distributor.initializeDistributionRecord(index, beneficiary, amount, proof) + await distributor.initializeDistributionRecord(index, beneficiary, amount, proof); - let distributionRecord = await distributor.getDistributionRecord(user.address) + let distributionRecord = await distributor.getDistributionRecord(user.address); - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(config.proof.claims[user.address].data[2].value) - ) - expect(distributionRecord.initialized).toEqual(true) - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(distributionRecord.total).toEqual(BigInt(config.proof.claims[user.address].data[2].value)); + expect(distributionRecord.initialized).toEqual(true); + expect(distributionRecord.claimed).toEqual(0n); + expect(await distributor.getVotes(user.address)).toEqual(0n); // delegate to self - const myDistributor = await ethers.getContractAt("ContinuousVestingMerkle", distributor.address, user); - await myDistributor.delegate(user.address) + const myDistributor = await ethers.getContractAt("ContinuousVestingMerkle", distributor.target, user); + await myDistributor.delegate(user.address); // the user has no balance - expect((await token.balanceOf(user.address)).toBigInt(),).toEqual(0n) + expect(await token.balanceOf(user.address)).toEqual(0n); // now we claim! - await distributor.claim(index, beneficiary, amount, proof) - const estimatedClaimable = estimateClaimableTokens(BigInt(await time.latest()), ...partiallyVestedTimes, BigInt(amount)) + await distributor.claim(index, beneficiary, amount, proof); + const estimatedClaimable = estimateClaimableTokens( + BigInt(await time.latest()), + ...partiallyVestedTimes, + BigInt(amount), + ); - distributionRecord = await distributor.getDistributionRecord(user.address) + distributionRecord = await distributor.getDistributionRecord(user.address); - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(amount) - ) - expect(distributionRecord.initialized).toEqual(true) + expect(distributionRecord.total).toEqual(BigInt(amount)); + expect(distributionRecord.initialized).toEqual(true); - expectCloseEnough( - distributionRecord.claimed.toBigInt(), - estimatedClaimable, - BigInt(amount) / 100n - ) + expectCloseEnough(distributionRecord.claimed, estimatedClaimable, BigInt(amount) / 100n); // about one half of the tokens should be claimable - expectCloseEnough( - distributionRecord.claimed.toBigInt(), - BigInt(amount) / 2n, - BigInt(amount) / 100n - ) + expectCloseEnough(distributionRecord.claimed, BigInt(amount) / 2n, BigInt(amount) / 100n); // voting power is present once a claim occurs (within ~1%) expectCloseEnough( - (await distributor.getVotes(user.address)).toBigInt(), + await distributor.getVotes(user.address), // a factor of two is applied to all unclaimed tokens for voting power - 2n * BigInt(distributionRecord.total.toBigInt() - distributionRecord.claimed.toBigInt()), - BigInt(amount) / 100n - ) + 2n * BigInt(distributionRecord.total - distributionRecord.claimed), + BigInt(amount) / 100n, + ); // the user now has a balance - expectCloseEnough( - (await token.balanceOf(user.address)).toBigInt(), - estimatedClaimable, - BigInt(amount) / 100n - ) - }) + expectCloseEnough(await token.balanceOf(user.address), estimatedClaimable, BigInt(amount) / 100n); + }); it("non-participants in the sale cannot claim any tokens", async () => { - const user = ineligible - const distributor = partiallyVestedDistributor + const user = ineligible; + const distributor = partiallyVestedDistributor; - let distributionRecord = await distributor.getDistributionRecord(user.address) + let distributionRecord = await distributor.getDistributionRecord(user.address); // nothing to distribute - expect(distributionRecord.total.toBigInt()).toEqual(0n) + expect(distributionRecord.total).toEqual(0n); // nothing claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // no votes - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); // not initialized - expect(distributionRecord.initialized).toEqual(false) + expect(distributionRecord.initialized).toEqual(false); // user holds no tokens - expect((await token.balanceOf(user.address)).toBigInt()).toEqual(0n) + expect(await token.balanceOf(user.address)).toEqual(0n); // The user cannot initialize because they are not in the merkle proof - using another addresses' values will not work await expect( @@ -383,8 +348,8 @@ describe("ContinuousVestingMerkle", function () { user.address, // beneficiary config.proof.claims[eligible1.address].data[2].value, // amount config.proof.claims[eligible1.address].proof, // proof - ) - ).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }) + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }); // The user cannot claim because they are not in the merkle proof await expect( @@ -393,80 +358,68 @@ describe("ContinuousVestingMerkle", function () { user.address, // beneficiary config.proof.claims[eligible2.address].data[2].value, // amount config.proof.claims[eligible2.address].proof, // proof - ) - ).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }) + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }); }); it("users can claim all tokens when all tranches have vested", async () => { - const distributor = fullyVestedDistributor + const distributor = fullyVestedDistributor; for (let user of [eligible1, eligible2]) { - const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - const proof = config.proof.claims[user.address].proof + const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + const proof = config.proof.claims[user.address].proof; // get the user's initial token balance - const initialBalance = (await token.balanceOf(user.address)).toBigInt(); + const initialBalance = await token.balanceOf(user.address); // claim from the fully vested distributor - await distributor.claim(index, beneficiary, amount, proof) + await distributor.claim(index, beneficiary, amount, proof); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await token.balanceOf(user.address)).toBigInt(); + const finalBalance = await token.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(amount) - ) + expect(distributionRecord.total).toEqual(BigInt(amount)); // everything has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual( - BigInt(amount) - ) + expect(distributionRecord.claimed).toEqual(BigInt(amount)); // the user's balance has increased by the correct amount - expect(finalBalance - initialBalance).toEqual( - BigInt(amount) - ) + expect(finalBalance - initialBalance).toEqual(BigInt(amount)); // no votes remaining - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n) + expect(await distributor.getVotes(user.address)).toEqual(0n); } // all tokens have been distributed from the fully vested distributor (within rounding error) - expectCloseEnough( - (await token.balanceOf(distributor.address)).toBigInt(), - 0n, - 100n - ) + expectCloseEnough(await token.balanceOf(distributor.target), 0n, 100n); }); it("users cannot claim any tokens before the cliff has expired", async () => { - const distributor = unvestedDistributor + const distributor = unvestedDistributor; - const total = (await distributor.total()).toBigInt() + const total = await distributor.total(); for (let user of [eligible1, eligible2]) { - const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - const proof = config.proof.claims[user.address].proof + const [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + const proof = config.proof.claims[user.address].proof; // get the user's initial token balance - const initialBalance = (await token.balanceOf(user.address)).toBigInt(); + const initialBalance = await token.balanceOf(user.address); // TODO: why does this fail sometimes (i.e. the tx should revert but does not) - await expect( - distributor.claim(index, beneficiary, amount, proof) - ).rejects.toMatchObject( - { message: expect.stringMatching(/no more tokens claimable right now/) } - ) + await expect(distributor.claim(index, beneficiary, amount, proof)).rejects.toMatchObject({ + message: expect.stringMatching(/no more tokens claimable right now/), + }); // get the distribution record - const distributionRecord = await distributor.getDistributionRecord(user.address) + const distributionRecord = await distributor.getDistributionRecord(user.address); // get the user's final token balance - const finalBalance = (await token.balanceOf(user.address)).toBigInt(); + const finalBalance = await token.balanceOf(user.address); // the total is correct - expect(distributionRecord.total.toBigInt()).toEqual( + expect(distributionRecord.total).toEqual( 0n, // distribution records have not yet been initalized - ) + ); // nothing has been claimed - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.claimed).toEqual(0n); // the user's token balance has not increased - expect(finalBalance - initialBalance).toEqual(0n) + expect(finalBalance - initialBalance).toEqual(0n); } // no tokens have been distributed from the unvested distributor - expect((await token.balanceOf(distributor.address)).toBigInt()).toEqual(total) + expect(await token.balanceOf(distributor.target)).toEqual(total); }); it("reverts on misconfiguration during deployment", async () => { @@ -475,245 +428,235 @@ describe("ContinuousVestingMerkle", function () { // cliff before start await expect( DistributorFactory.deploy( - token.address, + token.target, config.total, config.uri, config.votingFactor, now - 10n, // start time 10 seconds ago now - 20n, // cliff 20 seconds ago (before start time) - now, // vesting ends now + now, // vesting ends now config.proof.merkleRoot, - 0 - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/vesting cliff before start/) } - ) + 0, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/vesting cliff before start/) }); // cliff after end await expect( DistributorFactory.deploy( - token.address, + token.target, config.total, config.uri, config.votingFactor, now - 10n, // start time 10 seconds ago now + 20n, // cliff 20 seconds ago (before start time) - now, // vesting ends now + now, // vesting ends now config.proof.merkleRoot, - 0 - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/vesting end before cliff/) } - ) + 0, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/vesting end before cliff/) }); }); - it('total to distribute must be > 0', async () => { + it("total to distribute must be > 0", async () => { let now = BigInt(await time.latest()); await expect( DistributorFactory.deploy( - token.address, + token.target, 0n, config.uri, config.votingFactor, now - 10n, // start time 10 seconds ago now + 20n, // cliff 20 seconds ago (before start time) - now, // vesting ends now + now, // vesting ends now config.proof.merkleRoot, - 0 - ) - ).rejects.toMatchObject( - { message: expect.stringMatching(/Distributor: total is 0/) } - ) - }) - - it('handles merkle root updates correctly', async () => { + 0, + ), + ).rejects.toMatchObject({ message: expect.stringMatching(/Distributor: total is 0/) }); + }); + + it("handles merkle root updates correctly", async () => { // this proof changes the quantities and users - const updatedProof = { - "merkleRoot": "0x4c72e97f572f234e76b91e5e39a208e173ebbef3a1bbcf5ca94d64761f93f9e3", - "claims": { + const updatedProof: { + merkleRoot: string; + claims: { + [address: string]: { + proof: string[]; + data: { + name: string; + type: string; + value: string; + }[]; + }; + }; + } = { + merkleRoot: "0x4c72e97f572f234e76b91e5e39a208e173ebbef3a1bbcf5ca94d64761f93f9e3", + claims: { "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC": { - "proof": [ + proof: [ "0x121a74816d03cf7942c071502d1ece53f8bf75a6ee9554e1f779b258c877e81f", - "0xcff0df6405186fe42f73033b28f6260ee83c87773db200d830665a2d7170b991" + "0xcff0df6405186fe42f73033b28f6260ee83c87773db200d830665a2d7170b991", ], - "data": [ + data: [ { - "name": "index", - "type": "uint256", - "value": 1 + name: "index", + type: "uint256", + value: "1", }, { - "name": "beneficiary", - "type": "address", - "value": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC" + name: "beneficiary", + type: "address", + value: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", }, { - "name": "amount", - "type": "uint256", - "value": "1100000000000000000000" - } - ] + name: "amount", + type: "uint256", + value: "1100000000000000000000", + }, + ], }, "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": { - "proof": [ - "0xfecd7570efdf9df5431ac8e438c299dc873f52efb3aab9b87ebb319136d2e6b0" - ], - "data": [ + proof: ["0xfecd7570efdf9df5431ac8e438c299dc873f52efb3aab9b87ebb319136d2e6b0"], + data: [ { - "name": "index", - "type": "uint256", - "value": 0 + name: "index", + type: "uint256", + value: "0", }, { - "name": "beneficiary", - "type": "address", - "value": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" + name: "beneficiary", + type: "address", + value: "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", }, { - "name": "amount", - "type": "uint256", - "value": "0" - } - ] + name: "amount", + type: "uint256", + value: "0", + }, + ], }, "0x90F79bf6EB2c4f870365E785982E1f101E93b906": { - "proof": [ + proof: [ "0x75bd8c270b22209bc2da8dd4c303f03871e248fa0d5a140ffa952ded018e2be7", - "0xcff0df6405186fe42f73033b28f6260ee83c87773db200d830665a2d7170b991" + "0xcff0df6405186fe42f73033b28f6260ee83c87773db200d830665a2d7170b991", ], - "data": [ + data: [ { - "name": "index", - "type": "uint256", - "value": 0 + name: "index", + type: "uint256", + value: "0", }, { - "name": "beneficiary", - "type": "address", - "value": "0x90F79bf6EB2c4f870365E785982E1f101E93b906" + name: "beneficiary", + type: "address", + value: "0x90F79bf6EB2c4f870365E785982E1f101E93b906", }, { - "name": "amount", - "type": "uint256", - "value": "6600000000000000000000" - } - ] - } - } - } - const updatedTotal = 7700000000000000000000n + name: "amount", + type: "uint256", + value: "6600000000000000000000", + }, + ], + }, + }, + }; + const updatedTotal = 7700000000000000000000n; // avoid silly mistakes - expect(eligible1.address).toEqual('0x70997970C51812dc3A010C7d01b50e0d17dc79C8') - expect(eligible2.address).toEqual('0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC') - expect(ineligible.address).toEqual('0x90F79bf6EB2c4f870365E785982E1f101E93b906') + expect(eligible1.address).toEqual("0x70997970C51812dc3A010C7d01b50e0d17dc79C8"); + expect(eligible2.address).toEqual("0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC"); + expect(ineligible.address).toEqual("0x90F79bf6EB2c4f870365E785982E1f101E93b906"); let now = BigInt(await time.latest()); // deploy a distributor with the default config that is mid-distribution const distributor = await DistributorFactory.deploy( - token.address, + token.target, config.total, config.uri, config.votingFactor, ...partiallyVestedTimes, config.proof.merkleRoot, - 0 + 0, ); // get some tokens to the distributor - await token.transfer(distributor.address, config.total) + await token.transfer(distributor.target, config.total); /** * Sanity check: distributions still work before the merkle root update */ // eligible1 can claim - let user = eligible1 - let [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - let proof = config.proof.claims[user.address].proof + let user = eligible1; + let [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + let proof = config.proof.claims[user.address].proof; let estimatedClaimable = estimateClaimableTokens( BigInt(await time.latest()), ...partiallyVestedTimes, - BigInt(config.proof.claims[user.address].data[2].value) - ) + BigInt(config.proof.claims[user.address].data[2].value), + ); - await distributor.claim(index, beneficiary, amount, proof) + await distributor.claim(index, beneficiary, amount, proof); - let distributionRecord = await distributor.getDistributionRecord(user.address) - const eligible1Claimed = distributionRecord.claimed.toBigInt() + let distributionRecord = await distributor.getDistributionRecord(user.address); + const eligible1Claimed = distributionRecord.claimed; - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(config.proof.claims[user.address].data[2].value) - ) - expect(distributionRecord.initialized).toEqual(true) + expect(distributionRecord.total).toEqual(BigInt(config.proof.claims[user.address].data[2].value)); + expect(distributionRecord.initialized).toEqual(true); - expectCloseEnough( - distributionRecord.claimed.toBigInt(), - estimatedClaimable, - BigInt(amount) / 100n - ) + expectCloseEnough(distributionRecord.claimed, estimatedClaimable, BigInt(amount) / 100n); // about half of the tokens should be claimable (within ~1%) - expectCloseEnough( - distributionRecord.claimed.toBigInt(), - BigInt(amount) / 2n, - BigInt(amount) / 100n - ) - + expectCloseEnough(distributionRecord.claimed, BigInt(amount) / 2n, BigInt(amount) / 100n); + // eligible2 can initialize distribution record (but not claim) user = eligible2; - [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - proof = config.proof.claims[user.address].proof + [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + proof = config.proof.claims[user.address].proof; - await distributor.initializeDistributionRecord(index, beneficiary, amount, proof) + await distributor.initializeDistributionRecord(index, beneficiary, amount, proof); - distributionRecord = await distributor.getDistributionRecord(user.address) + distributionRecord = await distributor.getDistributionRecord(user.address); - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(config.proof.claims[user.address].data[2].value) - ) - expect(distributionRecord.initialized).toEqual(true) - expect(distributionRecord.claimed.toBigInt()).toEqual(0n) + expect(distributionRecord.total).toEqual(BigInt(config.proof.claims[user.address].data[2].value)); + expect(distributionRecord.initialized).toEqual(true); + expect(distributionRecord.claimed).toEqual(0n); // ineligible cannot claim or initialize distribution record (the new proof has not been applied) user = ineligible; - [index, beneficiary, amount] = updatedProof.claims[user.address].data.map(d => d.value) - proof = updatedProof.claims[user.address].proof + [index, beneficiary, amount] = updatedProof.claims[user.address].data.map(d => d.value); + proof = updatedProof.claims[user.address].proof; - await expect( - distributor.initializeDistributionRecord( - index, beneficiary, amount, proof) - ).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }) + await expect(distributor.initializeDistributionRecord(index, beneficiary, amount, proof)).rejects.toMatchObject({ + message: expect.stringMatching(/invalid proof/), + }); - await expect( - distributor.claim( - index, beneficiary, amount, proof) - ).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }) + await expect(distributor.claim(index, beneficiary, amount, proof)).rejects.toMatchObject({ + message: expect.stringMatching(/invalid proof/), + }); /** * Update the Merkle Root and Total */ // update the merkle root - await distributor.setMerkleRoot(updatedProof.merkleRoot) + await distributor.setMerkleRoot(updatedProof.merkleRoot); // verify the root has been updated - expect(await distributor.getMerkleRoot()).toEqual(updatedProof.merkleRoot) + expect(await distributor.getMerkleRoot()).toEqual(updatedProof.merkleRoot); // the total is still incorrect - expect((await distributor.total()).toBigInt()).toEqual(config.total) + expect(await distributor.total()).toEqual(config.total); // update the total - await distributor.setTotal(updatedTotal) + await distributor.setTotal(updatedTotal); // now it is correct - expect((await distributor.total()).toBigInt()).toEqual(updatedTotal) + expect(await distributor.total()).toEqual(updatedTotal); // move more tokens to the contract since total claimable quantity has increased - await token.transfer(distributor.address, updatedTotal - config.total) + await token.transfer(distributor.target, updatedTotal - config.total); /** * Claims now work with the updated merkle root @@ -721,99 +664,80 @@ describe("ContinuousVestingMerkle", function () { // eligible1 can no longer claim user = eligible1; - [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value) - proof = config.proof.claims[user.address].proof + [index, beneficiary, amount] = config.proof.claims[user.address].data.map(d => d.value); + proof = config.proof.claims[user.address].proof; - await expect( - distributor.claim( - index, beneficiary, amount, proof) - ).rejects.toMatchObject({ message: expect.stringMatching(/invalid proof/) }) + await expect(distributor.claim(index, beneficiary, amount, proof)).rejects.toMatchObject({ + message: expect.stringMatching(/invalid proof/), + }); // eligible1 distribution record still incorrectly shows a total - distributionRecord = await distributor.getDistributionRecord(user.address) + distributionRecord = await distributor.getDistributionRecord(user.address); - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(config.proof.claims[user.address].data[2].value) - ) + expect(distributionRecord.total).toEqual(BigInt(config.proof.claims[user.address].data[2].value)); expect(distributionRecord.initialized).toEqual(true); // eligible1 still has 50% of their original voting power (see Sherlock 41: https://github.com/sherlock-audit/2023-06-tokensoft-judging/issues/55) await distributor.connect(eligible1).delegate(eligible1.address); - expectCloseEnough( - (await distributor.getVotes(user.address)).toBigInt(), - 5000000000000000000000n, - BigInt(amount) / 100n - ); + expectCloseEnough(await distributor.getVotes(user.address), 5000000000000000000000n, BigInt(amount) / 100n); // can re-initialize this distribution record with the correct details - [index, beneficiary, amount] = updatedProof.claims[user.address].data.map(d => d.value) - proof = updatedProof.claims[user.address].proof - await distributor.initializeDistributionRecord(index, beneficiary, amount, proof) + [index, beneficiary, amount] = updatedProof.claims[user.address].data.map(d => d.value); + proof = updatedProof.claims[user.address].proof; + await distributor.initializeDistributionRecord(index, beneficiary, amount, proof); - distributionRecord = await distributor.getDistributionRecord(user.address) + distributionRecord = await distributor.getDistributionRecord(user.address); - expect(distributionRecord.total.toBigInt()).toEqual(0n) - expect(distributionRecord.initialized).toEqual(true) + expect(distributionRecord.total).toEqual(0n); + expect(distributionRecord.initialized).toEqual(true); // the previously claimed value is preserved - expect(distributionRecord.claimed.toBigInt()).toEqual(eligible1Claimed) + expect(distributionRecord.claimed).toEqual(eligible1Claimed); // eligible1 no longer has voting power await distributor.connect(eligible1).delegate(eligible1.address); - expect((await distributor.getVotes(user.address)).toBigInt()).toEqual(0n); + expect(await distributor.getVotes(user.address)).toEqual(0n); // eligible2 can claim using the total from the updated distribution record user = eligible2; - [index, beneficiary, amount] = updatedProof.claims[user.address].data.map(d => d.value) - proof = updatedProof.claims[user.address].proof - - await distributor.claim(index, beneficiary, amount, proof) + [index, beneficiary, amount] = updatedProof.claims[user.address].data.map(d => d.value); + proof = updatedProof.claims[user.address].proof; + + await distributor.claim(index, beneficiary, amount, proof); estimatedClaimable = estimateClaimableTokens( BigInt(await time.latest()), ...partiallyVestedTimes, - BigInt(updatedProof.claims[user.address].data[2].value) - ) + BigInt(updatedProof.claims[user.address].data[2].value), + ); // the distribution record has been updated and matches new values - distributionRecord = await distributor.getDistributionRecord(user.address) + distributionRecord = await distributor.getDistributionRecord(user.address); - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(updatedProof.claims[user.address].data[2].value) - ) - expect(distributionRecord.initialized).toEqual(true) + expect(distributionRecord.total).toEqual(BigInt(updatedProof.claims[user.address].data[2].value)); + expect(distributionRecord.initialized).toEqual(true); - expectCloseEnough( - distributionRecord.claimed.toBigInt(), - estimatedClaimable, - BigInt(amount) / 100n - ) + expectCloseEnough(distributionRecord.claimed, estimatedClaimable, BigInt(amount) / 100n); // ineligible can now claim user = ineligible; - [index, beneficiary, amount] = updatedProof.claims[user.address].data.map(d => d.value) - proof = updatedProof.claims[user.address].proof + [index, beneficiary, amount] = updatedProof.claims[user.address].data.map(d => d.value); + proof = updatedProof.claims[user.address].proof; - await distributor.claim(index, beneficiary, amount, proof) + await distributor.claim(index, beneficiary, amount, proof); estimatedClaimable = estimateClaimableTokens( BigInt(await time.latest()), ...partiallyVestedTimes, - BigInt(updatedProof.claims[user.address].data[2].value) - ) + BigInt(updatedProof.claims[user.address].data[2].value), + ); - distributionRecord = await distributor.getDistributionRecord(user.address) + distributionRecord = await distributor.getDistributionRecord(user.address); - expect(distributionRecord.total.toBigInt()).toEqual( - BigInt(updatedProof.claims[user.address].data[2].value) - ) - expect(distributionRecord.initialized).toEqual(true) + expect(distributionRecord.total).toEqual(BigInt(updatedProof.claims[user.address].data[2].value)); + expect(distributionRecord.initialized).toEqual(true); - expectCloseEnough( - distributionRecord.claimed.toBigInt(), - estimatedClaimable, - BigInt(amount) / 100n - ) - }) -}) + expectCloseEnough(distributionRecord.claimed, estimatedClaimable, BigInt(amount) / 100n); + }); +}); diff --git a/packages/hardhat/test/foundry/ContinuousVestingMerkleDistributor.t.sol b/packages/hardhat/test/foundry/ContinuousVestingMerkleDistributor.t.sol index 1e990af2..ad761c53 100644 --- a/packages/hardhat/test/foundry/ContinuousVestingMerkleDistributor.t.sol +++ b/packages/hardhat/test/foundry/ContinuousVestingMerkleDistributor.t.sol @@ -7,60 +7,62 @@ import "../../contracts/claim/factory/ContinuousVestingMerkleDistributorFactory. import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract ContinuousVestingMerkleDistributorTest is Test { - ContinuousVestingMerkleDistributor implementation; - ContinuousVestingMerkleDistributor clone; - ContinuousVestingMerkleDistributorFactory factory; - ERC20 token = new ERC20("Test", "TEST"); + ContinuousVestingMerkleDistributor implementation; + ContinuousVestingMerkleDistributor clone; + ContinuousVestingMerkleDistributorFactory factory; + ERC20 token = new ERC20("Test", "TEST"); - function setUp() public { - implementation = new ContinuousVestingMerkleDistributor(); - factory = new ContinuousVestingMerkleDistributorFactory(address(implementation)); - clone = factory.deployDistributor( - IERC20(token), - 1000, - "uri", - 1698796800, - 1698796800, - 1730419200, - bytes32(0), - 0, - address(this), - 0 - ); - } + function setUp() public { + implementation = new ContinuousVestingMerkleDistributor(); + factory = new ContinuousVestingMerkleDistributorFactory( + address(implementation) + ); + clone = factory.deployDistributor( + IERC20(token), + 1000, + "uri", + 1698796800, + 1698796800, + 1730419200, + bytes32(0), + 0, + address(this), + 0 + ); + } - function test_Initialize_fails_as_disabled() public { - vm.expectRevert("Initializable: contract is already initialized"); - implementation.initialize( - IERC20(address(0)), - 0, - "", - 0, - 0, - 0, - bytes32(0), - 0, - address(0) - ); - } + function test_Initialize_fails_as_disabled() public { + vm.expectRevert("Initializable: contract is already initialized"); + implementation.initialize( + IERC20(address(0)), + 0, + "", + 0, + 0, + 0, + bytes32(0), + 0, + address(0) + ); + } - function test_TransferOwnership_fails_as_not_owner() public { - vm.startPrank(address(1)); - - vm.expectRevert("Ownable: caller is not the owner"); - implementation.transferOwnership(address(1)); - - vm.expectRevert("Ownable: caller is not the owner"); - clone.transferOwnership(address(1)); - } + function test_TransferOwnership_fails_as_not_owner() public { + vm.startPrank(address(1)); - function test_SetSweepRecipient_fails_as_not_owner() public { - vm.startPrank(address(1)); - - vm.expectRevert("Ownable: caller is not the owner"); - implementation.setSweepRecipient(payable(address(1))); - - vm.expectRevert("Ownable: caller is not the owner"); - clone.setSweepRecipient(payable(address(1))); - } + vm.expectRevert("Ownable: caller is not the owner"); + implementation.transferOwnership(address(1)); + + vm.expectRevert("Ownable: caller is not the owner"); + clone.transferOwnership(address(1)); + } + + function test_SetSweepRecipient_fails_as_not_owner() public { + vm.startPrank(address(1)); + + vm.expectRevert("Ownable: caller is not the owner"); + implementation.setSweepRecipient(payable(address(1))); + + vm.expectRevert("Ownable: caller is not the owner"); + clone.setSweepRecipient(payable(address(1))); + } } diff --git a/packages/hardhat/test/foundry/ContinuousVestingMerkleDistributorFactory.t.sol b/packages/hardhat/test/foundry/ContinuousVestingMerkleDistributorFactory.t.sol index 94dde72d..32e8764a 100644 --- a/packages/hardhat/test/foundry/ContinuousVestingMerkleDistributorFactory.t.sol +++ b/packages/hardhat/test/foundry/ContinuousVestingMerkleDistributorFactory.t.sol @@ -8,64 +8,67 @@ import "../../contracts/claim/factory/ContinuousVestingMerkleDistributor.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract ContinuousVestingMerkleDistributorFactoryTest is Test { - ContinuousVestingMerkleDistributor implementation; - ContinuousVestingMerkleDistributor clone; - ContinuousVestingMerkleDistributorFactory factory; - ERC20 token = new ERC20("Test", "TEST"); + ContinuousVestingMerkleDistributor implementation; + ContinuousVestingMerkleDistributor clone; + ContinuousVestingMerkleDistributorFactory factory; + ERC20 token = new ERC20("Test", "TEST"); - function setUp() public { - implementation = new ContinuousVestingMerkleDistributor(); - factory = new ContinuousVestingMerkleDistributorFactory(address(implementation)); - } + function setUp() public { + implementation = new ContinuousVestingMerkleDistributor(); + factory = new ContinuousVestingMerkleDistributorFactory( + address(implementation) + ); + } - function test_SetUp() public { - assertEq(address(factory.getImplementation()), address(implementation)); - } + function test_SetUp() public { + assertEq(address(factory.getImplementation()), address(implementation)); + } - function test_DeployDistributor() public { - clone = factory.deployDistributor( - IERC20(token), - 1000, - "uri", - 1698796800, - 1698796800, - 1730419200, - bytes32(0), - 0, - address(this), - 0 - ); + function test_DeployDistributor() public { + clone = factory.deployDistributor( + IERC20(token), + 1000, + "uri", + 1698796800, + 1698796800, + 1730419200, + bytes32(0), + 0, + address(this), + 0 + ); - assertEq(clone.owner(), address(this)); - assertEq(clone.getSweepRecipient(), address(this)); - } + assertEq(clone.owner(), address(this)); + assertEq(clone.getSweepRecipient(), address(this)); + } - function test_PredictDistributorAddress() public { - address nextCloneAddress = factory.predictDistributorAddress( - IERC20(token), - 1000, - "uri", - 1698796800, - 1698796800, - 1730419200, - bytes32(0), - 0, - address(this), - 1 - ); - ContinuousVestingMerkleDistributor nextClone = factory.deployDistributor( - IERC20(token), - 1000, - "uri", - 1698796800, - 1698796800, - 1730419200, - bytes32(0), - 0, - address(this), - 1 - ); + function test_PredictDistributorAddress() public { + address nextCloneAddress = factory.predictDistributorAddress( + IERC20(token), + 1000, + "uri", + 1698796800, + 1698796800, + 1730419200, + bytes32(0), + 0, + address(this), + 1 + ); + ContinuousVestingMerkleDistributor nextClone = factory + .deployDistributor( + IERC20(token), + 1000, + "uri", + 1698796800, + 1698796800, + 1730419200, + bytes32(0), + 0, + address(this), + 1 + ); - assertEq(nextCloneAddress, address(nextClone)); - } -} \ No newline at end of file + assertEq(nextCloneAddress, address(nextClone)); + } +} diff --git a/packages/hardhat/test/foundry/TrancheVestingMerkleDistributor.t.sol b/packages/hardhat/test/foundry/TrancheVestingMerkleDistributor.t.sol index 2dfe00ee..c8766e78 100644 --- a/packages/hardhat/test/foundry/TrancheVestingMerkleDistributor.t.sol +++ b/packages/hardhat/test/foundry/TrancheVestingMerkleDistributor.t.sol @@ -7,57 +7,59 @@ import "../../contracts/claim/factory/TrancheVestingMerkleDistributorFactory.sol import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract TrancheVestingMerkleDistributorTest is Test { - TrancheVestingMerkleDistributor implementation; - TrancheVestingMerkleDistributor clone; - TrancheVestingMerkleDistributorFactory factory; - ERC20 token = new ERC20("Test", "TEST"); - Tranche[] tranches = [Tranche({time: 1, vestedFraction: 10000})]; - - function setUp() public { - implementation = new TrancheVestingMerkleDistributor(); - factory = new TrancheVestingMerkleDistributorFactory(address(implementation)); - clone = factory.deployDistributor( - IERC20(token), - 1000, - "uri", - tranches, - bytes32(0), - 0, - address(this), - 0 - ); - } - - function test_Initialize_fails_as_disabled() public { - vm.expectRevert("Initializable: contract is already initialized"); - implementation.initialize( - IERC20(address(0)), - 0, - "", - tranches, - bytes32(0), - 0, - address(0) - ); - } - - function test_TransferOwnership_fails_as_not_owner() public { - vm.startPrank(address(1)); - - vm.expectRevert("Ownable: caller is not the owner"); - implementation.transferOwnership(address(1)); - - vm.expectRevert("Ownable: caller is not the owner"); - clone.transferOwnership(address(1)); - } - - function test_SetSweepRecipient_fails_as_not_owner() public { - vm.startPrank(address(1)); - - vm.expectRevert("Ownable: caller is not the owner"); - implementation.setSweepRecipient(payable(address(1))); - - vm.expectRevert("Ownable: caller is not the owner"); - clone.setSweepRecipient(payable(address(1))); - } + TrancheVestingMerkleDistributor implementation; + TrancheVestingMerkleDistributor clone; + TrancheVestingMerkleDistributorFactory factory; + ERC20 token = new ERC20("Test", "TEST"); + Tranche[] tranches = [Tranche({ time: 1, vestedFraction: 10000 })]; + + function setUp() public { + implementation = new TrancheVestingMerkleDistributor(); + factory = new TrancheVestingMerkleDistributorFactory( + address(implementation) + ); + clone = factory.deployDistributor( + IERC20(token), + 1000, + "uri", + tranches, + bytes32(0), + 0, + address(this), + 0 + ); + } + + function test_Initialize_fails_as_disabled() public { + vm.expectRevert("Initializable: contract is already initialized"); + implementation.initialize( + IERC20(address(0)), + 0, + "", + tranches, + bytes32(0), + 0, + address(0) + ); + } + + function test_TransferOwnership_fails_as_not_owner() public { + vm.startPrank(address(1)); + + vm.expectRevert("Ownable: caller is not the owner"); + implementation.transferOwnership(address(1)); + + vm.expectRevert("Ownable: caller is not the owner"); + clone.transferOwnership(address(1)); + } + + function test_SetSweepRecipient_fails_as_not_owner() public { + vm.startPrank(address(1)); + + vm.expectRevert("Ownable: caller is not the owner"); + implementation.setSweepRecipient(payable(address(1))); + + vm.expectRevert("Ownable: caller is not the owner"); + clone.setSweepRecipient(payable(address(1))); + } } diff --git a/packages/hardhat/test/foundry/TrancheVestingMerkleDistributorFactory.t.sol b/packages/hardhat/test/foundry/TrancheVestingMerkleDistributorFactory.t.sol index da0a5d33..b51209ca 100644 --- a/packages/hardhat/test/foundry/TrancheVestingMerkleDistributorFactory.t.sol +++ b/packages/hardhat/test/foundry/TrancheVestingMerkleDistributorFactory.t.sol @@ -8,67 +8,68 @@ import "../../contracts/claim/factory/TrancheVestingMerkleDistributor.sol"; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract TrancheVestingMerkleDistributorFactoryTest is Test { - TrancheVestingMerkleDistributor implementation; - TrancheVestingMerkleDistributor clone; - TrancheVestingMerkleDistributorFactory factory; - ERC20 token = new ERC20("Test", "TEST"); - Tranche[] tranches = [Tranche(1, 10000)]; + TrancheVestingMerkleDistributor implementation; + TrancheVestingMerkleDistributor clone; + TrancheVestingMerkleDistributorFactory factory; + ERC20 token = new ERC20("Test", "TEST"); + Tranche[] tranches = [Tranche(1, 10000)]; - function setUp() public { - implementation = new TrancheVestingMerkleDistributor(); - factory = new TrancheVestingMerkleDistributorFactory(address(implementation)); - } + function setUp() public { + implementation = new TrancheVestingMerkleDistributor(); + factory = new TrancheVestingMerkleDistributorFactory( + address(implementation) + ); + } - function test_SetUp() public { - assertEq(address(factory.getImplementation()), address(implementation)); - } + function test_SetUp() public { + assertEq(address(factory.getImplementation()), address(implementation)); + } - function test_DeployDistributor() public { - clone = factory.deployDistributor( - IERC20(token), - 1000, - "uri", - tranches, - bytes32(0), - 0, - address(this), - 0 - ); + function test_DeployDistributor() public { + clone = factory.deployDistributor( + IERC20(token), + 1000, + "uri", + tranches, + bytes32(0), + 0, + address(this), + 0 + ); - assertEq(clone.owner(), address(this)); - assertEq(clone.getSweepRecipient(), address(this)); - } + assertEq(clone.owner(), address(this)); + assertEq(clone.getSweepRecipient(), address(this)); + } - function test_PredictDistributorAddress() public { - uint256 total = 1000; - string memory uri = "uri"; - bytes32 merkleRoot = bytes32(0); - uint160 maxDelayTime = 0; - address owner = address(this); - uint256 nonce = 1; + function test_PredictDistributorAddress() public { + uint256 total = 1000; + string memory uri = "uri"; + bytes32 merkleRoot = bytes32(0); + uint160 maxDelayTime = 0; + address owner = address(this); + uint256 nonce = 1; - address nextCloneAddress = factory.predictDistributorAddress( - token, - total, - uri, - tranches, - merkleRoot, - maxDelayTime, - owner, - nonce - ); - TrancheVestingMerkleDistributor nextClone = - factory.deployDistributor( - token, - total, - uri, - tranches, - merkleRoot, - maxDelayTime, - owner, - nonce - ); + address nextCloneAddress = factory.predictDistributorAddress( + token, + total, + uri, + tranches, + merkleRoot, + maxDelayTime, + owner, + nonce + ); + TrancheVestingMerkleDistributor nextClone = factory.deployDistributor( + token, + total, + uri, + tranches, + merkleRoot, + maxDelayTime, + owner, + nonce + ); - assertEq(nextCloneAddress, address(nextClone)); - } + assertEq(nextCloneAddress, address(nextClone)); + } } diff --git a/packages/hardhat/test/lib.ts b/packages/hardhat/test/lib.ts index 5442764c..408f1e35 100644 --- a/packages/hardhat/test/lib.ts +++ b/packages/hardhat/test/lib.ts @@ -1,88 +1,87 @@ -import { ContractTransaction } from 'ethers' -import hre from 'hardhat' -import { GovernorMultiSourceUpgradeable } from '../typechain-types' -import { ProposalCreatedEvent } from '../typechain-types/contracts/governance/GovernorMultiSourceUpgradeable' -import { NewSaleEvent } from '../typechain-types/contracts/sale/v2/FlatPriceSaleFactory' +import { ContractTransaction } from "ethers"; +import hre from "hardhat"; +import { GovernorMultiSourceUpgradeable } from "../typechain-types"; +import { ProposalCreatedEvent } from "../typechain-types/contracts/governance/GovernorMultiSourceUpgradeable"; +import { NewSaleEvent } from "../typechain-types/contracts/sale/v2/FlatPriceSaleFactory"; import { time } from "@nomicfoundation/hardhat-network-helpers"; +import { ethers } from "hardhat"; -const ethers = (hre as any).ethers - -export const provider = new ethers.providers.JsonRpcProvider("http://localhost:8545") +export const provider = new ethers.JsonRpcProvider("http://localhost:8545"); // wait for a certain # of milliseconds -export const getSaleId = async (tx): Promise => { - return (await tx.wait()).events[0].topics[1] -} +export const getSaleId = async (tx: any): Promise => { + return (await tx.wait()).logs[0].topics[1]; +}; -export const getSaleAddress_2_0 = async (tx: ContractTransaction) => { - const receipt = await tx.wait() +export const getSaleAddress_2_0 = async (tx: any) => { + const receipt = await tx.wait(); - for (let e of receipt.events!) { - if (e.event == 'NewSale') { - const newSaleEvent = e as NewSaleEvent - return newSaleEvent.args[1] + for (let e of receipt.logs!) { + if (e.eventName == "NewSale") { + const newSaleEvent = e as any; + return newSaleEvent.args[1]; } } - throw new Error('no matching event found') -} + throw new Error("no matching event found"); +}; -export const getGovernorProposalId = async (tx: ContractTransaction) => { - const receipt = await tx.wait() +export const getGovernorProposalId = async (tx: any) => { + const receipt = await tx.wait(); for (let e of receipt.events!) { - if (e.event == 'ProposalCreated') { - const proposalCreatedEvent = e as any - return proposalCreatedEvent.args[0] + if (e.event == "ProposalCreated") { + const proposalCreatedEvent = e as any; + return proposalCreatedEvent.args[0]; } } - throw new Error('no matching event found') -} + throw new Error("no matching event found"); +}; export const fillEmptyBlock = async (nBlocks: number | bigint = 1n) => { - const [deployer ] = await ethers.getSigners(); + const [deployer] = await ethers.getSigners(); // run some meaningless transactions to use up a block () based on Hardhat's automine feature: https://hardhat.org/hardhat-network/docs/explanation/mining-modes for (let i = 0; i < nBlocks; i++) { // zero-valued transaction to one self await deployer.sendTransaction({ to: deployer.address, - value: 0 - }) + value: 0, + }); } -} +}; // wait for a certain # of milliseconds -export const delay = ms => new Promise(res => setTimeout(res, ms)) +export const delay = (ms: number) => new Promise(res => setTimeout(res, ms)); export const expectCloseEnough = (a: bigint, b: bigint, limit: bigint) => { // expect a and b to be close to each other (within the difference) - expect((a > b ? a - b : b - a)).toBeLessThanOrEqual(limit) -} + expect(a > b ? a - b : b - a).toBeLessThanOrEqual(limit); +}; type TrancheStruct = { time: string; vestedFraction: string; -} +}; export const makeUniformTranches = async (trancheCount = 48n, trancheDelay = 3600n, startTime?: bigint) => { // creates a uniform vesting schedule if (!startTime) { - startTime = BigInt(await time.latest()) + startTime = BigInt(await time.latest()); } - let tranches: TrancheStruct[] = [] + let tranches: TrancheStruct[] = []; - // create 48 tranches of hourly vesting with the first tranche available immediately - for (let i: bigint = 0n; i < trancheCount; i++) { - tranches.push({ - // each tranche is an hour later + // create 48 tranches of hourly vesting with the first tranche available immediately + for (let i: bigint = 0n; i < trancheCount; i++) { + tranches.push({ + // each tranche is an hour later time: (startTime + trancheDelay * i).toString(), - // each tranche vests an additional 1/48th of the token - vestedFraction: ((i + 1n) * 10000n / trancheCount).toString() - }) - } - return tranches -} + // each tranche vests an additional 1/48th of the token + vestedFraction: (((i + 1n) * 10000n) / trancheCount).toString(), + }); + } + return tranches; +}; export const makeMonthlyTranches = (startingDate: Date, startingFraction: number = 208, trancheCount = 48) => { /** @@ -94,32 +93,41 @@ export const makeMonthlyTranches = (startingDate: Date, startingFraction: number */ if (startingFraction > 10000) { - throw new Error('starting fraction over 10000 basis points (100%)') + throw new Error("starting fraction over 10000 basis points (100%)"); } - if (startingDate.getDate() > 28) throw new Error('cannot vest on the 29th or later date!') + if (startingDate.getDate() > 28) throw new Error("cannot vest on the 29th or later date!"); - let tranches: TrancheStruct[] = [] - // create 48 tranches of hourly vesting with the first tranche available immediately - for (let i = 0; i < trancheCount; i++) { + let tranches: TrancheStruct[] = []; + // create 48 tranches of hourly vesting with the first tranche available immediately + for (let i = 0; i < trancheCount; i++) { // handle the first tranche - const time = i == 0 - ? (startingDate.getTime()/1000).toString() - : Math.round(Date.UTC(startingDate.getUTCFullYear(), startingDate.getUTCMonth() + i, startingDate.getUTCDate(), startingDate.getUTCHours())/1000).toString() - - const vestedFraction = i == 0 - ? startingFraction.toString() - : (startingFraction + (Math.round(i * (10000 - startingFraction) / (trancheCount - 1)))).toString() - - tranches.push({ + const time = + i == 0 + ? (startingDate.getTime() / 1000).toString() + : Math.round( + Date.UTC( + startingDate.getUTCFullYear(), + startingDate.getUTCMonth() + i, + startingDate.getUTCDate(), + startingDate.getUTCHours(), + ) / 1000, + ).toString(); + + const vestedFraction = + i == 0 + ? startingFraction.toString() + : (startingFraction + Math.round((i * (10000 - startingFraction)) / (trancheCount - 1))).toString(); + + tranches.push({ time, - vestedFraction - }) - } + vestedFraction, + }); + } - return tranches -} + return tranches; +}; export const lastBlockTime = async () => { - return BigInt(await time.latest()) -} + return BigInt(await time.latest()); +}; diff --git a/packages/hardhat/tsconfig.json b/packages/hardhat/tsconfig.json index e5f1a640..574e785c 100644 --- a/packages/hardhat/tsconfig.json +++ b/packages/hardhat/tsconfig.json @@ -5,6 +5,7 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, - "skipLibCheck": true + "skipLibCheck": true, + "resolveJsonModule": true } } diff --git a/packages/hardhat/utils/index.d.ts b/packages/hardhat/utils/index.d.ts new file mode 100644 index 00000000..c10cdb1a --- /dev/null +++ b/packages/hardhat/utils/index.d.ts @@ -0,0 +1,2 @@ +// utils/index.d.ts +export function buildIpfsUri(uri: string): string; \ No newline at end of file diff --git a/packages/hardhat/utils/index.js b/packages/hardhat/utils/index.js new file mode 100644 index 00000000..4ce3077d --- /dev/null +++ b/packages/hardhat/utils/index.js @@ -0,0 +1,15 @@ +const config = require("../config"); + +const buildIpfsUri = cid => `ipfs://${cid}`; + +const getDefaultSaleUri = () => buildIpfsUri(config.campaignCIDs.basicSale); + +const assertEnv = name => { + const env = process.env[name]; + + if (env == undefined) throw new Error(`environmental variable ${name} is undefined`); + + return env; +}; + +module.exports = { buildIpfsUri, getDefaultSaleUri }; diff --git a/packages/nextjs/contracts/deployedContracts.ts b/packages/nextjs/contracts/deployedContracts.ts index 8a6baeaa..b0491a2c 100644 --- a/packages/nextjs/contracts/deployedContracts.ts +++ b/packages/nextjs/contracts/deployedContracts.ts @@ -5,30 +5,20 @@ import { GenericContractsDeclaration } from "~~/utils/scaffold-eth/contract"; const deployedContracts = { - 31337: { - ContinuousVestingMerkleDistributor: { - address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + 1: { + FlatPriceSaleFactory_v_2_1: { + address: "0x70E0E5a16c981eFF0720f226A2E8ff418B5f3954", abi: [ - { - inputs: [], - stateMutability: "nonpayable", - type: "constructor", - }, - { - inputs: [], - name: "InvalidShortString", - type: "error", - }, { inputs: [ { - internalType: "string", - name: "str", - type: "string", + internalType: "address", + name: "_implementation", + type: "address", }, ], - name: "StringTooLong", - type: "error", + stateMutability: "nonpayable", + type: "constructor", }, { anonymous: false, @@ -36,87 +26,238 @@ const deployedContracts = { { indexed: true, internalType: "address", - name: "beneficiary", + name: "implementation", type: "address", }, { + indexed: true, + internalType: "contract FlatPriceSale_v_2_1", + name: "clone", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], indexed: false, - internalType: "int256", - name: "amount", - type: "int256", + internalType: "struct Config", + name: "config", + type: "tuple", }, - ], - name: "Adjust", - type: "event", - }, - { - anonymous: false, - inputs: [ { - indexed: true, - internalType: "address", - name: "owner", - type: "address", + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", }, { - indexed: true, - internalType: "address", - name: "spender", + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", type: "address", }, { indexed: false, - internalType: "uint256", - name: "value", - type: "uint256", + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", }, ], - name: "Approval", + name: "NewSale", type: "event", }, { - anonymous: false, - inputs: [ + inputs: [], + name: "VERSION", + outputs: [ { - indexed: true, - internalType: "address", - name: "beneficiary", - type: "address", + internalType: "string", + name: "", + type: "string", }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "implementation", + outputs: [ { - indexed: false, - internalType: "uint256", - name: "amount", - type: "uint256", + internalType: "address", + name: "", + type: "address", }, ], - name: "Claim", - type: "event", + stateMutability: "view", + type: "function", }, { - anonymous: false, inputs: [ { - indexed: true, internalType: "address", - name: "delegator", + name: "_owner", type: "address", }, { - indexed: true, - internalType: "address", - name: "fromDelegate", + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", type: "address", }, { - indexed: true, - internalType: "address", - name: "toDelegate", + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "newSale", + outputs: [ + { + internalType: "contract FlatPriceSale_v_2_1", + name: "sale", type: "address", }, ], - name: "DelegateChanged", - type: "event", + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + FlatPriceSale_v_2_1: { + address: "0x57c08f6827DC9A88b253830D73E0d8314b32E8D1", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "_feeBips", + type: "uint256", + }, + { + internalType: "address payable", + name: "_feeRecipient", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", }, { anonymous: false, @@ -124,29 +265,35 @@ const deployedContracts = { { indexed: true, internalType: "address", - name: "delegate", + name: "buyer", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "token", type: "address", }, { indexed: false, internalType: "uint256", - name: "previousBalance", + name: "baseCurrencyValue", type: "uint256", }, { indexed: false, internalType: "uint256", - name: "newBalance", + name: "tokenValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenFee", type: "uint256", }, ], - name: "DelegateVotesChanged", - type: "event", - }, - { - anonymous: false, - inputs: [], - name: "EIP712DomainChanged", + name: "Buy", type: "event", }, { @@ -154,49 +301,96 @@ const deployedContracts = { inputs: [ { indexed: true, - internalType: "address", - name: "beneficiary", + internalType: "address payable", + name: "feeRecipient", type: "address", }, { indexed: false, internalType: "uint256", - name: "total", + name: "feeBips", type: "uint256", }, ], - name: "InitializeDistributionRecord", + name: "ImplementationConstructor", type: "event", }, { anonymous: false, inputs: [ { - indexed: true, - internalType: "contract IERC20", - name: "token", - type: "address", - }, - { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], indexed: false, - internalType: "uint256", - name: "total", - type: "uint256", + internalType: "struct Config", + name: "config", + type: "tuple", }, { indexed: false, internalType: "string", - name: "uri", + name: "baseCurrency", type: "string", }, { indexed: false, - internalType: "uint256", - name: "fractionDenominator", - type: "uint256", + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", }, ], - name: "InitializeDistributor", + name: "Initialize", type: "event", }, { @@ -236,115 +430,43 @@ const deployedContracts = { inputs: [ { indexed: false, - internalType: "uint256", - name: "start", - type: "uint256", + internalType: "address", + name: "distributor", + type: "address", }, + ], + name: "RegisterDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ { indexed: false, - internalType: "uint256", - name: "cliff", - type: "uint256", - }, - { - indexed: false, - internalType: "uint256", - name: "end", - type: "uint256", - }, - ], - name: "SetContinuousVesting", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "uint160", - name: "maxDelayTime", - type: "uint160", - }, - ], - name: "SetDelay", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "bytes32", - name: "merkleRoot", - type: "bytes32", - }, - ], - name: "SetMerkleRoot", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "address", - name: "recipient", - type: "address", - }, - ], - name: "SetSweepRecipient", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "contract IERC20", + internalType: "contract IERC20Upgradeable", name: "token", type: "address", }, - ], - name: "SetToken", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "uint256", - name: "total", - type: "uint256", - }, - ], - name: "SetTotal", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "string", - name: "uri", - type: "string", - }, - ], - name: "SetUri", - type: "event", - }, - { - anonymous: false, - inputs: [ { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], indexed: false, - internalType: "uint256", - name: "voteFactor", - type: "uint256", + internalType: "struct PaymentTokenInfo", + name: "paymentTokenInfo", + type: "tuple", }, ], - name: "SetVoteFactor", + name: "SetPaymentTokenInfo", type: "event", }, { @@ -383,30 +505,65 @@ const deployedContracts = { anonymous: false, inputs: [ { - indexed: true, - internalType: "address", - name: "from", - type: "address", - }, - { - indexed: true, - internalType: "address", - name: "to", - type: "address", - }, - { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], indexed: false, - internalType: "uint256", - name: "value", - type: "uint256", + internalType: "struct Config", + name: "config", + type: "tuple", }, ], - name: "Transfer", + name: "Update", type: "event", }, { inputs: [], - name: "CLOCK_MODE", + name: "VERSION", outputs: [ { internalType: "string", @@ -419,57 +576,59 @@ const deployedContracts = { }, { inputs: [], - name: "DOMAIN_SEPARATOR", + name: "baseCurrency", outputs: [ { - internalType: "bytes32", + internalType: "string", name: "", - type: "bytes32", + type: "string", }, ], stateMutability: "view", type: "function", }, { - inputs: [], - name: "NAME", - outputs: [ + inputs: [ { - internalType: "string", - name: "", - type: "string", + internalType: "bytes", + name: "data", + type: "bytes", }, - ], - stateMutability: "pure", - type: "function", - }, - { - inputs: [], - name: "VERSION", - outputs: [ { - internalType: "uint256", - name: "", - type: "uint256", + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", }, ], - stateMutability: "pure", + name: "buyWithNative", + outputs: [], + stateMutability: "payable", type: "function", }, { inputs: [ { - internalType: "address", - name: "beneficiary", + internalType: "contract IERC20Upgradeable", + name: "token", type: "address", }, { - internalType: "int256", - name: "amount", - type: "int256", + internalType: "uint256", + name: "quantity", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", }, ], - name: "adjust", + name: "buyWithToken", outputs: [], stateMutability: "nonpayable", type: "function", @@ -478,16 +637,11 @@ const deployedContracts = { inputs: [ { internalType: "address", - name: "owner", - type: "address", - }, - { - internalType: "address", - name: "spender", + name: "user", type: "address", }, ], - name: "allowance", + name: "buyerTotal", outputs: [ { internalType: "uint256", @@ -499,38 +653,86 @@ const deployedContracts = { type: "function", }, { - inputs: [ + inputs: [], + name: "config", + outputs: [ { - internalType: "address", - name: "spender", + internalType: "address payable", + name: "recipient", type: "address", }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, { internalType: "uint256", - name: "amount", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", type: "uint256", }, + { + internalType: "string", + name: "URI", + type: "string", + }, ], - name: "approve", + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "generatePseudorandomValue", outputs: [ { - internalType: "bool", + internalType: "uint160", name: "", - type: "bool", + type: "uint160", }, ], - stateMutability: "nonpayable", + stateMutability: "view", type: "function", }, { inputs: [ { internalType: "address", - name: "account", + name: "buyer", type: "address", }, ], - name: "balanceOf", + name: "getFairQueueTime", outputs: [ { internalType: "uint256", @@ -544,32 +746,46 @@ const deployedContracts = { { inputs: [ { - internalType: "address", - name: "account", + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", type: "address", }, - { - internalType: "uint32", - name: "pos", - type: "uint32", - }, ], - name: "checkpoints", + name: "getOraclePrice", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "getPaymentToken", outputs: [ { components: [ { - internalType: "uint32", - name: "fromBlock", - type: "uint32", + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", }, { - internalType: "uint224", - name: "votes", - type: "uint224", + internalType: "uint8", + name: "decimals", + type: "uint8", }, ], - internalType: "struct ERC20Votes.Checkpoint", + internalType: "struct PaymentTokenInfo", name: "", type: "tuple", }, @@ -580,39 +796,106 @@ const deployedContracts = { { inputs: [ { - internalType: "uint256", - name: "index", - type: "uint256", + internalType: "address", + name: "_owner", + type: "address", }, { - internalType: "address", - name: "beneficiary", + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", type: "address", }, { - internalType: "uint256", - name: "totalAmount", - type: "uint256", + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", }, { - internalType: "bytes32[]", - name: "merkleProof", - type: "bytes32[]", + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", }, ], - name: "claim", + name: "initialize", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [], - name: "claimed", + name: "isOpen", outputs: [ { - internalType: "uint256", + internalType: "bool", name: "", - type: "uint256", + type: "bool", }, ], stateMutability: "view", @@ -620,189 +903,215 @@ const deployedContracts = { }, { inputs: [], - name: "clock", + name: "isOver", outputs: [ { - internalType: "uint48", + internalType: "bool", name: "", - type: "uint48", + type: "bool", }, ], stateMutability: "view", type: "function", }, { - inputs: [], - name: "decimals", + inputs: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "isValidMerkleProof", outputs: [ { - internalType: "uint8", + internalType: "bool", name: "", - type: "uint8", + type: "bool", }, ], - stateMutability: "view", + stateMutability: "pure", type: "function", }, { - inputs: [ + inputs: [], + name: "metrics", + outputs: [ { - internalType: "address", - name: "spender", - type: "address", + internalType: "uint256", + name: "purchaseCount", + type: "uint256", }, { internalType: "uint256", - name: "subtractedValue", + name: "buyerCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseTotal", type: "uint256", }, ], - name: "decreaseAllowance", + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nativeTokenPriceOracle", outputs: [ { - internalType: "bool", + internalType: "contract IOracleOrL2OracleWithSequencerCheck", name: "", - type: "bool", + type: "address", }, ], - stateMutability: "nonpayable", + stateMutability: "view", type: "function", }, { - inputs: [ + inputs: [], + name: "owner", + outputs: [ { internalType: "address", - name: "delegatee", + name: "", type: "address", }, ], - name: "delegate", - outputs: [], - stateMutability: "nonpayable", + stateMutability: "view", type: "function", }, { inputs: [ { - internalType: "address", - name: "delegatee", + internalType: "contract IERC20Upgradeable", + name: "", type: "address", }, + ], + name: "paymentTokens", + outputs: [ { - internalType: "uint256", - name: "nonce", - type: "uint256", - }, - { - internalType: "uint256", - name: "expiry", - type: "uint256", + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", }, { internalType: "uint8", - name: "v", + name: "decimals", type: "uint8", }, - { - internalType: "bytes32", - name: "r", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "s", - type: "bytes32", - }, ], - name: "delegateBySig", - outputs: [], - stateMutability: "nonpayable", + stateMutability: "view", type: "function", }, { inputs: [ { internalType: "address", - name: "account", + name: "dest", type: "address", }, ], - name: "delegates", + name: "payments", outputs: [ { - internalType: "address", + internalType: "uint256", name: "", - type: "address", + type: "uint256", }, ], stateMutability: "view", type: "function", }, { - inputs: [], - name: "distancePerSecond", - outputs: [ + inputs: [ { - internalType: "uint160", - name: "", - type: "uint160", + internalType: "address", + name: "_distributor", + type: "address", }, ], - stateMutability: "view", + name: "registerDistributor", + outputs: [], + stateMutability: "nonpayable", type: "function", }, { inputs: [], - name: "eip712Domain", - outputs: [ - { - internalType: "bytes1", - name: "fields", - type: "bytes1", - }, + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ { - internalType: "string", - name: "name", - type: "string", + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ { - internalType: "string", - name: "version", - type: "string", + internalType: "uint256", + name: "tokenQuantity", + type: "uint256", }, { internalType: "uint256", - name: "chainId", + name: "tokenDecimals", type: "uint256", }, { - internalType: "address", - name: "verifyingContract", + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", type: "address", }, + ], + name: "tokensToBaseCurrency", + outputs: [ { - internalType: "bytes32", - name: "salt", - type: "bytes32", - }, - { - internalType: "uint256[]", - name: "extensions", - type: "uint256[]", + internalType: "uint256", + name: "value", + type: "uint256", }, ], stateMutability: "view", type: "function", }, { - inputs: [ - { - internalType: "address", - name: "beneficiary", - type: "address", - }, - ], - name: "getClaimableAmount", + inputs: [], + name: "total", outputs: [ { internalType: "uint256", @@ -817,350 +1126,499 @@ const deployedContracts = { inputs: [ { internalType: "address", - name: "beneficiary", + name: "newOwner", type: "address", }, ], - name: "getDistributionRecord", - outputs: [ + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ { components: [ { - internalType: "bool", - name: "initialized", - type: "bool", + internalType: "address payable", + name: "recipient", + type: "address", }, { - internalType: "uint120", - name: "total", - type: "uint120", + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", }, { - internalType: "uint120", - name: "claimed", - type: "uint120", + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", }, ], - internalType: "struct DistributionRecord", - name: "", + internalType: "struct Config", + name: "_config", type: "tuple", }, ], - stateMutability: "view", + name: "update", + outputs: [], + stateMutability: "nonpayable", type: "function", }, { inputs: [ { - internalType: "address", - name: "user", + internalType: "address payable", + name: "payee", type: "address", }, ], - name: "getFairDelayTime", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", + name: "withdrawPayments", + outputs: [], + stateMutability: "nonpayable", type: "function", }, + ], + inheritedFunctions: {}, + }, + }, + 5: { + ContinuousVestingMerkleDistributor: { + address: "0x094532c110A955078c8e66eA16D1b090D4251Cda", + abi: [ { inputs: [], - name: "getFractionDenominator", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", + stateMutability: "nonpayable", + type: "constructor", }, { inputs: [], - name: "getMerkleRoot", - outputs: [ + name: "InvalidShortString", + type: "error", + }, + { + inputs: [ { - internalType: "bytes32", - name: "", - type: "bytes32", + internalType: "string", + name: "str", + type: "string", }, ], - stateMutability: "view", - type: "function", + name: "StringTooLong", + type: "error", }, { + anonymous: false, inputs: [ { - internalType: "uint256", - name: "timepoint", - type: "uint256", + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", }, - ], - name: "getPastTotalSupply", - outputs: [ { - internalType: "uint256", - name: "", - type: "uint256", + indexed: false, + internalType: "int256", + name: "amount", + type: "int256", }, ], - stateMutability: "view", - type: "function", + name: "Adjust", + type: "event", }, { + anonymous: false, inputs: [ { + indexed: true, internalType: "address", - name: "account", + name: "owner", type: "address", }, { - internalType: "uint256", - name: "timepoint", - type: "uint256", + indexed: true, + internalType: "address", + name: "spender", + type: "address", }, - ], - name: "getPastVotes", - outputs: [ { + indexed: false, internalType: "uint256", - name: "", + name: "value", type: "uint256", }, ], - stateMutability: "view", - type: "function", + name: "Approval", + type: "event", }, { - inputs: [], - name: "getSweepRecipient", - outputs: [ + anonymous: false, + inputs: [ { - internalType: "address payable", - name: "", + indexed: true, + internalType: "address", + name: "beneficiary", type: "address", }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "getTotalVotes", - outputs: [ { + indexed: false, internalType: "uint256", - name: "", + name: "amount", type: "uint256", }, ], - stateMutability: "view", - type: "function", + name: "Claim", + type: "event", }, { + anonymous: false, inputs: [ { + indexed: true, internalType: "address", - name: "beneficiary", + name: "delegator", type: "address", }, { - internalType: "uint256", - name: "time", - type: "uint256", + indexed: true, + internalType: "address", + name: "fromDelegate", + type: "address", }, - ], - name: "getVestedFraction", - outputs: [ { - internalType: "uint256", - name: "", - type: "uint256", + indexed: true, + internalType: "address", + name: "toDelegate", + type: "address", }, ], - stateMutability: "view", - type: "function", + name: "DelegateChanged", + type: "event", }, { - inputs: [], - name: "getVestingConfig", - outputs: [ + anonymous: false, + inputs: [ { - internalType: "uint256", - name: "", - type: "uint256", + indexed: true, + internalType: "address", + name: "delegate", + type: "address", }, { + indexed: false, internalType: "uint256", - name: "", + name: "previousBalance", type: "uint256", }, { + indexed: false, internalType: "uint256", - name: "", + name: "newBalance", type: "uint256", }, ], - stateMutability: "view", - type: "function", + name: "DelegateVotesChanged", + type: "event", }, { + anonymous: false, + inputs: [], + name: "EIP712DomainChanged", + type: "event", + }, + { + anonymous: false, inputs: [ { + indexed: true, internalType: "address", - name: "", + name: "beneficiary", type: "address", }, - ], - name: "getVoteFactor", - outputs: [ { + indexed: false, internalType: "uint256", - name: "", + name: "total", type: "uint256", }, ], - stateMutability: "view", - type: "function", + name: "InitializeDistributionRecord", + type: "event", }, { + anonymous: false, inputs: [ { - internalType: "address", - name: "account", + indexed: true, + internalType: "contract IERC20", + name: "token", type: "address", }, - ], - name: "getVotes", - outputs: [ { + indexed: false, internalType: "uint256", - name: "", + name: "total", type: "uint256", }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [ { - internalType: "address", - name: "spender", - type: "address", + indexed: false, + internalType: "string", + name: "uri", + type: "string", }, { + indexed: false, internalType: "uint256", - name: "addedValue", + name: "fractionDenominator", type: "uint256", }, ], - name: "increaseAllowance", - outputs: [ + name: "InitializeDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ { - internalType: "bool", - name: "", - type: "bool", + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", }, ], - stateMutability: "nonpayable", - type: "function", + name: "Initialized", + type: "event", }, { + anonymous: false, inputs: [ { - internalType: "contract IERC20", - name: "_token", + indexed: true, + internalType: "address", + name: "previousOwner", type: "address", }, { - internalType: "uint256", - name: "_total", - type: "uint256", - }, - { - internalType: "string", - name: "_uri", - type: "string", + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ { + indexed: false, internalType: "uint256", - name: "_start", + name: "start", type: "uint256", }, { + indexed: false, internalType: "uint256", - name: "_cliff", + name: "cliff", type: "uint256", }, { + indexed: false, internalType: "uint256", - name: "_end", + name: "end", type: "uint256", }, + ], + name: "SetContinuousVesting", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint160", + name: "maxDelayTime", + type: "uint160", + }, + ], + name: "SetDelay", + type: "event", + }, + { + anonymous: false, + inputs: [ { + indexed: false, internalType: "bytes32", - name: "_merkleRoot", + name: "merkleRoot", type: "bytes32", }, + ], + name: "SetMerkleRoot", + type: "event", + }, + { + anonymous: false, + inputs: [ { - internalType: "uint160", - name: "_maxDelayTime", - type: "uint160", + indexed: false, + internalType: "address", + name: "recipient", + type: "address", }, + ], + name: "SetSweepRecipient", + type: "event", + }, + { + anonymous: false, + inputs: [ { - internalType: "address", - name: "_owner", + indexed: true, + internalType: "contract IERC20", + name: "token", type: "address", }, ], - name: "initialize", - outputs: [], - stateMutability: "nonpayable", - type: "function", + name: "SetToken", + type: "event", }, { + anonymous: false, inputs: [ { + indexed: false, internalType: "uint256", - name: "index", + name: "total", + type: "uint256", + }, + ], + name: "SetTotal", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "string", + name: "uri", + type: "string", + }, + ], + name: "SetUri", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "voteFactor", + type: "uint256", + }, + ], + name: "SetVoteFactor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", type: "uint256", }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ { + indexed: true, internalType: "address", - name: "beneficiary", + name: "token", type: "address", }, { + indexed: false, internalType: "uint256", name: "amount", type: "uint256", }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, { - internalType: "bytes32[]", - name: "merkleProof", - type: "bytes32[]", + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", }, ], - name: "initializeDistributionRecord", - outputs: [], - stateMutability: "nonpayable", - type: "function", + name: "Transfer", + type: "event", }, { inputs: [], - name: "maxDelayTime", + name: "CLOCK_MODE", outputs: [ { - internalType: "uint160", + internalType: "string", name: "", - type: "uint160", + type: "string", }, ], stateMutability: "view", @@ -1168,26 +1626,33 @@ const deployedContracts = { }, { inputs: [], - name: "name", + name: "DOMAIN_SEPARATOR", outputs: [ { - internalType: "string", + internalType: "bytes32", name: "", - type: "string", + type: "bytes32", }, ], stateMutability: "view", type: "function", }, { - inputs: [ + inputs: [], + name: "NAME", + outputs: [ { - internalType: "address", - name: "owner", - type: "address", + internalType: "string", + name: "", + type: "string", }, ], - name: "nonces", + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "VERSION", outputs: [ { internalType: "uint256", @@ -1195,48 +1660,53 @@ const deployedContracts = { type: "uint256", }, ], - stateMutability: "view", + stateMutability: "pure", type: "function", }, { inputs: [ { internalType: "address", - name: "account", + name: "beneficiary", type: "address", }, - ], - name: "numCheckpoints", - outputs: [ { - internalType: "uint32", - name: "", - type: "uint32", + internalType: "int256", + name: "amount", + type: "int256", }, ], - stateMutability: "view", + name: "adjust", + outputs: [], + stateMutability: "nonpayable", type: "function", }, { - inputs: [], - name: "owner", - outputs: [ + inputs: [ { internalType: "address", - name: "", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", type: "address", }, ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], stateMutability: "view", type: "function", }, { inputs: [ - { - internalType: "address", - name: "owner", - type: "address", - }, { internalType: "address", name: "spender", @@ -1244,228 +1714,112 @@ const deployedContracts = { }, { internalType: "uint256", - name: "value", - type: "uint256", - }, - { - internalType: "uint256", - name: "deadline", + name: "amount", type: "uint256", }, - { - internalType: "uint8", - name: "v", - type: "uint8", - }, - { - internalType: "bytes32", - name: "r", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "s", - type: "bytes32", - }, ], - name: "permit", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "randomValue", + name: "approve", outputs: [ { - internalType: "uint160", + internalType: "bool", name: "", - type: "uint160", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "renounceOwnership", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "bytes32", - name: "_merkleRoot", - type: "bytes32", - }, - ], - name: "setMerkleRoot", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "address payable", - name: "_recipient", - type: "address", + type: "bool", }, ], - name: "setSweepRecipient", - outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [ { - internalType: "contract IERC20", - name: "_token", + internalType: "address", + name: "account", type: "address", }, ], - name: "setToken", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ + name: "balanceOf", + outputs: [ { internalType: "uint256", - name: "_total", + name: "", type: "uint256", }, ], - name: "setTotal", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "string", - name: "_uri", - type: "string", - }, - ], - name: "setUri", - outputs: [], - stateMutability: "nonpayable", + stateMutability: "view", type: "function", }, { inputs: [ { - internalType: "uint256", - name: "_start", - type: "uint256", - }, - { - internalType: "uint256", - name: "_cliff", - type: "uint256", + internalType: "address", + name: "account", + type: "address", }, { - internalType: "uint256", - name: "_end", - type: "uint256", + internalType: "uint32", + name: "pos", + type: "uint32", }, ], - name: "setVestingConfig", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ + name: "checkpoints", + outputs: [ { - internalType: "uint256", - name: "_voteFactor", - type: "uint256", + components: [ + { + internalType: "uint32", + name: "fromBlock", + type: "uint32", + }, + { + internalType: "uint224", + name: "votes", + type: "uint224", + }, + ], + internalType: "struct ERC20Votes.Checkpoint", + name: "", + type: "tuple", }, ], - name: "setVoteFactor", - outputs: [], - stateMutability: "nonpayable", + stateMutability: "view", type: "function", }, { inputs: [ { internalType: "uint256", - name: "amount", + name: "index", type: "uint256", }, - ], - name: "sweepNative", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "sweepNative", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "contract IERC20", - name: "token", - type: "address", - }, - ], - name: "sweepToken", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ { - internalType: "contract IERC20", - name: "token", + internalType: "address", + name: "beneficiary", type: "address", }, { internalType: "uint256", - name: "amount", + name: "totalAmount", type: "uint256", }, - ], - name: "sweepToken", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "symbol", - outputs: [ { - internalType: "string", - name: "", - type: "string", + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", }, ], - stateMutability: "view", + name: "claim", + outputs: [], + stateMutability: "nonpayable", type: "function", }, { inputs: [], - name: "token", + name: "claimed", outputs: [ { - internalType: "contract IERC20", + internalType: "uint256", name: "", - type: "address", + type: "uint256", }, ], stateMutability: "view", @@ -1473,12 +1827,12 @@ const deployedContracts = { }, { inputs: [], - name: "total", + name: "clock", outputs: [ { - internalType: "uint256", + internalType: "uint48", name: "", - type: "uint256", + type: "uint48", }, ], stateMutability: "view", @@ -1486,12 +1840,12 @@ const deployedContracts = { }, { inputs: [], - name: "totalSupply", + name: "decimals", outputs: [ { - internalType: "uint256", + internalType: "uint8", name: "", - type: "uint256", + type: "uint8", }, ], stateMutability: "view", @@ -1501,16 +1855,16 @@ const deployedContracts = { inputs: [ { internalType: "address", - name: "to", + name: "spender", type: "address", }, { internalType: "uint256", - name: "amount", + name: "subtractedValue", type: "uint256", }, ], - name: "transfer", + name: "decreaseAllowance", outputs: [ { internalType: "bool", @@ -1525,28 +1879,12 @@ const deployedContracts = { inputs: [ { internalType: "address", - name: "from", - type: "address", - }, - { - internalType: "address", - name: "to", + name: "delegatee", type: "address", }, - { - internalType: "uint256", - name: "amount", - type: "uint256", - }, - ], - name: "transferFrom", - outputs: [ - { - internalType: "bool", - name: "", - type: "bool", - }, ], + name: "delegate", + outputs: [], stateMutability: "nonpayable", type: "function", }, @@ -1554,304 +1892,19979 @@ const deployedContracts = { inputs: [ { internalType: "address", - name: "newOwner", + name: "delegatee", type: "address", }, - ], - name: "transferOwnership", - outputs: [], - stateMutability: "nonpayable", + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "expiry", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "delegateBySig", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "delegates", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "distancePerSecond", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "eip712Domain", + outputs: [ + { + internalType: "bytes1", + name: "fields", + type: "bytes1", + }, + { + internalType: "string", + name: "name", + type: "string", + }, + { + internalType: "string", + name: "version", + type: "string", + }, + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "address", + name: "verifyingContract", + type: "address", + }, + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "uint256[]", + name: "extensions", + type: "uint256[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "getClaimableAmount", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + ], + name: "getDistributionRecord", + outputs: [ + { + components: [ + { + internalType: "bool", + name: "initialized", + type: "bool", + }, + { + internalType: "uint120", + name: "total", + type: "uint120", + }, + { + internalType: "uint120", + name: "claimed", + type: "uint120", + }, + ], + internalType: "struct DistributionRecord", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "getFairDelayTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getFractionDenominator", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getMerkleRoot", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastTotalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getSweepRecipient", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getTotalVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + name: "getVestedFraction", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getVestingConfig", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "getVoteFactor", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "getVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "addedValue", + type: "uint256", + }, + ], + name: "increaseAllowance", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "uint256", + name: "_start", + type: "uint256", + }, + { + internalType: "uint256", + name: "_cliff", + type: "uint256", + }, + { + internalType: "uint256", + name: "_end", + type: "uint256", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", + }, + ], + name: "initializeDistributionRecord", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "maxDelayTime", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "nonces", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "numCheckpoints", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "uint256", + name: "deadline", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "permit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "randomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + ], + name: "setMerkleRoot", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "_recipient", + type: "address", + }, + ], + name: "setSweepRecipient", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + ], + name: "setToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + ], + name: "setTotal", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "string", + name: "_uri", + type: "string", + }, + ], + name: "setUri", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_start", + type: "uint256", + }, + { + internalType: "uint256", + name: "_cliff", + type: "uint256", + }, + { + internalType: "uint256", + name: "_end", + type: "uint256", + }, + ], + name: "setVestingConfig", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_voteFactor", + type: "uint256", + }, + ], + name: "setVoteFactor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "token", + outputs: [ + { + internalType: "contract IERC20", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "uri", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: { + CLOCK_MODE: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + DOMAIN_SEPARATOR: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + NAME: "contracts/claim/factory/ContinuousVestingInitializable.sol", + VERSION: "contracts/claim/factory/ContinuousVestingInitializable.sol", + adjust: "contracts/claim/factory/ContinuousVestingInitializable.sol", + allowance: "contracts/claim/factory/ContinuousVestingInitializable.sol", + approve: "contracts/claim/factory/ContinuousVestingInitializable.sol", + balanceOf: "contracts/claim/factory/ContinuousVestingInitializable.sol", + checkpoints: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + claimed: "contracts/claim/factory/ContinuousVestingInitializable.sol", + clock: "contracts/claim/factory/ContinuousVestingInitializable.sol", + decimals: "contracts/claim/factory/ContinuousVestingInitializable.sol", + decreaseAllowance: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + delegate: "contracts/claim/factory/ContinuousVestingInitializable.sol", + delegateBySig: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + delegates: "contracts/claim/factory/ContinuousVestingInitializable.sol", + distancePerSecond: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + eip712Domain: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getClaimableAmount: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getDistributionRecord: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getFairDelayTime: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getFractionDenominator: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getPastTotalSupply: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getPastVotes: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getSweepRecipient: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getTotalVotes: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getVestedFraction: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getVestingConfig: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getVoteFactor: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getVotes: "contracts/claim/factory/ContinuousVestingInitializable.sol", + increaseAllowance: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + maxDelayTime: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + name: "contracts/claim/factory/ContinuousVestingInitializable.sol", + nonces: "contracts/claim/factory/ContinuousVestingInitializable.sol", + numCheckpoints: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + owner: "contracts/claim/factory/ContinuousVestingInitializable.sol", + permit: "contracts/claim/factory/ContinuousVestingInitializable.sol", + randomValue: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + renounceOwnership: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + setSweepRecipient: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + setToken: "contracts/claim/factory/ContinuousVestingInitializable.sol", + setTotal: "contracts/claim/factory/ContinuousVestingInitializable.sol", + setUri: "contracts/claim/factory/ContinuousVestingInitializable.sol", + setVestingConfig: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + setVoteFactor: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + sweepNative: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + sweepToken: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + symbol: "contracts/claim/factory/ContinuousVestingInitializable.sol", + token: "contracts/claim/factory/ContinuousVestingInitializable.sol", + total: "contracts/claim/factory/ContinuousVestingInitializable.sol", + totalSupply: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + transfer: "contracts/claim/factory/ContinuousVestingInitializable.sol", + transferFrom: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + transferOwnership: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + uri: "contracts/claim/factory/ContinuousVestingInitializable.sol", + getMerkleRoot: "contracts/claim/factory/MerkleSetInitializable.sol", + }, + }, + ContinuousVestingMerkleDistributorFactory: { + address: "0x9d06531B1a30b29FA11629e051C216ff55243581", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "DistributorDeployed", + type: "event", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "uint256", + name: "_start", + type: "uint256", + }, + { + internalType: "uint256", + name: "_cliff", + type: "uint256", + }, + { + internalType: "uint256", + name: "_end", + type: "uint256", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "deployDistributor", + outputs: [ + { + internalType: "contract ContinuousVestingMerkleDistributor", + name: "distributor", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "distributors", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getImplementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "uint256", + name: "_start", + type: "uint256", + }, + { + internalType: "uint256", + name: "_cliff", + type: "uint256", + }, + { + internalType: "uint256", + name: "_end", + type: "uint256", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "predictDistributorAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + PerAddressContinuousVestingMerkleDistributor: { + address: "0x181e6745d984E75dD079499e70feEd0721656d96", + abi: [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "InvalidShortString", + type: "error", + }, + { + inputs: [ + { + internalType: "string", + name: "str", + type: "string", + }, + ], + name: "StringTooLong", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "int256", + name: "amount", + type: "int256", + }, + ], + name: "Adjust", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Claim", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "delegator", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "fromDelegate", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "toDelegate", + type: "address", + }, + ], + name: "DelegateChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "delegate", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "previousBalance", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newBalance", + type: "uint256", + }, + ], + name: "DelegateVotesChanged", + type: "event", + }, + { + anonymous: false, + inputs: [], + name: "EIP712DomainChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + ], + name: "InitializeDistributionRecord", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + { + indexed: false, + internalType: "string", + name: "uri", + type: "string", + }, + { + indexed: false, + internalType: "uint256", + name: "fractionDenominator", + type: "uint256", + }, + ], + name: "InitializeDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint160", + name: "maxDelayTime", + type: "uint160", + }, + ], + name: "SetDelay", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "SetMerkleRoot", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "recipient", + type: "address", + }, + ], + name: "SetSweepRecipient", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "contract IERC20", + name: "token", + type: "address", + }, + ], + name: "SetToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + ], + name: "SetTotal", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "string", + name: "uri", + type: "string", + }, + ], + name: "SetUri", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "voteFactor", + type: "uint256", + }, + ], + name: "SetVoteFactor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + inputs: [], + name: "CLOCK_MODE", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "DOMAIN_SEPARATOR", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "NAME", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "int256", + name: "amount", + type: "int256", + }, + ], + name: "adjust", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "approve", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint32", + name: "pos", + type: "uint32", + }, + ], + name: "checkpoints", + outputs: [ + { + components: [ + { + internalType: "uint32", + name: "fromBlock", + type: "uint32", + }, + { + internalType: "uint224", + name: "votes", + type: "uint224", + }, + ], + internalType: "struct ERC20Votes.Checkpoint", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "totalAmount", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", + }, + ], + name: "claim", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "claimed", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "clock", + outputs: [ + { + internalType: "uint48", + name: "", + type: "uint48", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "subtractedValue", + type: "uint256", + }, + ], + name: "decreaseAllowance", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "delegatee", + type: "address", + }, + ], + name: "delegate", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "delegatee", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "expiry", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "delegateBySig", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "delegates", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "distancePerSecond", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "eip712Domain", + outputs: [ + { + internalType: "bytes1", + name: "fields", + type: "bytes1", + }, + { + internalType: "string", + name: "name", + type: "string", + }, + { + internalType: "string", + name: "version", + type: "string", + }, + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "address", + name: "verifyingContract", + type: "address", + }, + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "uint256[]", + name: "extensions", + type: "uint256[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "getClaimableAmount", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + ], + name: "getDistributionRecord", + outputs: [ + { + components: [ + { + internalType: "bool", + name: "initialized", + type: "bool", + }, + { + internalType: "uint120", + name: "total", + type: "uint120", + }, + { + internalType: "uint120", + name: "claimed", + type: "uint120", + }, + ], + internalType: "struct DistributionRecord", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "getFairDelayTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getFractionDenominator", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getMerkleRoot", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastTotalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getSweepRecipient", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getTotalVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "getVestedFraction", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "getVoteFactor", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "getVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "addedValue", + type: "uint256", + }, + ], + name: "increaseAllowance", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", + }, + ], + name: "initializeDistributionRecord", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "maxDelayTime", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "nonces", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "numCheckpoints", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "uint256", + name: "deadline", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "permit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "randomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + ], + name: "setMerkleRoot", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "_recipient", + type: "address", + }, + ], + name: "setSweepRecipient", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + ], + name: "setToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + ], + name: "setTotal", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "string", + name: "_uri", + type: "string", + }, + ], + name: "setUri", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_voteFactor", + type: "uint256", + }, + ], + name: "setVoteFactor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "token", + outputs: [ + { + internalType: "contract IERC20", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "uri", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: { + CLOCK_MODE: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + DOMAIN_SEPARATOR: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + NAME: "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + VERSION: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + adjust: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + allowance: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + approve: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + balanceOf: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + checkpoints: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + claimed: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + clock: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + decimals: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + decreaseAllowance: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + delegate: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + delegateBySig: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + delegates: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + distancePerSecond: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + eip712Domain: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getClaimableAmount: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getDistributionRecord: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getFairDelayTime: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getFractionDenominator: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getPastTotalSupply: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getPastVotes: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getSweepRecipient: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getTotalVotes: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getVestedFraction: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getVoteFactor: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getVotes: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + increaseAllowance: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + maxDelayTime: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + name: "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + nonces: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + numCheckpoints: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + owner: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + permit: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + randomValue: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + renounceOwnership: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + setSweepRecipient: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + setToken: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + setTotal: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + setUri: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + setVoteFactor: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + sweepNative: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + sweepToken: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + symbol: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + token: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + total: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + totalSupply: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + transfer: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + transferFrom: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + transferOwnership: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + uri: "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getMerkleRoot: "contracts/claim/factory/MerkleSetInitializable.sol", + }, + }, + PerAddressContinuousVestingMerkleDistributorFactory: { + address: "0xc65FCD302ED596115C6A75651bD6c75b9c07DDe2", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "DistributorDeployed", + type: "event", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "deployDistributor", + outputs: [ + { + internalType: + "contract PerAddressContinuousVestingMerkleDistributor", + name: "distributor", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "distributors", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getImplementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "predictDistributorAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + PerAddressTrancheVestingMerkleDistributor: { + address: "0x66A34FdfcF94bf319fC0A4A2B3337c0A9bB6B741", + abi: [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "InvalidShortString", + type: "error", + }, + { + inputs: [ + { + internalType: "string", + name: "str", + type: "string", + }, + ], + name: "StringTooLong", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "int256", + name: "amount", + type: "int256", + }, + ], + name: "Adjust", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Claim", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "delegator", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "fromDelegate", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "toDelegate", + type: "address", + }, + ], + name: "DelegateChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "delegate", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "previousBalance", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newBalance", + type: "uint256", + }, + ], + name: "DelegateVotesChanged", + type: "event", + }, + { + anonymous: false, + inputs: [], + name: "EIP712DomainChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + ], + name: "InitializeDistributionRecord", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + { + indexed: false, + internalType: "string", + name: "uri", + type: "string", + }, + { + indexed: false, + internalType: "uint256", + name: "fractionDenominator", + type: "uint256", + }, + ], + name: "InitializeDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint160", + name: "maxDelayTime", + type: "uint160", + }, + ], + name: "SetDelay", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "SetMerkleRoot", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "recipient", + type: "address", + }, + ], + name: "SetSweepRecipient", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "contract IERC20", + name: "token", + type: "address", + }, + ], + name: "SetToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + ], + name: "SetTotal", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + indexed: false, + internalType: "uint128", + name: "time", + type: "uint128", + }, + { + indexed: false, + internalType: "uint128", + name: "VestedFraction", + type: "uint128", + }, + ], + name: "SetTranche", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "string", + name: "uri", + type: "string", + }, + ], + name: "SetUri", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "voteFactor", + type: "uint256", + }, + ], + name: "SetVoteFactor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + inputs: [], + name: "CLOCK_MODE", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "DOMAIN_SEPARATOR", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "NAME", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "int256", + name: "amount", + type: "int256", + }, + ], + name: "adjust", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "approve", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint32", + name: "pos", + type: "uint32", + }, + ], + name: "checkpoints", + outputs: [ + { + components: [ + { + internalType: "uint32", + name: "fromBlock", + type: "uint32", + }, + { + internalType: "uint224", + name: "votes", + type: "uint224", + }, + ], + internalType: "struct ERC20Votes.Checkpoint", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "totalAmount", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", + }, + ], + name: "claim", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "claimed", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "clock", + outputs: [ + { + internalType: "uint48", + name: "", + type: "uint48", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "subtractedValue", + type: "uint256", + }, + ], + name: "decreaseAllowance", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "delegatee", + type: "address", + }, + ], + name: "delegate", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "delegatee", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "expiry", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "delegateBySig", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "delegates", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "distancePerSecond", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "eip712Domain", + outputs: [ + { + internalType: "bytes1", + name: "fields", + type: "bytes1", + }, + { + internalType: "string", + name: "name", + type: "string", + }, + { + internalType: "string", + name: "version", + type: "string", + }, + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "address", + name: "verifyingContract", + type: "address", + }, + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "uint256[]", + name: "extensions", + type: "uint256[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "getClaimableAmount", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + ], + name: "getDistributionRecord", + outputs: [ + { + components: [ + { + internalType: "bool", + name: "initialized", + type: "bool", + }, + { + internalType: "uint120", + name: "total", + type: "uint120", + }, + { + internalType: "uint120", + name: "claimed", + type: "uint120", + }, + ], + internalType: "struct DistributionRecord", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "getFairDelayTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getFractionDenominator", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getMerkleRoot", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastTotalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getSweepRecipient", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getTotalVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "getTranche", + outputs: [ + { + components: [ + { + internalType: "uint128", + name: "time", + type: "uint128", + }, + { + internalType: "uint128", + name: "vestedFraction", + type: "uint128", + }, + ], + internalType: "struct Tranche", + name: "", + type: "tuple", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "getTranches", + outputs: [ + { + components: [ + { + internalType: "uint128", + name: "time", + type: "uint128", + }, + { + internalType: "uint128", + name: "vestedFraction", + type: "uint128", + }, + ], + internalType: "struct Tranche[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "getVestedFraction", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "getVoteFactor", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "getVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "addedValue", + type: "uint256", + }, + ], + name: "increaseAllowance", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", + }, + ], + name: "initializeDistributionRecord", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "maxDelayTime", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "nonces", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "numCheckpoints", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "uint256", + name: "deadline", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "permit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "randomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + ], + name: "setMerkleRoot", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "_recipient", + type: "address", + }, + ], + name: "setSweepRecipient", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + ], + name: "setToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + ], + name: "setTotal", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "uint128", + name: "time", + type: "uint128", + }, + { + internalType: "uint128", + name: "vestedFraction", + type: "uint128", + }, + ], + internalType: "struct Tranche[]", + name: "", + type: "tuple[]", + }, + ], + name: "setTranches", + outputs: [], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "string", + name: "_uri", + type: "string", + }, + ], + name: "setUri", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_voteFactor", + type: "uint256", + }, + ], + name: "setVoteFactor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "token", + outputs: [ + { + internalType: "contract IERC20", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "uri", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: { + CLOCK_MODE: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + DOMAIN_SEPARATOR: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + NAME: "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + VERSION: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + adjust: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + allowance: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + approve: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + balanceOf: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + checkpoints: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + claimed: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + clock: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + decimals: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + decreaseAllowance: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + delegate: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + delegateBySig: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + delegates: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + distancePerSecond: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + eip712Domain: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getClaimableAmount: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getDistributionRecord: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getFairDelayTime: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getFractionDenominator: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getPastTotalSupply: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getPastVotes: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getSweepRecipient: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getTotalVotes: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getTranche: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getTranches: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getVestedFraction: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getVoteFactor: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getVotes: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + increaseAllowance: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + maxDelayTime: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + name: "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + nonces: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + numCheckpoints: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + owner: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + permit: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + randomValue: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + renounceOwnership: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setSweepRecipient: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setToken: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setTotal: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setTranches: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setUri: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setVoteFactor: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + sweepNative: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + sweepToken: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + symbol: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + token: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + total: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + totalSupply: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + transfer: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + transferFrom: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + transferOwnership: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + uri: "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getMerkleRoot: "contracts/claim/factory/MerkleSetInitializable.sol", + }, + }, + PerAddressTrancheVestingMerkleDistributorFactory: { + address: "0xaE83c1978E86f7001dB81B1E036f87d4F2937EDF", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "DistributorDeployed", + type: "event", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "deployDistributor", + outputs: [ + { + internalType: + "contract PerAddressTrancheVestingMerkleDistributor", + name: "distributor", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "distributors", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getImplementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "predictDistributorAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + }, + 10: { + FlatPriceSaleFactory_v_2_1: { + address: "0x33f439DB3c004A0E6398FcCcf9f81d2637c226f9", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "_implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + { + indexed: true, + internalType: "contract FlatPriceSale_v_2_1", + name: "clone", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "NewSale", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "implementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "newSale", + outputs: [ + { + internalType: "contract FlatPriceSale_v_2_1", + name: "sale", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + FlatPriceSale_v_2_1: { + address: "0x21896f02b7B33A8da6eC42a01D8C450D7A868A35", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "_feeBips", + type: "uint256", + }, + { + internalType: "address payable", + name: "_feeRecipient", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "buyer", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "baseCurrencyValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenFee", + type: "uint256", + }, + ], + name: "Buy", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address payable", + name: "feeRecipient", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "feeBips", + type: "uint256", + }, + ], + name: "ImplementationConstructor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "Initialize", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "RegisterDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + indexed: false, + internalType: "struct PaymentTokenInfo", + name: "paymentTokenInfo", + type: "tuple", + }, + ], + name: "SetPaymentTokenInfo", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + ], + name: "Update", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "baseCurrency", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithNative", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "quantity", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "buyerTotal", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "config", + outputs: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "generatePseudorandomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "buyer", + type: "address", + }, + ], + name: "getFairQueueTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "getOraclePrice", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "getPaymentToken", + outputs: [ + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + internalType: "struct PaymentTokenInfo", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isOpen", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isOver", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "isValidMerkleProof", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "metrics", + outputs: [ + { + internalType: "uint256", + name: "purchaseCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "buyerCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseTotal", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nativeTokenPriceOracle", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "", + type: "address", + }, + ], + name: "paymentTokens", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "dest", + type: "address", + }, + ], + name: "payments", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_distributor", + type: "address", + }, + ], + name: "registerDistributor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenQuantity", + type: "uint256", + }, + { + internalType: "uint256", + name: "tokenDecimals", + type: "uint256", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "tokensToBaseCurrency", + outputs: [ + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + ], + name: "update", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "payee", + type: "address", + }, + ], + name: "withdrawPayments", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + }, + 56: { + FlatPriceSaleFactory_v_2_1: { + address: "0x700A81a525E259f13233c8da11b1d4632f3fdF91", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "_implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + { + indexed: true, + internalType: "contract FlatPriceSale_v_2_1", + name: "clone", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "NewSale", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "implementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "newSale", + outputs: [ + { + internalType: "contract FlatPriceSale_v_2_1", + name: "sale", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + FlatPriceSale_v_2_1: { + address: "0x33f439DB3c004A0E6398FcCcf9f81d2637c226f9", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "_feeBips", + type: "uint256", + }, + { + internalType: "address payable", + name: "_feeRecipient", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "buyer", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "baseCurrencyValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenFee", + type: "uint256", + }, + ], + name: "Buy", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address payable", + name: "feeRecipient", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "feeBips", + type: "uint256", + }, + ], + name: "ImplementationConstructor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "Initialize", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "RegisterDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + indexed: false, + internalType: "struct PaymentTokenInfo", + name: "paymentTokenInfo", + type: "tuple", + }, + ], + name: "SetPaymentTokenInfo", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + ], + name: "Update", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "baseCurrency", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithNative", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "quantity", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "buyerTotal", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "config", + outputs: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "generatePseudorandomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "buyer", + type: "address", + }, + ], + name: "getFairQueueTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "getOraclePrice", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "getPaymentToken", + outputs: [ + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + internalType: "struct PaymentTokenInfo", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isOpen", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isOver", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "isValidMerkleProof", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "metrics", + outputs: [ + { + internalType: "uint256", + name: "purchaseCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "buyerCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseTotal", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nativeTokenPriceOracle", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "", + type: "address", + }, + ], + name: "paymentTokens", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "dest", + type: "address", + }, + ], + name: "payments", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_distributor", + type: "address", + }, + ], + name: "registerDistributor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenQuantity", + type: "uint256", + }, + { + internalType: "uint256", + name: "tokenDecimals", + type: "uint256", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "tokensToBaseCurrency", + outputs: [ + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + ], + name: "update", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "payee", + type: "address", + }, + ], + name: "withdrawPayments", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + }, + 97: { + FlatPriceSaleFactory_v_2_1: { + address: "0x700A81a525E259f13233c8da11b1d4632f3fdF91", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "_implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + { + indexed: true, + internalType: "contract FlatPriceSale_v_2_1", + name: "clone", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "NewSale", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "implementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "newSale", + outputs: [ + { + internalType: "contract FlatPriceSale_v_2_1", + name: "sale", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + FlatPriceSale_v_2_1: { + address: "0x33f439DB3c004A0E6398FcCcf9f81d2637c226f9", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "_feeBips", + type: "uint256", + }, + { + internalType: "address payable", + name: "_feeRecipient", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "buyer", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "baseCurrencyValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenFee", + type: "uint256", + }, + ], + name: "Buy", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address payable", + name: "feeRecipient", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "feeBips", + type: "uint256", + }, + ], + name: "ImplementationConstructor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "Initialize", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "RegisterDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + indexed: false, + internalType: "struct PaymentTokenInfo", + name: "paymentTokenInfo", + type: "tuple", + }, + ], + name: "SetPaymentTokenInfo", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + ], + name: "Update", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "baseCurrency", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithNative", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "quantity", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "buyerTotal", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "config", + outputs: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "generatePseudorandomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "buyer", + type: "address", + }, + ], + name: "getFairQueueTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "getOraclePrice", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "getPaymentToken", + outputs: [ + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + internalType: "struct PaymentTokenInfo", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isOpen", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isOver", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "isValidMerkleProof", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "metrics", + outputs: [ + { + internalType: "uint256", + name: "purchaseCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "buyerCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseTotal", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nativeTokenPriceOracle", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "", + type: "address", + }, + ], + name: "paymentTokens", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "dest", + type: "address", + }, + ], + name: "payments", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_distributor", + type: "address", + }, + ], + name: "registerDistributor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenQuantity", + type: "uint256", + }, + { + internalType: "uint256", + name: "tokenDecimals", + type: "uint256", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "tokensToBaseCurrency", + outputs: [ + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + ], + name: "update", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "payee", + type: "address", + }, + ], + name: "withdrawPayments", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + }, + 137: { + FlatPriceSaleFactory_v_2_1: { + address: "0x48B8c957A91a5f2f5f751163B96C1BA7d8c1f1a7", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "_implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + { + indexed: true, + internalType: "contract FlatPriceSale_v_2_1", + name: "clone", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "NewSale", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "implementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "newSale", + outputs: [ + { + internalType: "contract FlatPriceSale_v_2_1", + name: "sale", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + FlatPriceSale_v_2_1: { + address: "0xe12AA2502d536E6153a35341F897335E9B2e123F", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "_feeBips", + type: "uint256", + }, + { + internalType: "address payable", + name: "_feeRecipient", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "buyer", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "baseCurrencyValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenFee", + type: "uint256", + }, + ], + name: "Buy", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address payable", + name: "feeRecipient", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "feeBips", + type: "uint256", + }, + ], + name: "ImplementationConstructor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "Initialize", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "RegisterDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + indexed: false, + internalType: "struct PaymentTokenInfo", + name: "paymentTokenInfo", + type: "tuple", + }, + ], + name: "SetPaymentTokenInfo", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + ], + name: "Update", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "baseCurrency", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithNative", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "quantity", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "buyerTotal", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "config", + outputs: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "generatePseudorandomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "buyer", + type: "address", + }, + ], + name: "getFairQueueTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "getOraclePrice", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "getPaymentToken", + outputs: [ + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + internalType: "struct PaymentTokenInfo", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isOpen", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isOver", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "isValidMerkleProof", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "metrics", + outputs: [ + { + internalType: "uint256", + name: "purchaseCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "buyerCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseTotal", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nativeTokenPriceOracle", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "", + type: "address", + }, + ], + name: "paymentTokens", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "dest", + type: "address", + }, + ], + name: "payments", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_distributor", + type: "address", + }, + ], + name: "registerDistributor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenQuantity", + type: "uint256", + }, + { + internalType: "uint256", + name: "tokenDecimals", + type: "uint256", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "tokensToBaseCurrency", + outputs: [ + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + ], + name: "update", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "payee", + type: "address", + }, + ], + name: "withdrawPayments", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + }, + 420: {}, + 31337: { + ContinuousVestingMerkleDistributor: { + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + abi: [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "InvalidShortString", + type: "error", + }, + { + inputs: [ + { + internalType: "string", + name: "str", + type: "string", + }, + ], + name: "StringTooLong", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "int256", + name: "amount", + type: "int256", + }, + ], + name: "Adjust", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Claim", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "delegator", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "fromDelegate", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "toDelegate", + type: "address", + }, + ], + name: "DelegateChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "delegate", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "previousBalance", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newBalance", + type: "uint256", + }, + ], + name: "DelegateVotesChanged", + type: "event", + }, + { + anonymous: false, + inputs: [], + name: "EIP712DomainChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + ], + name: "InitializeDistributionRecord", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + { + indexed: false, + internalType: "string", + name: "uri", + type: "string", + }, + { + indexed: false, + internalType: "uint256", + name: "fractionDenominator", + type: "uint256", + }, + ], + name: "InitializeDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "start", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "cliff", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "end", + type: "uint256", + }, + ], + name: "SetContinuousVesting", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint160", + name: "maxDelayTime", + type: "uint160", + }, + ], + name: "SetDelay", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "SetMerkleRoot", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "recipient", + type: "address", + }, + ], + name: "SetSweepRecipient", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "contract IERC20", + name: "token", + type: "address", + }, + ], + name: "SetToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + ], + name: "SetTotal", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "string", + name: "uri", + type: "string", + }, + ], + name: "SetUri", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "voteFactor", + type: "uint256", + }, + ], + name: "SetVoteFactor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + inputs: [], + name: "CLOCK_MODE", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "DOMAIN_SEPARATOR", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "NAME", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "int256", + name: "amount", + type: "int256", + }, + ], + name: "adjust", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "approve", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint32", + name: "pos", + type: "uint32", + }, + ], + name: "checkpoints", + outputs: [ + { + components: [ + { + internalType: "uint32", + name: "fromBlock", + type: "uint32", + }, + { + internalType: "uint224", + name: "votes", + type: "uint224", + }, + ], + internalType: "struct ERC20Votes.Checkpoint", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "totalAmount", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", + }, + ], + name: "claim", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "claimed", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "clock", + outputs: [ + { + internalType: "uint48", + name: "", + type: "uint48", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "subtractedValue", + type: "uint256", + }, + ], + name: "decreaseAllowance", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "delegatee", + type: "address", + }, + ], + name: "delegate", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "delegatee", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "expiry", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "delegateBySig", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "delegates", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "distancePerSecond", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "eip712Domain", + outputs: [ + { + internalType: "bytes1", + name: "fields", + type: "bytes1", + }, + { + internalType: "string", + name: "name", + type: "string", + }, + { + internalType: "string", + name: "version", + type: "string", + }, + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "address", + name: "verifyingContract", + type: "address", + }, + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "uint256[]", + name: "extensions", + type: "uint256[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "getClaimableAmount", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + ], + name: "getDistributionRecord", + outputs: [ + { + components: [ + { + internalType: "bool", + name: "initialized", + type: "bool", + }, + { + internalType: "uint120", + name: "total", + type: "uint120", + }, + { + internalType: "uint120", + name: "claimed", + type: "uint120", + }, + ], + internalType: "struct DistributionRecord", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "getFairDelayTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getFractionDenominator", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getMerkleRoot", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastTotalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getSweepRecipient", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getTotalVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "bytes", + name: "", + type: "bytes", + }, + ], + name: "getVestedFraction", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getVestingConfig", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "getVoteFactor", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "getVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "addedValue", + type: "uint256", + }, + ], + name: "increaseAllowance", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "uint256", + name: "_start", + type: "uint256", + }, + { + internalType: "uint256", + name: "_cliff", + type: "uint256", + }, + { + internalType: "uint256", + name: "_end", + type: "uint256", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", + }, + ], + name: "initializeDistributionRecord", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "maxDelayTime", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "nonces", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "numCheckpoints", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "uint256", + name: "deadline", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "permit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "randomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + ], + name: "setMerkleRoot", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "_recipient", + type: "address", + }, + ], + name: "setSweepRecipient", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + ], + name: "setToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + ], + name: "setTotal", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "string", + name: "_uri", + type: "string", + }, + ], + name: "setUri", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_start", + type: "uint256", + }, + { + internalType: "uint256", + name: "_cliff", + type: "uint256", + }, + { + internalType: "uint256", + name: "_end", + type: "uint256", + }, + ], + name: "setVestingConfig", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_voteFactor", + type: "uint256", + }, + ], + name: "setVoteFactor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "token", + outputs: [ + { + internalType: "contract IERC20", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "uri", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: { + CLOCK_MODE: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + DOMAIN_SEPARATOR: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + NAME: "contracts/claim/factory/ContinuousVestingInitializable.sol", + VERSION: "contracts/claim/factory/ContinuousVestingInitializable.sol", + adjust: "contracts/claim/factory/ContinuousVestingInitializable.sol", + allowance: "contracts/claim/factory/ContinuousVestingInitializable.sol", + approve: "contracts/claim/factory/ContinuousVestingInitializable.sol", + balanceOf: "contracts/claim/factory/ContinuousVestingInitializable.sol", + checkpoints: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + claimed: "contracts/claim/factory/ContinuousVestingInitializable.sol", + clock: "contracts/claim/factory/ContinuousVestingInitializable.sol", + decimals: "contracts/claim/factory/ContinuousVestingInitializable.sol", + decreaseAllowance: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + delegate: "contracts/claim/factory/ContinuousVestingInitializable.sol", + delegateBySig: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + delegates: "contracts/claim/factory/ContinuousVestingInitializable.sol", + distancePerSecond: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + eip712Domain: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getClaimableAmount: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getDistributionRecord: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getFairDelayTime: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getFractionDenominator: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getPastTotalSupply: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getPastVotes: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getSweepRecipient: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getTotalVotes: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getVestedFraction: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getVestingConfig: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getVoteFactor: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + getVotes: "contracts/claim/factory/ContinuousVestingInitializable.sol", + increaseAllowance: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + maxDelayTime: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + name: "contracts/claim/factory/ContinuousVestingInitializable.sol", + nonces: "contracts/claim/factory/ContinuousVestingInitializable.sol", + numCheckpoints: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + owner: "contracts/claim/factory/ContinuousVestingInitializable.sol", + permit: "contracts/claim/factory/ContinuousVestingInitializable.sol", + randomValue: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + renounceOwnership: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + setSweepRecipient: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + setToken: "contracts/claim/factory/ContinuousVestingInitializable.sol", + setTotal: "contracts/claim/factory/ContinuousVestingInitializable.sol", + setUri: "contracts/claim/factory/ContinuousVestingInitializable.sol", + setVestingConfig: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + setVoteFactor: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + sweepNative: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + sweepToken: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + symbol: "contracts/claim/factory/ContinuousVestingInitializable.sol", + token: "contracts/claim/factory/ContinuousVestingInitializable.sol", + total: "contracts/claim/factory/ContinuousVestingInitializable.sol", + totalSupply: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + transfer: "contracts/claim/factory/ContinuousVestingInitializable.sol", + transferFrom: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + transferOwnership: + "contracts/claim/factory/ContinuousVestingInitializable.sol", + uri: "contracts/claim/factory/ContinuousVestingInitializable.sol", + getMerkleRoot: "contracts/claim/factory/MerkleSetInitializable.sol", + }, + }, + ContinuousVestingMerkleDistributorFactory: { + address: "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "DistributorDeployed", + type: "event", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "uint256", + name: "_start", + type: "uint256", + }, + { + internalType: "uint256", + name: "_cliff", + type: "uint256", + }, + { + internalType: "uint256", + name: "_end", + type: "uint256", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "deployDistributor", + outputs: [ + { + internalType: "contract ContinuousVestingMerkleDistributor", + name: "distributor", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "distributors", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getImplementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "uint256", + name: "_start", + type: "uint256", + }, + { + internalType: "uint256", + name: "_cliff", + type: "uint256", + }, + { + internalType: "uint256", + name: "_end", + type: "uint256", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "predictDistributorAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + PerAddressContinuousVestingMerkleDistributor: { + address: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + abi: [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "InvalidShortString", + type: "error", + }, + { + inputs: [ + { + internalType: "string", + name: "str", + type: "string", + }, + ], + name: "StringTooLong", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "int256", + name: "amount", + type: "int256", + }, + ], + name: "Adjust", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Claim", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "delegator", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "fromDelegate", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "toDelegate", + type: "address", + }, + ], + name: "DelegateChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "delegate", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "previousBalance", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newBalance", + type: "uint256", + }, + ], + name: "DelegateVotesChanged", + type: "event", + }, + { + anonymous: false, + inputs: [], + name: "EIP712DomainChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + ], + name: "InitializeDistributionRecord", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + { + indexed: false, + internalType: "string", + name: "uri", + type: "string", + }, + { + indexed: false, + internalType: "uint256", + name: "fractionDenominator", + type: "uint256", + }, + ], + name: "InitializeDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint160", + name: "maxDelayTime", + type: "uint160", + }, + ], + name: "SetDelay", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "SetMerkleRoot", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "recipient", + type: "address", + }, + ], + name: "SetSweepRecipient", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "contract IERC20", + name: "token", + type: "address", + }, + ], + name: "SetToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + ], + name: "SetTotal", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "string", + name: "uri", + type: "string", + }, + ], + name: "SetUri", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "voteFactor", + type: "uint256", + }, + ], + name: "SetVoteFactor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + inputs: [], + name: "CLOCK_MODE", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "DOMAIN_SEPARATOR", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "NAME", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "int256", + name: "amount", + type: "int256", + }, + ], + name: "adjust", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "approve", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint32", + name: "pos", + type: "uint32", + }, + ], + name: "checkpoints", + outputs: [ + { + components: [ + { + internalType: "uint32", + name: "fromBlock", + type: "uint32", + }, + { + internalType: "uint224", + name: "votes", + type: "uint224", + }, + ], + internalType: "struct ERC20Votes.Checkpoint", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "totalAmount", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", + }, + ], + name: "claim", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "claimed", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "clock", + outputs: [ + { + internalType: "uint48", + name: "", + type: "uint48", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "subtractedValue", + type: "uint256", + }, + ], + name: "decreaseAllowance", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "delegatee", + type: "address", + }, + ], + name: "delegate", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "delegatee", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "expiry", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "delegateBySig", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "delegates", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "distancePerSecond", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "eip712Domain", + outputs: [ + { + internalType: "bytes1", + name: "fields", + type: "bytes1", + }, + { + internalType: "string", + name: "name", + type: "string", + }, + { + internalType: "string", + name: "version", + type: "string", + }, + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "address", + name: "verifyingContract", + type: "address", + }, + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "uint256[]", + name: "extensions", + type: "uint256[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "getClaimableAmount", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + ], + name: "getDistributionRecord", + outputs: [ + { + components: [ + { + internalType: "bool", + name: "initialized", + type: "bool", + }, + { + internalType: "uint120", + name: "total", + type: "uint120", + }, + { + internalType: "uint120", + name: "claimed", + type: "uint120", + }, + ], + internalType: "struct DistributionRecord", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "getFairDelayTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getFractionDenominator", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getMerkleRoot", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastTotalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getSweepRecipient", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getTotalVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "getVestedFraction", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "getVoteFactor", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "getVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "addedValue", + type: "uint256", + }, + ], + name: "increaseAllowance", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", + }, + ], + name: "initializeDistributionRecord", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "maxDelayTime", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "nonces", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "numCheckpoints", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "uint256", + name: "deadline", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "permit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "randomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + ], + name: "setMerkleRoot", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "_recipient", + type: "address", + }, + ], + name: "setSweepRecipient", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + ], + name: "setToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + ], + name: "setTotal", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "string", + name: "_uri", + type: "string", + }, + ], + name: "setUri", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_voteFactor", + type: "uint256", + }, + ], + name: "setVoteFactor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "token", + outputs: [ + { + internalType: "contract IERC20", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "uri", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: { + CLOCK_MODE: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + DOMAIN_SEPARATOR: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + NAME: "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + VERSION: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + adjust: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + allowance: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + approve: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + balanceOf: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + checkpoints: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + claimed: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + clock: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + decimals: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + decreaseAllowance: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + delegate: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + delegateBySig: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + delegates: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + distancePerSecond: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + eip712Domain: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getClaimableAmount: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getDistributionRecord: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getFairDelayTime: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getFractionDenominator: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getPastTotalSupply: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getPastVotes: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getSweepRecipient: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getTotalVotes: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getVestedFraction: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getVoteFactor: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getVotes: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + increaseAllowance: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + maxDelayTime: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + name: "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + nonces: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + numCheckpoints: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + owner: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + permit: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + randomValue: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + renounceOwnership: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + setSweepRecipient: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + setToken: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + setTotal: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + setUri: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + setVoteFactor: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + sweepNative: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + sweepToken: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + symbol: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + token: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + total: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + totalSupply: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + transfer: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + transferFrom: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + transferOwnership: + "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + uri: "contracts/claim/factory/PerAddressContinuousVestingInitializable.sol", + getMerkleRoot: "contracts/claim/factory/MerkleSetInitializable.sol", + }, + }, + PerAddressContinuousVestingMerkleDistributorFactory: { + address: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "DistributorDeployed", + type: "event", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "deployDistributor", + outputs: [ + { + internalType: + "contract PerAddressContinuousVestingMerkleDistributor", + name: "distributor", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "distributors", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getImplementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "predictDistributorAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + PerAddressTrancheVestingMerkleDistributor: { + address: "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", + abi: [ + { + inputs: [], + stateMutability: "nonpayable", + type: "constructor", + }, + { + inputs: [], + name: "InvalidShortString", + type: "error", + }, + { + inputs: [ + { + internalType: "string", + name: "str", + type: "string", + }, + ], + name: "StringTooLong", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "int256", + name: "amount", + type: "int256", + }, + ], + name: "Adjust", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "owner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "spender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Approval", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "Claim", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "delegator", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "fromDelegate", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "toDelegate", + type: "address", + }, + ], + name: "DelegateChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "delegate", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "previousBalance", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "newBalance", + type: "uint256", + }, + ], + name: "DelegateVotesChanged", + type: "event", + }, + { + anonymous: false, + inputs: [], + name: "EIP712DomainChanged", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + ], + name: "InitializeDistributionRecord", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + { + indexed: false, + internalType: "string", + name: "uri", + type: "string", + }, + { + indexed: false, + internalType: "uint256", + name: "fractionDenominator", + type: "uint256", + }, + ], + name: "InitializeDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint160", + name: "maxDelayTime", + type: "uint160", + }, + ], + name: "SetDelay", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "SetMerkleRoot", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "recipient", + type: "address", + }, + ], + name: "SetSweepRecipient", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "contract IERC20", + name: "token", + type: "address", + }, + ], + name: "SetToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "total", + type: "uint256", + }, + ], + name: "SetTotal", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + indexed: false, + internalType: "uint128", + name: "time", + type: "uint128", + }, + { + indexed: false, + internalType: "uint128", + name: "VestedFraction", + type: "uint128", + }, + ], + name: "SetTranche", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "string", + name: "uri", + type: "string", + }, + ], + name: "SetUri", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "voteFactor", + type: "uint256", + }, + ], + name: "SetVoteFactor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "from", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "to", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "Transfer", + type: "event", + }, + { + inputs: [], + name: "CLOCK_MODE", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "DOMAIN_SEPARATOR", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "NAME", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "int256", + name: "amount", + type: "int256", + }, + ], + name: "adjust", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + ], + name: "allowance", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "approve", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "balanceOf", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint32", + name: "pos", + type: "uint32", + }, + ], + name: "checkpoints", + outputs: [ + { + components: [ + { + internalType: "uint32", + name: "fromBlock", + type: "uint32", + }, + { + internalType: "uint224", + name: "votes", + type: "uint224", + }, + ], + internalType: "struct ERC20Votes.Checkpoint", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "totalAmount", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", + }, + ], + name: "claim", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "claimed", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "clock", + outputs: [ + { + internalType: "uint48", + name: "", + type: "uint48", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "decimals", + outputs: [ + { + internalType: "uint8", + name: "", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "subtractedValue", + type: "uint256", + }, + ], + name: "decreaseAllowance", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "delegatee", + type: "address", + }, + ], + name: "delegate", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "delegatee", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + { + internalType: "uint256", + name: "expiry", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "delegateBySig", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "delegates", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "distancePerSecond", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "eip712Domain", + outputs: [ + { + internalType: "bytes1", + name: "fields", + type: "bytes1", + }, + { + internalType: "string", + name: "name", + type: "string", + }, + { + internalType: "string", + name: "version", + type: "string", + }, + { + internalType: "uint256", + name: "chainId", + type: "uint256", + }, + { + internalType: "address", + name: "verifyingContract", + type: "address", + }, + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "uint256[]", + name: "extensions", + type: "uint256[]", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "getClaimableAmount", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + ], + name: "getDistributionRecord", + outputs: [ + { + components: [ + { + internalType: "bool", + name: "initialized", + type: "bool", + }, + { + internalType: "uint120", + name: "total", + type: "uint120", + }, + { + internalType: "uint120", + name: "claimed", + type: "uint120", + }, + ], + internalType: "struct DistributionRecord", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "getFairDelayTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getFractionDenominator", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getMerkleRoot", + outputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastTotalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "uint256", + name: "timepoint", + type: "uint256", + }, + ], + name: "getPastVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getSweepRecipient", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getTotalVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "getTranche", + outputs: [ + { + components: [ + { + internalType: "uint128", + name: "time", + type: "uint128", + }, + { + internalType: "uint128", + name: "vestedFraction", + type: "uint128", + }, + ], + internalType: "struct Tranche", + name: "", + type: "tuple", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "getTranches", + outputs: [ + { + components: [ + { + internalType: "uint128", + name: "time", + type: "uint128", + }, + { + internalType: "uint128", + name: "vestedFraction", + type: "uint128", + }, + ], + internalType: "struct Tranche[]", + name: "", + type: "tuple[]", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "time", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "getVestedFraction", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + name: "getVoteFactor", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "getVotes", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "addedValue", + type: "uint256", + }, + ], + name: "increaseAllowance", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "index", + type: "uint256", + }, + { + internalType: "address", + name: "beneficiary", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + internalType: "bytes32[]", + name: "merkleProof", + type: "bytes32[]", + }, + ], + name: "initializeDistributionRecord", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "maxDelayTime", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "name", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + ], + name: "nonces", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "account", + type: "address", + }, + ], + name: "numCheckpoints", + outputs: [ + { + internalType: "uint32", + name: "", + type: "uint32", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "owner", + type: "address", + }, + { + internalType: "address", + name: "spender", + type: "address", + }, + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + { + internalType: "uint256", + name: "deadline", + type: "uint256", + }, + { + internalType: "uint8", + name: "v", + type: "uint8", + }, + { + internalType: "bytes32", + name: "r", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "s", + type: "bytes32", + }, + ], + name: "permit", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "randomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + ], + name: "setMerkleRoot", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "_recipient", + type: "address", + }, + ], + name: "setSweepRecipient", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + ], + name: "setToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + ], + name: "setTotal", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "uint128", + name: "time", + type: "uint128", + }, + { + internalType: "uint128", + name: "vestedFraction", + type: "uint128", + }, + ], + internalType: "struct Tranche[]", + name: "", + type: "tuple[]", + }, + ], + name: "setTranches", + outputs: [], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "string", + name: "_uri", + type: "string", + }, + ], + name: "setUri", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "_voteFactor", + type: "uint256", + }, + ], + name: "setVoteFactor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "symbol", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "token", + outputs: [ + { + internalType: "contract IERC20", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "totalSupply", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transfer", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "from", + type: "address", + }, + { + internalType: "address", + name: "to", + type: "address", + }, + { + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "transferFrom", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "uri", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: { + CLOCK_MODE: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + DOMAIN_SEPARATOR: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + NAME: "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + VERSION: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + adjust: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + allowance: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + approve: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + balanceOf: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + checkpoints: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + claimed: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + clock: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + decimals: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + decreaseAllowance: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + delegate: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + delegateBySig: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + delegates: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + distancePerSecond: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + eip712Domain: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getClaimableAmount: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getDistributionRecord: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getFairDelayTime: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getFractionDenominator: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getPastTotalSupply: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getPastVotes: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getSweepRecipient: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getTotalVotes: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getTranche: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getTranches: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getVestedFraction: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getVoteFactor: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getVotes: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + increaseAllowance: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + maxDelayTime: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + name: "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + nonces: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + numCheckpoints: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + owner: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + permit: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + randomValue: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + renounceOwnership: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setSweepRecipient: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setToken: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setTotal: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setTranches: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setUri: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + setVoteFactor: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + sweepNative: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + sweepToken: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + symbol: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + token: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + total: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + totalSupply: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + transfer: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + transferFrom: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + transferOwnership: + "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + uri: "contracts/claim/factory/PerAddressTrancheVestingInitializable.sol", + getMerkleRoot: "contracts/claim/factory/MerkleSetInitializable.sol", + }, + }, + PerAddressTrancheVestingMerkleDistributorFactory: { + address: "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "DistributorDeployed", + type: "event", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "deployDistributor", + outputs: [ + { + internalType: + "contract PerAddressTrancheVestingMerkleDistributor", + name: "distributor", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + name: "distributors", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "getImplementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20", + name: "_token", + type: "address", + }, + { + internalType: "uint256", + name: "_total", + type: "uint256", + }, + { + internalType: "string", + name: "_uri", + type: "string", + }, + { + internalType: "bytes32", + name: "_merkleRoot", + type: "bytes32", + }, + { + internalType: "uint160", + name: "_maxDelayTime", + type: "uint160", + }, + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + internalType: "uint256", + name: "_nonce", + type: "uint256", + }, + ], + name: "predictDistributorAddress", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + }, + 42161: { + FlatPriceSaleFactory_v_2_1: { + address: "0x21896f02b7B33A8da6eC42a01D8C450D7A868A35", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "_implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + { + indexed: true, + internalType: "contract FlatPriceSale_v_2_1", + name: "clone", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "NewSale", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "implementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "newSale", + outputs: [ + { + internalType: "contract FlatPriceSale_v_2_1", + name: "sale", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + FlatPriceSale_v_2_1: { + address: "0x0CaB80bCf2931DebDB1bd9137A3aF86C957b6e96", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "_feeBips", + type: "uint256", + }, + { + internalType: "address payable", + name: "_feeRecipient", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "buyer", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "baseCurrencyValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenFee", + type: "uint256", + }, + ], + name: "Buy", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address payable", + name: "feeRecipient", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "feeBips", + type: "uint256", + }, + ], + name: "ImplementationConstructor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "Initialize", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "RegisterDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + indexed: false, + internalType: "struct PaymentTokenInfo", + name: "paymentTokenInfo", + type: "tuple", + }, + ], + name: "SetPaymentTokenInfo", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + ], + name: "Update", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "baseCurrency", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithNative", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "quantity", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "buyerTotal", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "config", + outputs: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "generatePseudorandomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "buyer", + type: "address", + }, + ], + name: "getFairQueueTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "getOraclePrice", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "getPaymentToken", + outputs: [ + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + internalType: "struct PaymentTokenInfo", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isOpen", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isOver", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "isValidMerkleProof", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "metrics", + outputs: [ + { + internalType: "uint256", + name: "purchaseCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "buyerCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseTotal", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nativeTokenPriceOracle", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "", + type: "address", + }, + ], + name: "paymentTokens", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "dest", + type: "address", + }, + ], + name: "payments", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_distributor", + type: "address", + }, + ], + name: "registerDistributor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenQuantity", + type: "uint256", + }, + { + internalType: "uint256", + name: "tokenDecimals", + type: "uint256", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "tokensToBaseCurrency", + outputs: [ + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + ], + name: "update", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "payee", + type: "address", + }, + ], + name: "withdrawPayments", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + }, + 43113: { + FlatPriceSaleFactory_v_2_1: { + address: "0x0CaB80bCf2931DebDB1bd9137A3aF86C957b6e96", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "_implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + { + indexed: true, + internalType: "contract FlatPriceSale_v_2_1", + name: "clone", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "NewSale", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "implementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "newSale", + outputs: [ + { + internalType: "contract FlatPriceSale_v_2_1", + name: "sale", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + FlatPriceSale_v_2_1: { + address: "0x797C0d5bC32bc29438c0555EA61EB0318bE40797", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "_feeBips", + type: "uint256", + }, + { + internalType: "address payable", + name: "_feeRecipient", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "buyer", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "baseCurrencyValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenFee", + type: "uint256", + }, + ], + name: "Buy", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address payable", + name: "feeRecipient", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "feeBips", + type: "uint256", + }, + ], + name: "ImplementationConstructor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "Initialize", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "RegisterDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + indexed: false, + internalType: "struct PaymentTokenInfo", + name: "paymentTokenInfo", + type: "tuple", + }, + ], + name: "SetPaymentTokenInfo", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + ], + name: "Update", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "baseCurrency", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithNative", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "quantity", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "buyerTotal", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "config", + outputs: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "generatePseudorandomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "buyer", + type: "address", + }, + ], + name: "getFairQueueTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "getOraclePrice", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "getPaymentToken", + outputs: [ + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + internalType: "struct PaymentTokenInfo", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isOpen", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isOver", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "isValidMerkleProof", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "metrics", + outputs: [ + { + internalType: "uint256", + name: "purchaseCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "buyerCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseTotal", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nativeTokenPriceOracle", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "", + type: "address", + }, + ], + name: "paymentTokens", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "dest", + type: "address", + }, + ], + name: "payments", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_distributor", + type: "address", + }, + ], + name: "registerDistributor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenQuantity", + type: "uint256", + }, + { + internalType: "uint256", + name: "tokenDecimals", + type: "uint256", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "tokensToBaseCurrency", + outputs: [ + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + ], + name: "update", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "payee", + type: "address", + }, + ], + name: "withdrawPayments", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + }, + 43114: { + FlatPriceSaleFactory_v_2_1: { + address: "0x0CaB80bCf2931DebDB1bd9137A3aF86C957b6e96", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "_implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + { + indexed: true, + internalType: "contract FlatPriceSale_v_2_1", + name: "clone", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "NewSale", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "implementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "newSale", + outputs: [ + { + internalType: "contract FlatPriceSale_v_2_1", + name: "sale", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + FlatPriceSale_v_2_1: { + address: "0x797C0d5bC32bc29438c0555EA61EB0318bE40797", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "_feeBips", + type: "uint256", + }, + { + internalType: "address payable", + name: "_feeRecipient", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "buyer", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "baseCurrencyValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenFee", + type: "uint256", + }, + ], + name: "Buy", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address payable", + name: "feeRecipient", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "feeBips", + type: "uint256", + }, + ], + name: "ImplementationConstructor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "Initialize", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "RegisterDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + indexed: false, + internalType: "struct PaymentTokenInfo", + name: "paymentTokenInfo", + type: "tuple", + }, + ], + name: "SetPaymentTokenInfo", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + ], + name: "Update", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "baseCurrency", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithNative", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "quantity", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "buyerTotal", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "config", + outputs: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "generatePseudorandomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "buyer", + type: "address", + }, + ], + name: "getFairQueueTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "getOraclePrice", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "getPaymentToken", + outputs: [ + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + internalType: "struct PaymentTokenInfo", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "initialize", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isOpen", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isOver", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + internalType: "address", + name: "account", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "isValidMerkleProof", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "metrics", + outputs: [ + { + internalType: "uint256", + name: "purchaseCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "buyerCount", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseTotal", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nativeTokenPriceOracle", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "", + type: "address", + }, + ], + name: "paymentTokens", + outputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "dest", + type: "address", + }, + ], + name: "payments", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_distributor", + type: "address", + }, + ], + name: "registerDistributor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "tokenQuantity", + type: "uint256", + }, + { + internalType: "uint256", + name: "tokenDecimals", + type: "uint256", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "tokensToBaseCurrency", + outputs: [ + { + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + ], + name: "update", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address payable", + name: "payee", + type: "address", + }, + ], + name: "withdrawPayments", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + }, + 80001: { + FlatPriceSaleFactory_v_2_1: { + address: "0xfAD5031a6a40952c2820f17dAc16F32896Cd058e", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "_implementation", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "implementation", + type: "address", + }, + { + indexed: true, + internalType: "contract FlatPriceSale_v_2_1", + name: "clone", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "NewSale", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "implementation", + outputs: [ + { + internalType: "address", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", + type: "address", + }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, + ], + name: "newSale", + outputs: [ + { + internalType: "contract FlatPriceSale_v_2_1", + name: "sale", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + ], + inheritedFunctions: {}, + }, + FlatPriceSale_v_2_1: { + address: "0x662d39a9Ac0c0Cd9210E519AedA7F76e967e4492", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "_feeBips", + type: "uint256", + }, + { + internalType: "address payable", + name: "_feeRecipient", + type: "address", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "buyer", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "baseCurrencyValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenValue", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "tokenFee", + type: "uint256", + }, + ], + name: "Buy", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address payable", + name: "feeRecipient", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "feeBips", + type: "uint256", + }, + ], + name: "ImplementationConstructor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + { + indexed: false, + internalType: "string", + name: "baseCurrency", + type: "string", + }, + { + indexed: false, + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "nativeOracle", + type: "address", + }, + { + indexed: false, + internalType: "bool", + name: "nativePaymentsEnabled", + type: "bool", + }, + ], + name: "Initialize", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint8", + name: "version", + type: "uint8", + }, + ], + name: "Initialized", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "previousOwner", + type: "address", + }, + { + indexed: true, + internalType: "address", + name: "newOwner", + type: "address", + }, + ], + name: "OwnershipTransferred", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "distributor", + type: "address", + }, + ], + name: "RegisterDistributor", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + indexed: false, + internalType: "struct PaymentTokenInfo", + name: "paymentTokenInfo", + type: "tuple", + }, + ], + name: "SetPaymentTokenInfo", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepNative", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "token", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + ], + name: "SweepToken", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + indexed: false, + internalType: "struct Config", + name: "config", + type: "tuple", + }, + ], + name: "Update", + type: "event", + }, + { + inputs: [], + name: "VERSION", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "baseCurrency", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithNative", + outputs: [], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + { + internalType: "uint256", + name: "quantity", + type: "uint256", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", + }, + ], + name: "buyWithToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "user", + type: "address", + }, + ], + name: "buyerTotal", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", type: "function", }, { inputs: [], - name: "uri", + name: "config", outputs: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, { internalType: "string", - name: "", + name: "URI", type: "string", }, ], stateMutability: "view", type: "function", }, - ], - inheritedFunctions: { - CLOCK_MODE: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - DOMAIN_SEPARATOR: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - NAME: "contracts/claim/factory/ContinuousVestingInitializable.sol", - VERSION: "contracts/claim/factory/ContinuousVestingInitializable.sol", - adjust: "contracts/claim/factory/ContinuousVestingInitializable.sol", - allowance: "contracts/claim/factory/ContinuousVestingInitializable.sol", - approve: "contracts/claim/factory/ContinuousVestingInitializable.sol", - balanceOf: "contracts/claim/factory/ContinuousVestingInitializable.sol", - checkpoints: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - claimed: "contracts/claim/factory/ContinuousVestingInitializable.sol", - clock: "contracts/claim/factory/ContinuousVestingInitializable.sol", - decimals: "contracts/claim/factory/ContinuousVestingInitializable.sol", - decreaseAllowance: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - delegate: "contracts/claim/factory/ContinuousVestingInitializable.sol", - delegateBySig: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - delegates: "contracts/claim/factory/ContinuousVestingInitializable.sol", - distancePerSecond: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - eip712Domain: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getClaimableAmount: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getDistributionRecord: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getFairDelayTime: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getFractionDenominator: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getPastTotalSupply: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getPastVotes: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getSweepRecipient: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getTotalVotes: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getVestedFraction: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getVestingConfig: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getVoteFactor: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - getVotes: "contracts/claim/factory/ContinuousVestingInitializable.sol", - increaseAllowance: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - maxDelayTime: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - name: "contracts/claim/factory/ContinuousVestingInitializable.sol", - nonces: "contracts/claim/factory/ContinuousVestingInitializable.sol", - numCheckpoints: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - owner: "contracts/claim/factory/ContinuousVestingInitializable.sol", - permit: "contracts/claim/factory/ContinuousVestingInitializable.sol", - randomValue: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - renounceOwnership: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - setSweepRecipient: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - setToken: "contracts/claim/factory/ContinuousVestingInitializable.sol", - setTotal: "contracts/claim/factory/ContinuousVestingInitializable.sol", - setUri: "contracts/claim/factory/ContinuousVestingInitializable.sol", - setVestingConfig: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - setVoteFactor: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - sweepNative: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - sweepToken: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - symbol: "contracts/claim/factory/ContinuousVestingInitializable.sol", - token: "contracts/claim/factory/ContinuousVestingInitializable.sol", - total: "contracts/claim/factory/ContinuousVestingInitializable.sol", - totalSupply: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - transfer: "contracts/claim/factory/ContinuousVestingInitializable.sol", - transferFrom: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - transferOwnership: - "contracts/claim/factory/ContinuousVestingInitializable.sol", - uri: "contracts/claim/factory/ContinuousVestingInitializable.sol", - getMerkleRoot: "contracts/claim/factory/MerkleSetInitializable.sol", - }, - }, - ContinuousVestingMerkleDistributorFactory: { - address: "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", - abi: [ { inputs: [ { - internalType: "address", - name: "implementation", + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "generatePseudorandomValue", + outputs: [ + { + internalType: "uint160", + name: "", + type: "uint160", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "buyer", + type: "address", + }, + ], + name: "getFairQueueTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + ], + name: "getOraclePrice", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "contract IERC20Upgradeable", + name: "token", + type: "address", + }, + ], + name: "getPaymentToken", + outputs: [ + { + components: [ + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", + }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, + ], + internalType: "struct PaymentTokenInfo", + name: "", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "_owner", + type: "address", + }, + { + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", + }, + { + internalType: "string", + name: "_baseCurrency", + type: "string", + }, + { + internalType: "bool", + name: "_nativePaymentsEnabled", + type: "bool", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "_nativeTokenPriceOracle", type: "address", }, + { + internalType: "contract IERC20Upgradeable[]", + name: "tokens", + type: "address[]", + }, + { + internalType: "contract IOracleOrL2OracleWithSequencerCheck[]", + name: "oracles", + type: "address[]", + }, + { + internalType: "uint8[]", + name: "decimals", + type: "uint8[]", + }, ], + name: "initialize", + outputs: [], stateMutability: "nonpayable", - type: "constructor", + type: "function", }, { - anonymous: false, - inputs: [ + inputs: [], + name: "isOpen", + outputs: [ { - indexed: true, - internalType: "address", - name: "distributor", - type: "address", + internalType: "bool", + name: "", + type: "bool", }, ], - name: "DistributorDeployed", - type: "event", + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "isOver", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", }, { inputs: [ { - internalType: "contract IERC20", - name: "_token", + internalType: "bytes32", + name: "root", + type: "bytes32", + }, + { + internalType: "address", + name: "account", type: "address", }, { - internalType: "uint256", - name: "_total", - type: "uint256", + internalType: "bytes", + name: "data", + type: "bytes", }, { - internalType: "string", - name: "_uri", - type: "string", + internalType: "bytes32[]", + name: "proof", + type: "bytes32[]", }, + ], + name: "isValidMerkleProof", + outputs: [ { - internalType: "uint256", - name: "_start", - type: "uint256", + internalType: "bool", + name: "", + type: "bool", }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "metrics", + outputs: [ { internalType: "uint256", - name: "_cliff", + name: "purchaseCount", type: "uint256", }, { internalType: "uint256", - name: "_end", + name: "buyerCount", type: "uint256", }, { - internalType: "bytes32", - name: "_merkleRoot", - type: "bytes32", + internalType: "uint256", + name: "purchaseTotal", + type: "uint256", }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "nativeTokenPriceOracle", + outputs: [ { - internalType: "uint160", - name: "_maxDelayTime", - type: "uint160", + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "", + type: "address", }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "owner", + outputs: [ { internalType: "address", - name: "_owner", + name: "", type: "address", }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ { - internalType: "uint256", - name: "_nonce", - type: "uint256", + internalType: "contract IERC20Upgradeable", + name: "", + type: "address", }, ], - name: "deployDistributor", + name: "paymentTokens", outputs: [ { - internalType: "contract ContinuousVestingMerkleDistributor", - name: "distributor", + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", type: "address", }, + { + internalType: "uint8", + name: "decimals", + type: "uint8", + }, ], - stateMutability: "nonpayable", + stateMutability: "view", type: "function", }, { inputs: [ { - internalType: "uint256", - name: "", - type: "uint256", + internalType: "address", + name: "dest", + type: "address", }, ], - name: "distributors", + name: "payments", outputs: [ { - internalType: "address", + internalType: "uint256", name: "", - type: "address", + type: "uint256", }, ], stateMutability: "view", type: "function", }, { - inputs: [], - name: "getImplementation", - outputs: [ + inputs: [ { internalType: "address", - name: "", + name: "_distributor", type: "address", }, ], - stateMutability: "view", + name: "registerDistributor", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "renounceOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "sweepNative", + outputs: [], + stateMutability: "nonpayable", type: "function", }, { inputs: [ { - internalType: "contract IERC20", - name: "_token", + internalType: "contract IERC20Upgradeable", + name: "token", type: "address", }, + ], + name: "sweepToken", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ { internalType: "uint256", - name: "_total", + name: "tokenQuantity", type: "uint256", }, - { - internalType: "string", - name: "_uri", - type: "string", - }, { internalType: "uint256", - name: "_start", + name: "tokenDecimals", type: "uint256", }, { - internalType: "uint256", - name: "_cliff", - type: "uint256", + internalType: "contract IOracleOrL2OracleWithSequencerCheck", + name: "oracle", + type: "address", }, + ], + name: "tokensToBaseCurrency", + outputs: [ { internalType: "uint256", - name: "_end", + name: "value", type: "uint256", }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "total", + outputs: [ { - internalType: "bytes32", - name: "_merkleRoot", - type: "bytes32", - }, - { - internalType: "uint160", - name: "_maxDelayTime", - type: "uint160", + internalType: "uint256", + name: "", + type: "uint256", }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ { internalType: "address", - name: "_owner", + name: "newOwner", type: "address", }, + ], + name: "transferOwnership", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ { - internalType: "uint256", - name: "_nonce", - type: "uint256", + components: [ + { + internalType: "address payable", + name: "recipient", + type: "address", + }, + { + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + { + internalType: "uint256", + name: "saleMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "userMaximum", + type: "uint256", + }, + { + internalType: "uint256", + name: "purchaseMinimum", + type: "uint256", + }, + { + internalType: "uint256", + name: "startTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "endTime", + type: "uint256", + }, + { + internalType: "uint256", + name: "maxQueueTime", + type: "uint256", + }, + { + internalType: "string", + name: "URI", + type: "string", + }, + ], + internalType: "struct Config", + name: "_config", + type: "tuple", }, ], - name: "predictDistributorAddress", - outputs: [ + name: "update", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ { - internalType: "address", - name: "", + internalType: "address payable", + name: "payee", type: "address", }, ], - stateMutability: "view", + name: "withdrawPayments", + outputs: [], + stateMutability: "nonpayable", type: "function", }, ], diff --git a/yarn.lock b/yarn.lock index 58d325c5..586f2c58 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,13 +5,6 @@ __metadata: version: 6 cacheKey: 8 -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd - languageName: node - linkType: hard - "@adraffy/ens-normalize@npm:1.10.0": version: 1.10.0 resolution: "@adraffy/ens-normalize@npm:1.10.0" @@ -34,62 +27,52 @@ __metadata: linkType: hard "@ampproject/remapping@npm:^2.2.0": - version: 2.2.1 - resolution: "@ampproject/remapping@npm:2.2.1" - dependencies: - "@jridgewell/gen-mapping": ^0.3.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 03c04fd526acc64a1f4df22651186f3e5ef0a9d6d6530ce4482ec9841269cf7a11dbb8af79237c282d721c5312024ff17529cd72cc4768c11e999b58e2302079 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.22.13": - version: 7.22.13 - resolution: "@babel/code-frame@npm:7.22.13" + version: 2.3.0 + resolution: "@ampproject/remapping@npm:2.3.0" dependencies: - "@babel/highlight": ^7.22.13 - chalk: ^2.4.2 - checksum: 22e342c8077c8b77eeb11f554ecca2ba14153f707b85294fcf6070b6f6150aae88a7b7436dd88d8c9289970585f3fe5b9b941c5aa3aa26a6d5a8ef3f292da058 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: d3ad7b89d973df059c4e8e6d7c972cbeb1bb2f18f002a3bd04ae0707da214cb06cc06929b65aa2313b9347463df2914772298bae8b1d7973f246bb3f2ab3e8f0 languageName: node linkType: hard -"@babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/code-frame@npm:7.24.6" dependencies: - "@babel/highlight": ^7.23.4 - chalk: ^2.4.2 - checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a + "@babel/highlight": ^7.24.6 + picocolors: ^1.0.0 + checksum: 0904514ea7079a9590c1c546cd20b9c1beab9649873f2a0703429860775c1713a8dfb2daacd781a0210bb3930c656c1c436013fb20eaa3644880fb3a2b34541d languageName: node linkType: hard -"@babel/compat-data@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/compat-data@npm:7.23.5" - checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 +"@babel/compat-data@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/compat-data@npm:7.24.6" + checksum: 92233c708f7c349923c1f9a2b3c9354875a951ac3afaca0a2c159de1c808f6799ad4433652b90870015281aa466ec6e9aa8922e755cd7ac1413a3a5782cd685d languageName: node linkType: hard "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/core@npm:7.23.9" + version: 7.24.6 + resolution: "@babel/core@npm:7.24.6" dependencies: "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.6 - "@babel/helper-compilation-targets": ^7.23.6 - "@babel/helper-module-transforms": ^7.23.3 - "@babel/helpers": ^7.23.9 - "@babel/parser": ^7.23.9 - "@babel/template": ^7.23.9 - "@babel/traverse": ^7.23.9 - "@babel/types": ^7.23.9 + "@babel/code-frame": ^7.24.6 + "@babel/generator": ^7.24.6 + "@babel/helper-compilation-targets": ^7.24.6 + "@babel/helper-module-transforms": ^7.24.6 + "@babel/helpers": ^7.24.6 + "@babel/parser": ^7.24.6 + "@babel/template": ^7.24.6 + "@babel/traverse": ^7.24.6 + "@babel/types": ^7.24.6 convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: 634a511f74db52a5f5a283c1121f25e2227b006c095b84a02a40a9213842489cd82dc7d61cdc74e10b5bcd9bb0a4e28bab47635b54c7e2256d47ab57356e2a76 + checksum: f8af23de19865818c27c2fbe0d87b0834b118386da5ee09b20ae0cf7a5540065054ef2b70f377d025d9feee765db18df39900e4c18e905988b94b54a104c738e languageName: node linkType: hard @@ -104,194 +87,155 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/generator@npm:7.23.0" - dependencies: - "@babel/types": ^7.23.0 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 - jsesc: ^2.5.1 - checksum: 8efe24adad34300f1f8ea2add420b28171a646edc70f2a1b3e1683842f23b8b7ffa7e35ef0119294e1901f45bfea5b3dc70abe1f10a1917ccdfb41bed69be5f1 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.23.6, @babel/generator@npm:^7.7.2": - version: 7.23.6 - resolution: "@babel/generator@npm:7.23.6" +"@babel/generator@npm:^7.23.0, @babel/generator@npm:^7.24.6, @babel/generator@npm:^7.7.2": + version: 7.24.6 + resolution: "@babel/generator@npm:7.24.6" dependencies: - "@babel/types": ^7.23.6 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 + "@babel/types": ^7.24.6 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 jsesc: ^2.5.1 - checksum: 1a1a1c4eac210f174cd108d479464d053930a812798e09fee069377de39a893422df5b5b146199ead7239ae6d3a04697b45fc9ac6e38e0f6b76374390f91fc6c + checksum: a477e03129106908f464b195c4f138052d732cfca47506b127edbed6a496371bae821662a8a4e51e6d144ac236a5d05dc2da0e145e29bb8e19d3e7c480ac00fe languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.23.6": - version: 7.23.6 - resolution: "@babel/helper-compilation-targets@npm:7.23.6" +"@babel/helper-compilation-targets@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-compilation-targets@npm:7.24.6" dependencies: - "@babel/compat-data": ^7.23.5 - "@babel/helper-validator-option": ^7.23.5 + "@babel/compat-data": ^7.24.6 + "@babel/helper-validator-option": ^7.24.6 browserslist: ^4.22.2 lru-cache: ^5.1.1 semver: ^6.3.1 - checksum: c630b98d4527ac8fe2c58d9a06e785dfb2b73ec71b7c4f2ddf90f814b5f75b547f3c015f110a010fd31f76e3864daaf09f3adcd2f6acdbfb18a8de3a48717590 + checksum: c66bf86387fbeefc617db9510de553880ed33dc91308421ee36a7b489d0e8c8eb615e0f467a9ec886eada7c05b03e421e55b2a724ff302402fdd4e0c0b2b0443 languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-environment-visitor@npm:7.22.20" - checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 +"@babel/helper-environment-visitor@npm:^7.22.20, @babel/helper-environment-visitor@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-environment-visitor@npm:7.24.6" + checksum: 9c2b3f1ee7ba46b61b0482efab6d37f5c76f0ea4e9d9775df44a89644729c3a50101040a0233543ec6c3f416d8e548d337f310ff3e164f847945507428ee39e5 languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-function-name@npm:7.23.0" +"@babel/helper-function-name@npm:^7.23.0, @babel/helper-function-name@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-function-name@npm:7.24.6" dependencies: - "@babel/template": ^7.22.15 - "@babel/types": ^7.23.0 - checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10 + "@babel/template": ^7.24.6 + "@babel/types": ^7.24.6 + checksum: d7a2198b6bf2cae9767d5b0d6cb5d3cbd9a07640ad4b6798abb7d7242e8f32765a94fd98ab1a039d7607f0ddbeaf9ddc822dd536b856e499f7082899c6f455f0 languageName: node linkType: hard -"@babel/helper-hoist-variables@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-hoist-variables@npm:7.22.5" +"@babel/helper-hoist-variables@npm:^7.22.5, @babel/helper-hoist-variables@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-hoist-variables@npm:7.24.6" dependencies: - "@babel/types": ^7.22.5 - checksum: 394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc + "@babel/types": ^7.24.6 + checksum: 4819b574393a5214aff6ae02a6e5250ace2564f8bcdb28d580ffec57bbb2092425e8f39563d75cfa268940a01fd425bad503c0b92717c12426f15cf6847855d3 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-module-imports@npm:7.22.15" +"@babel/helper-module-imports@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-module-imports@npm:7.24.6" dependencies: - "@babel/types": ^7.22.15 - checksum: ecd7e457df0a46f889228f943ef9b4a47d485d82e030676767e6a2fdcbdaa63594d8124d4b55fd160b41c201025aec01fc27580352b1c87a37c9c6f33d116702 + "@babel/types": ^7.24.6 + checksum: 3484420c45529aac34cb14111a03c78edab84e5c4419634affe61176d832af82963395ea319f67c7235fd4106d9052a9f3ce012d2d57d56644572d3f7d495231 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" +"@babel/helper-module-transforms@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-module-transforms@npm:7.24.6" dependencies: - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-module-imports": ^7.22.15 - "@babel/helper-simple-access": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-environment-visitor": ^7.24.6 + "@babel/helper-module-imports": ^7.24.6 + "@babel/helper-simple-access": ^7.24.6 + "@babel/helper-split-export-declaration": ^7.24.6 + "@babel/helper-validator-identifier": ^7.24.6 peerDependencies: "@babel/core": ^7.0.0 - checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 + checksum: 904e2a0701eb1eeb84b0d0df5dacdc40291307025b7e3a9a3c6f3eee912c893524f9dc7f5624225a5783a258dec2eb2489a9638bf5f3de26ebfcbcac1b5cc2fc languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.22.5 - resolution: "@babel/helper-plugin-utils@npm:7.22.5" - checksum: c0fc7227076b6041acd2f0e818145d2e8c41968cc52fb5ca70eed48e21b8fe6dd88a0a91cbddf4951e33647336eb5ae184747ca706817ca3bef5e9e905151ff5 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.24.6, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.24.6 + resolution: "@babel/helper-plugin-utils@npm:7.24.6" + checksum: d22bb82c75afed0d8c37784876fd6deb9db06ef21526db909ef7986a6050b50beb60a7823c08a1bb7c57c668af2e086d8086e88b6f9140b0d9ade07472f7c748 languageName: node linkType: hard -"@babel/helper-simple-access@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-simple-access@npm:7.22.5" +"@babel/helper-simple-access@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-simple-access@npm:7.24.6" dependencies: - "@babel/types": ^7.22.5 - checksum: fe9686714caf7d70aedb46c3cce090f8b915b206e09225f1e4dbc416786c2fdbbee40b38b23c268b7ccef749dd2db35f255338fb4f2444429874d900dede5ad2 + "@babel/types": ^7.24.6 + checksum: 929162e887efc1bcadd4e141ed7782b45fccc6873d5023a744fee9c94d16d3a13dbfb66eb259181613a36c2d35f7d2088ee37e76014223d3b9b6c9ef1094e4b6 languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-split-export-declaration@npm:7.22.6" +"@babel/helper-split-export-declaration@npm:^7.22.6, @babel/helper-split-export-declaration@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-split-export-declaration@npm:7.24.6" dependencies: - "@babel/types": ^7.22.5 - checksum: e141cace583b19d9195f9c2b8e17a3ae913b7ee9b8120246d0f9ca349ca6f03cb2c001fd5ec57488c544347c0bb584afec66c936511e447fd20a360e591ac921 + "@babel/types": ^7.24.6 + checksum: b546fd7e186b4aa69f96e041b6c4c9154115a2579a297b86773719dbed53b938cfc3f6b4996ae410296bb8aa30ea031f9ff31f1255aa25c3af75026c5b7c4059 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-string-parser@npm:7.22.5" - checksum: 836851ca5ec813077bbb303acc992d75a360267aa3b5de7134d220411c852a6f17de7c0d0b8c8dcc0f567f67874c00f4528672b2a4f1bc978a3ada64c8c78467 +"@babel/helper-string-parser@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-string-parser@npm:7.24.6" + checksum: c8c614a663928b67c5c65cfea958ed20c858fa2af8c957d301bd852c0ab98adae0861f081fd8f5add16539d9393bd4b10b8c86a97a9d7304f70a6a67b2c2ff07 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 +"@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-validator-identifier@npm:7.24.6" + checksum: a265a6fba570332dca63ad7e749b867d29b52da2573dc62bf19b5b8c5387d4f4296af33da9da7c71ffe3d3abecd743418278f56d38b057ad4b53f09b937fe113 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.16.7, @babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc +"@babel/helper-validator-option@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helper-validator-option@npm:7.24.6" + checksum: 5defb2da74e1cac9497016f4e41698aeed75ec7a5e9dc07e777cdb67ef73cd2e27bd2bf8a3ab8d37e0b93a6a45524a9728f03e263afdef452436cf74794bde87 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/helpers@npm:7.23.9" +"@babel/helpers@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/helpers@npm:7.24.6" dependencies: - "@babel/template": ^7.23.9 - "@babel/traverse": ^7.23.9 - "@babel/types": ^7.23.9 - checksum: 2678231192c0471dbc2fc403fb19456cc46b1afefcfebf6bc0f48b2e938fdb0fef2e0fe90c8c8ae1f021dae5012b700372e4b5d15867f1d7764616532e4a6324 + "@babel/template": ^7.24.6 + "@babel/types": ^7.24.6 + checksum: c936058fd5caf7173e157f790fdbe9535237a7b8bc2c3d084bdf16467a034f73bd5d731deb514aa84e356c72de1cc93500a376f9d481f5c1e335f5a563426e58 languageName: node linkType: hard -"@babel/highlight@npm:^7.22.13": - version: 7.22.20 - resolution: "@babel/highlight@npm:7.22.20" +"@babel/highlight@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/highlight@npm:7.24.6" dependencies: - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-validator-identifier": ^7.24.6 chalk: ^2.4.2 js-tokens: ^4.0.0 - checksum: 84bd034dca309a5e680083cd827a766780ca63cef37308404f17653d32366ea76262bd2364b2d38776232f2d01b649f26721417d507e8b4b6da3e4e739f6d134 - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" - dependencies: - "@babel/helper-validator-identifier": ^7.22.20 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/parser@npm:7.23.9" - bin: - parser: ./bin/babel-parser.js - checksum: e7cd4960ac8671774e13803349da88d512f9292d7baa952173260d3e8f15620a28a3701f14f709d769209022f9e7b79965256b8be204fc550cfe783cdcabe7c7 + picocolors: ^1.0.0 + checksum: 2f8f7f060eeccc3ddf03ba12c263995de0e6c0dd31ad224bed58d983b3bb08fe34dfc01440396266456a4cad83226c38ad6814805bc5d0c774a056cac9182eca languageName: node linkType: hard -"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/parser@npm:7.23.0" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/parser@npm:7.24.6" bin: parser: ./bin/babel-parser.js - checksum: 453fdf8b9e2c2b7d7b02139e0ce003d1af21947bbc03eb350fb248ee335c9b85e4ab41697ddbdd97079698de825a265e45a0846bb2ed47a2c7c1df833f42a354 + checksum: ca3773f5b2a4a065b827990ca0c867e670f01d7a7d7278838bd64d583e68ed52356b5a613303c5aa736d20f024728fec80fc5845fed1eb751ab5f1bfbdc1dd3c languageName: node linkType: hard @@ -351,13 +295,13 @@ __metadata: linkType: hard "@babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.23.3 - resolution: "@babel/plugin-syntax-jsx@npm:7.23.3" + version: 7.24.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 89037694314a74e7f0e7a9c8d3793af5bf6b23d80950c29b360db1c66859d67f60711ea437e70ad6b5b4b29affe17eababda841b6c01107c2b638e0493bafb4e + checksum: e288681cab57d059b0b2e132040eb5e21a158c40229c600e77cb0289ba5d32a2102af94e43390d270e0ddd968685e9de8d10dab0291c53b84e2219a7bc4cdb54 languageName: node linkType: hard @@ -439,44 +383,33 @@ __metadata: linkType: hard "@babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.23.3 - resolution: "@babel/plugin-syntax-typescript@npm:7.23.3" + version: 7.24.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.24.6" dependencies: - "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-plugin-utils": ^7.24.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: abfad3a19290d258b028e285a1f34c9b8a0cbe46ef79eafed4ed7ffce11b5d0720b5e536c82f91cbd8442cde35a3dd8e861fa70366d87ff06fdc0d4756e30876 + checksum: 2fb15b246f7a2334ae5ebbc4c263dc2a66464e65074cbe82204acb42c097601c5ae5933d4c4716cad0a64b41aa999080eeabddbabadd163232d9e2631749f596 languageName: node linkType: hard "@babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.23.2": - version: 7.23.9 - resolution: "@babel/runtime@npm:7.23.9" + version: 7.24.6 + resolution: "@babel/runtime@npm:7.24.6" dependencies: regenerator-runtime: ^0.14.0 - checksum: 6bbebe8d27c0c2dd275d1ac197fc1a6c00e18dab68cc7aaff0adc3195b45862bae9c4cc58975629004b0213955b2ed91e99eccb3d9b39cabea246c657323d667 - languageName: node - linkType: hard - -"@babel/template@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/template@npm:7.22.15" - dependencies: - "@babel/code-frame": ^7.22.13 - "@babel/parser": ^7.22.15 - "@babel/types": ^7.22.15 - checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd + checksum: 44d95ca743898fed31b4cefef31de6fd3cf7906e94493368e9d6538289cc52c6c46185205d9c01d38466a5b3f673550f80892d30b1ed02a2c13e704863a8cc48 languageName: node linkType: hard -"@babel/template@npm:^7.23.9, @babel/template@npm:^7.3.3": - version: 7.23.9 - resolution: "@babel/template@npm:7.23.9" +"@babel/template@npm:^7.24.6, @babel/template@npm:^7.3.3": + version: 7.24.6 + resolution: "@babel/template@npm:7.24.6" dependencies: - "@babel/code-frame": ^7.23.5 - "@babel/parser": ^7.23.9 - "@babel/types": ^7.23.9 - checksum: 6e67414c0f7125d7ecaf20c11fab88085fa98a96c3ef10da0a61e962e04fdf3a18a496a66047005ddd1bb682a7cc7842d556d1db2f3f3f6ccfca97d5e445d342 + "@babel/code-frame": ^7.24.6 + "@babel/parser": ^7.24.6 + "@babel/types": ^7.24.6 + checksum: 8e532ebdd5e1398c030af16881061bad43b9c3b758a193a6289dc5be5988cc543f7aa56a360e15b755258c0b3d387f3cd78b505835b040a2729d0261d0ff1711 languageName: node linkType: hard @@ -498,21 +431,21 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.9": - version: 7.23.9 - resolution: "@babel/traverse@npm:7.23.9" +"@babel/traverse@npm:^7.24.6": + version: 7.24.6 + resolution: "@babel/traverse@npm:7.24.6" dependencies: - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.6 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.23.9 - "@babel/types": ^7.23.9 + "@babel/code-frame": ^7.24.6 + "@babel/generator": ^7.24.6 + "@babel/helper-environment-visitor": ^7.24.6 + "@babel/helper-function-name": ^7.24.6 + "@babel/helper-hoist-variables": ^7.24.6 + "@babel/helper-split-export-declaration": ^7.24.6 + "@babel/parser": ^7.24.6 + "@babel/types": ^7.24.6 debug: ^4.3.1 globals: ^11.1.0 - checksum: a932f7aa850e158c00c97aad22f639d48c72805c687290f6a73e30c5c4957c07f5d28310c9bf59648e2980fe6c9d16adeb2ff92a9ca0f97fa75739c1328fc6c3 + checksum: 654151b2ab5c9d5031c274cf197f707b8a27a1c70b38fcb8d1bf5ad2d8848f38675ab9c2a86aeb804657c5817124ac5be4cb6f5defa8ef7ac40596e1220697aa languageName: node linkType: hard @@ -526,25 +459,14 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.6, @babel/types@npm:^7.23.9, @babel/types@npm:^7.3.3": - version: 7.23.9 - resolution: "@babel/types@npm:7.23.9" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.6, @babel/types@npm:^7.3.3, @babel/types@npm:^7.8.3": + version: 7.24.6 + resolution: "@babel/types@npm:7.24.6" dependencies: - "@babel/helper-string-parser": ^7.23.4 - "@babel/helper-validator-identifier": ^7.22.20 + "@babel/helper-string-parser": ^7.24.6 + "@babel/helper-validator-identifier": ^7.24.6 to-fast-properties: ^2.0.0 - checksum: 0a9b008e9bfc89beb8c185e620fa0f8ed6c771f1e1b2e01e1596870969096fec7793898a1d64a035176abf1dd13e2668ee30bf699f2d92c210a8128f4b151e65 - languageName: node - linkType: hard - -"@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.8.3": - version: 7.23.0 - resolution: "@babel/types@npm:7.23.0" - dependencies: - "@babel/helper-string-parser": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.20 - to-fast-properties: ^2.0.0 - checksum: 215fe04bd7feef79eeb4d33374b39909ce9cad1611c4135a4f7fdf41fe3280594105af6d7094354751514625ea92d0875aba355f53e86a92600f290e77b0e604 + checksum: 58d798dd37e6b14f818730b4536795d68d28ccd5dc2a105fd977104789b20602be11d92cdd47cdbd48d8cce3cc0e14c7773813357ad9d5d6e94d70587eb45bf5 languageName: node linkType: hard @@ -568,8 +490,8 @@ __metadata: linkType: hard "@coinbase/wallet-sdk@npm:^3.6.6": - version: 3.9.1 - resolution: "@coinbase/wallet-sdk@npm:3.9.1" + version: 3.9.3 + resolution: "@coinbase/wallet-sdk@npm:3.9.3" dependencies: bn.js: ^5.2.1 buffer: ^6.0.3 @@ -580,7 +502,7 @@ __metadata: keccak: ^3.0.3 preact: ^10.16.0 sha.js: ^2.4.11 - checksum: 8e6ab9c1fdfe87c703e65e046c62b5d24821b103ae616646dd79b5639a6fef8861e5548a501598bd21d3b6884cd2ed86821b4517c1d3b90574f23f4ca4a459ba + checksum: c3ab1b30facbe43f6d0f7f4010e438f9c488b72f9dad768b60adbb0e4f6b057e7518e3d86c7859fdd15df187ef3f1d6212898eae4694a7d8ed0ceb05ef216eb9 languageName: node linkType: hard @@ -646,7 +568,7 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": +"@eslint-community/eslint-utils@npm:^4.2.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" dependencies: @@ -657,37 +579,13 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0": +"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.6.1": version: 4.10.0 resolution: "@eslint-community/regexpp@npm:4.10.0" checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.9.1 - resolution: "@eslint-community/regexpp@npm:4.9.1" - checksum: 06fb839e9c756f6375cc545c2f2e05a0a64576bd6370e8e3c07983fd29a3d6e164ef4aa48a361f7d27e6713ab79c83053ff6a2ccb78748bc955e344279c4a3b6 - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.1.2": - version: 2.1.2 - resolution: "@eslint/eslintrc@npm:2.1.2" - dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.6.0 - globals: ^13.19.0 - ignore: ^5.2.0 - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - minimatch: ^3.1.2 - strip-json-comments: ^3.1.1 - checksum: bc742a1e3b361f06fedb4afb6bf32cbd27171292ef7924f61c62f2aed73048367bcc7ac68f98c06d4245cd3fabc43270f844e3c1699936d4734b3ac5398814a7 - languageName: node - linkType: hard - "@eslint/eslintrc@npm:^2.1.4": version: 2.1.4 resolution: "@eslint/eslintrc@npm:2.1.4" @@ -705,13 +603,6 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.51.0": - version: 8.51.0 - resolution: "@eslint/js@npm:8.51.0" - checksum: 0228bf1e1e0414843e56d9ff362a2a72d579c078f93174666f29315690e9e30a8633ad72c923297f7fd7182381b5a476805ff04dac8debe638953eb1ded3ac73 - languageName: node - linkType: hard - "@eslint/js@npm:8.57.0": version: 8.57.0 resolution: "@eslint/js@npm:8.57.0" @@ -860,6 +751,19 @@ __metadata: languageName: node linkType: hard +"@ethersproject/address@npm:5.6.1": + version: 5.6.1 + resolution: "@ethersproject/address@npm:5.6.1" + dependencies: + "@ethersproject/bignumber": ^5.6.2 + "@ethersproject/bytes": ^5.6.1 + "@ethersproject/keccak256": ^5.6.1 + "@ethersproject/logger": ^5.6.0 + "@ethersproject/rlp": ^5.6.1 + checksum: 262096ef05a1b626c161a72698a5d8b06aebf821fe01a1651ab40f80c29ca2481b96be7f972745785fd6399906509458c4c9a38f3bc1c1cb5afa7d2f76f7309a + languageName: node + linkType: hard + "@ethersproject/address@npm:5.7.0, @ethersproject/address@npm:^5.0.0, @ethersproject/address@npm:^5.0.2, @ethersproject/address@npm:^5.0.4, @ethersproject/address@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/address@npm:5.7.0" @@ -892,7 +796,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/bignumber@npm:5.7.0, @ethersproject/bignumber@npm:^5.0.7, @ethersproject/bignumber@npm:^5.7.0": +"@ethersproject/bignumber@npm:5.7.0, @ethersproject/bignumber@npm:^5.0.7, @ethersproject/bignumber@npm:^5.6.2, @ethersproject/bignumber@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/bignumber@npm:5.7.0" dependencies: @@ -903,7 +807,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/bytes@npm:5.7.0, @ethersproject/bytes@npm:^5.0.4, @ethersproject/bytes@npm:^5.7.0": +"@ethersproject/bytes@npm:5.7.0, @ethersproject/bytes@npm:^5.0.4, @ethersproject/bytes@npm:^5.6.1, @ethersproject/bytes@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/bytes@npm:5.7.0" dependencies: @@ -997,7 +901,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/keccak256@npm:5.7.0, @ethersproject/keccak256@npm:^5.0.3, @ethersproject/keccak256@npm:^5.7.0": +"@ethersproject/keccak256@npm:5.7.0, @ethersproject/keccak256@npm:^5.0.3, @ethersproject/keccak256@npm:^5.6.1, @ethersproject/keccak256@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/keccak256@npm:5.7.0" dependencies: @@ -1007,7 +911,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/logger@npm:5.7.0, @ethersproject/logger@npm:^5.0.5, @ethersproject/logger@npm:^5.7.0": +"@ethersproject/logger@npm:5.7.0, @ethersproject/logger@npm:^5.0.5, @ethersproject/logger@npm:^5.6.0, @ethersproject/logger@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/logger@npm:5.7.0" checksum: 075ab2f605f1fd0813f2e39c3308f77b44a67732b36e712d9bc085f22a84aac4da4f71b39bee50fe78da3e1c812673fadc41180c9970fe5e486e91ea17befe0d @@ -1042,7 +946,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.0, @ethersproject/providers@npm:^5.7.1, @ethersproject/providers@npm:^5.7.2": +"@ethersproject/providers@npm:5.7.2, @ethersproject/providers@npm:^5.7.0, @ethersproject/providers@npm:^5.7.2": version: 5.7.2 resolution: "@ethersproject/providers@npm:5.7.2" dependencies: @@ -1080,7 +984,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/rlp@npm:5.7.0, @ethersproject/rlp@npm:^5.7.0": +"@ethersproject/rlp@npm:5.7.0, @ethersproject/rlp@npm:^5.6.1, @ethersproject/rlp@npm:^5.7.0": version: 5.7.0 resolution: "@ethersproject/rlp@npm:5.7.0" dependencies: @@ -1115,7 +1019,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/solidity@npm:5.7.0, @ethersproject/solidity@npm:^5.0.0, @ethersproject/solidity@npm:^5.7.0": +"@ethersproject/solidity@npm:5.7.0, @ethersproject/solidity@npm:^5.0.0": version: 5.7.0 resolution: "@ethersproject/solidity@npm:5.7.0" dependencies: @@ -1168,7 +1072,7 @@ __metadata: languageName: node linkType: hard -"@ethersproject/wallet@npm:5.7.0, @ethersproject/wallet@npm:^5.7.0": +"@ethersproject/wallet@npm:5.7.0": version: 5.7.0 resolution: "@ethersproject/wallet@npm:5.7.0" dependencies: @@ -1218,9 +1122,9 @@ __metadata: linkType: hard "@fastify/busboy@npm:^2.0.0": - version: 2.0.0 - resolution: "@fastify/busboy@npm:2.0.0" - checksum: 41879937ce1dee6421ef9cd4da53239830617e1f0bb7a0e843940772cd72827205d05e518af6adabe6e1ea19301285fff432b9d11bad01a531e698bea95c781b + version: 2.1.1 + resolution: "@fastify/busboy@npm:2.1.1" + checksum: 42c32ef75e906c9a4809c1e1930a5ca6d4ddc8d138e1a8c8ba5ea07f997db32210617d23b2e4a85fe376316a41a1a0439fc6ff2dedf5126d96f45a9d80754fb2 languageName: node linkType: hard @@ -1283,14 +1187,14 @@ __metadata: languageName: node linkType: hard -"@hapi/hoek@npm:^9.0.0": +"@hapi/hoek@npm:^9.0.0, @hapi/hoek@npm:^9.3.0": version: 9.3.0 resolution: "@hapi/hoek@npm:9.3.0" checksum: 4771c7a776242c3c022b168046af4e324d116a9d2e1d60631ee64f474c6e38d1bb07092d898bf95c7bc5d334c5582798a1456321b2e53ca817d4e7c88bc25b43 languageName: node linkType: hard -"@hapi/topo@npm:^5.0.0": +"@hapi/topo@npm:^5.1.0": version: 5.1.0 resolution: "@hapi/topo@npm:5.1.0" dependencies: @@ -1300,22 +1204,11 @@ __metadata: linkType: hard "@heroicons/react@npm:^2.0.11": - version: 2.1.1 - resolution: "@heroicons/react@npm:2.1.1" + version: 2.1.3 + resolution: "@heroicons/react@npm:2.1.3" peerDependencies: react: ">= 16" - checksum: 5ba8add458d23f6bbb823d759181d1d7e70707d966ad14577e05bbeb17e383aef800e0df7a163f4a5ec7987dd5e9816cd5d9edc0d874984db34818600bfd5c9e - languageName: node - linkType: hard - -"@humanwhocodes/config-array@npm:^0.11.11": - version: 0.11.11 - resolution: "@humanwhocodes/config-array@npm:0.11.11" - dependencies: - "@humanwhocodes/object-schema": ^1.2.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: db84507375ab77b8ffdd24f498a5b49ad6b64391d30dd2ac56885501d03964d29637e05b1ed5aefa09d57ac667e28028bc22d2da872bfcd619652fbdb5f4ca19 + checksum: 2a72920fa36d789d08aab76f09a687dd86f2ed665d21d796593e3f744457d5436467f1c3324103a794afa9ca7235ffd1fde00953ce348b501c7304890b1fe746 languageName: node linkType: hard @@ -1337,24 +1230,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 - languageName: node - linkType: hard - "@humanwhocodes/object-schema@npm:^2.0.2": - version: 2.0.2 - resolution: "@humanwhocodes/object-schema@npm:2.0.2" - checksum: 2fc11503361b5fb4f14714c700c02a3f4c7c93e9acd6b87a29f62c522d90470f364d6161b03d1cc618b979f2ae02aed1106fd29d302695d8927e2fc8165ba8ee - languageName: node - linkType: hard - -"@ioredis/commands@npm:^1.1.1": - version: 1.2.0 - resolution: "@ioredis/commands@npm:1.2.0" - checksum: 9b20225ba36ef3e5caf69b3c0720597c3016cc9b1e157f519ea388f621dd9037177f84cfe7e25c4c32dad7dd90c70ff9123cd411f747e053cf292193c9c461e2 + version: 2.0.3 + resolution: "@humanwhocodes/object-schema@npm:2.0.3" + checksum: d3b78f6c5831888c6ecc899df0d03bcc25d46f3ad26a11d7ea52944dc36a35ef543fad965322174238d677a43d5c694434f6607532cff7077062513ad7022631 languageName: node linkType: hard @@ -1651,28 +1530,28 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" +"@jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.5 + resolution: "@jridgewell/gen-mapping@npm:0.3.5" dependencies: - "@jridgewell/set-array": ^1.0.1 + "@jridgewell/set-array": ^1.2.1 "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab + "@jridgewell/trace-mapping": ^0.3.24 + checksum: ff7a1764ebd76a5e129c8890aa3e2f46045109dabde62b0b6c6a250152227647178ff2069ea234753a690d8f3c4ac8b5e7b267bbee272bffb7f3b0a370ab6e52 languageName: node linkType: hard "@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + version: 3.1.2 + resolution: "@jridgewell/resolve-uri@npm:3.1.2" + checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 languageName: node linkType: hard @@ -1693,23 +1572,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18": - version: 0.3.22 - resolution: "@jridgewell/trace-mapping@npm:0.3.22" +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: "@jridgewell/resolve-uri": ^3.1.0 "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: ac7dd2cfe0b479aa1b81776d40d789243131cc792dc8b6b6a028c70fcd6171958ae1a71bf67b618ffe3c0c3feead9870c095ee46a5e30319410d92976b28f498 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.19 - resolution: "@jridgewell/trace-mapping@npm:0.3.19" - dependencies: - "@jridgewell/resolve-uri": ^3.1.0 - "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: 956a6f0f6fec060fb48c6bf1f5ec2064e13cd38c8be3873877d4b92b4a27ba58289a34071752671262a3e3c202abcc3fa2aac64d8447b4b0fa1ba3c9047f1c20 + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 languageName: node linkType: hard @@ -1773,23 +1642,23 @@ __metadata: linkType: hard "@metamask/json-rpc-engine@npm:^7.0.0": - version: 7.3.2 - resolution: "@metamask/json-rpc-engine@npm:7.3.2" + version: 7.3.3 + resolution: "@metamask/json-rpc-engine@npm:7.3.3" dependencies: - "@metamask/rpc-errors": ^6.1.0 + "@metamask/rpc-errors": ^6.2.1 "@metamask/safe-event-emitter": ^3.0.0 "@metamask/utils": ^8.3.0 - checksum: 396861afc72944af410d5b06c81806db2fd9812206dbf799438f42d974edac6931f6814133adf52d6aa233d5ea3f3629663ef4f54a0cf9ccb948ce9b527137fd + checksum: 7bab8b4d2341a6243ba451bc58283f0a6905b09f7257857859848a51a795444ca6899b1a6908b15f8ed236fb574ab85a630c9cb28d127ab52c4630e496c16006 languageName: node linkType: hard -"@metamask/rpc-errors@npm:^6.1.0": - version: 6.2.0 - resolution: "@metamask/rpc-errors@npm:6.2.0" +"@metamask/rpc-errors@npm:^6.2.1": + version: 6.2.1 + resolution: "@metamask/rpc-errors@npm:6.2.1" dependencies: "@metamask/utils": ^8.3.0 fast-safe-stringify: ^2.0.6 - checksum: 1db3065d3f391916ef958531f4e1101a9c3abd0794f446a8b938165bd6e2ddb706f174ad4fdd5a04bfe4eb6b2bb4dd638957cb9bc321f6835cb0431264327087 + checksum: a9223c3cb9ab05734ea0dda990597f90a7cdb143efa0c026b1a970f2094fe5fa3c341ed39b1e7623be13a96b98fb2c697ef51a2e2b87d8f048114841d35ee0a9 languageName: node linkType: hard @@ -1801,9 +1670,9 @@ __metadata: linkType: hard "@metamask/safe-event-emitter@npm:^3.0.0": - version: 3.0.0 - resolution: "@metamask/safe-event-emitter@npm:3.0.0" - checksum: 8dc58a76f9f75bf2405931465fc311c68043d851e6b8ebe9f82ae339073a08a83430dba9338f8e3adc4bfc8067607125074bcafa32baee3a5157f42343dc89e5 + version: 3.1.1 + resolution: "@metamask/safe-event-emitter@npm:3.1.1" + checksum: e24db4d7c20764bfc5b025065f92518c805f0ffb1da4820078b8cff7dcae964c0f354cf053fcb7ac659de015d5ffdf21aae5e8d44e191ee8faa9066855f22653 languageName: node linkType: hard @@ -1821,8 +1690,8 @@ __metadata: linkType: hard "@metamask/utils@npm:^8.3.0": - version: 8.3.0 - resolution: "@metamask/utils@npm:8.3.0" + version: 8.4.0 + resolution: "@metamask/utils@npm:8.4.0" dependencies: "@ethereumjs/tx": ^4.2.0 "@noble/hashes": ^1.3.1 @@ -1832,7 +1701,8 @@ __metadata: pony-cause: ^2.1.10 semver: ^7.5.4 superstruct: ^1.0.3 - checksum: cd60c49b4c0397fb31e6b38937a0d9346cbb8337cb8add59db8db0e0e2156fb063ff4df93a26410157f0cc02aa9a9b785fc1b53cfc4ab73204462893ed11cacb + uuid: ^9.0.1 + checksum: b0397e97bac7192f6189a8625a2dfcb56d3c2cf4dd2cb3d4e012a7e9786f04f59f6917805544bc131a6dacd2c8344e237ae43ad47429bb5eb35c6cf1248440b4 languageName: node linkType: hard @@ -1921,94 +1791,85 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:14.1.0": - version: 14.1.0 - resolution: "@next/env@npm:14.1.0" - checksum: ecec03a3e9745996ed1c7fc218fc9a1a4345a0cf368afb50f38a3b6fbf6f966a36dba174c90b5f90b568188dbd0eba48a2c5448b6742298417df4ff3351c6d40 +"@next/env@npm:14.2.3": + version: 14.2.3 + resolution: "@next/env@npm:14.2.3" + checksum: 47ddb64ec6cdc13dfcf560ba42cce71d7948174bf800162738e20ba0147cc46a5f6fdde1eb7957a3676a9eca6dccf6603836ed7c755eab238d9f5c73614d9880 languageName: node linkType: hard -"@next/eslint-plugin-next@npm:14.1.0": - version: 14.1.0 - resolution: "@next/eslint-plugin-next@npm:14.1.0" +"@next/eslint-plugin-next@npm:14.2.3": + version: 14.2.3 + resolution: "@next/eslint-plugin-next@npm:14.2.3" dependencies: glob: 10.3.10 - checksum: 7cd6789f27da102314b5784d4a4ba1a1789349f0c227bf5a90afcbd307bea98ea43b4cb1924fe9e67e11d48d3280eec1a1ca81558b6149e0122545fa37f00470 + checksum: f149344f0f347e02a7d2302c0e318a42a565e6930cd7a72b4681e157a0aa2c5079d2c5cf019b9b58a1e19ff5a3fe273fd80d53add8b3c1a9fe5b7ed70d70ae4a languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:14.1.0": - version: 14.1.0 - resolution: "@next/swc-darwin-arm64@npm:14.1.0" +"@next/swc-darwin-arm64@npm:14.2.3": + version: 14.2.3 + resolution: "@next/swc-darwin-arm64@npm:14.2.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:14.1.0": - version: 14.1.0 - resolution: "@next/swc-darwin-x64@npm:14.1.0" +"@next/swc-darwin-x64@npm:14.2.3": + version: 14.2.3 + resolution: "@next/swc-darwin-x64@npm:14.2.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:14.1.0": - version: 14.1.0 - resolution: "@next/swc-linux-arm64-gnu@npm:14.1.0" +"@next/swc-linux-arm64-gnu@npm:14.2.3": + version: 14.2.3 + resolution: "@next/swc-linux-arm64-gnu@npm:14.2.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:14.1.0": - version: 14.1.0 - resolution: "@next/swc-linux-arm64-musl@npm:14.1.0" +"@next/swc-linux-arm64-musl@npm:14.2.3": + version: 14.2.3 + resolution: "@next/swc-linux-arm64-musl@npm:14.2.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:14.1.0": - version: 14.1.0 - resolution: "@next/swc-linux-x64-gnu@npm:14.1.0" +"@next/swc-linux-x64-gnu@npm:14.2.3": + version: 14.2.3 + resolution: "@next/swc-linux-x64-gnu@npm:14.2.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:14.1.0": - version: 14.1.0 - resolution: "@next/swc-linux-x64-musl@npm:14.1.0" +"@next/swc-linux-x64-musl@npm:14.2.3": + version: 14.2.3 + resolution: "@next/swc-linux-x64-musl@npm:14.2.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:14.1.0": - version: 14.1.0 - resolution: "@next/swc-win32-arm64-msvc@npm:14.1.0" +"@next/swc-win32-arm64-msvc@npm:14.2.3": + version: 14.2.3 + resolution: "@next/swc-win32-arm64-msvc@npm:14.2.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:14.1.0": - version: 14.1.0 - resolution: "@next/swc-win32-ia32-msvc@npm:14.1.0" +"@next/swc-win32-ia32-msvc@npm:14.2.3": + version: 14.2.3 + resolution: "@next/swc-win32-ia32-msvc@npm:14.2.3" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:14.1.0": - version: 14.1.0 - resolution: "@next/swc-win32-x64-msvc@npm:14.1.0" +"@next/swc-win32-x64-msvc@npm:14.2.3": + version: 14.2.3 + resolution: "@next/swc-win32-x64-msvc@npm:14.2.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@noble/curves@npm:1.1.0, @noble/curves@npm:~1.1.0": - version: 1.1.0 - resolution: "@noble/curves@npm:1.1.0" - dependencies: - "@noble/hashes": 1.3.1 - checksum: 2658cdd3f84f71079b4e3516c47559d22cf4b55c23ac8ee9d2b1f8e5b72916d9689e59820e0f9d9cb4a46a8423af5b56dc6bb7782405c88be06a015180508db5 - languageName: node - linkType: hard - "@noble/curves@npm:1.2.0, @noble/curves@npm:~1.2.0": version: 1.2.0 resolution: "@noble/curves@npm:1.2.0" @@ -2018,6 +1879,15 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:1.3.0, @noble/curves@npm:~1.3.0": + version: 1.3.0 + resolution: "@noble/curves@npm:1.3.0" + dependencies: + "@noble/hashes": 1.3.3 + checksum: b65342ee66c4a440eee2978524412eabba9a9efdd16d6370e15218c6a7d80bddf35e66bb57ed52c0dfd32cb9a717b439ab3a72db618f1a0066dfebe3fd12a421 + languageName: node + linkType: hard + "@noble/hashes@npm:1.2.0, @noble/hashes@npm:~1.2.0": version: 1.2.0 resolution: "@noble/hashes@npm:1.2.0" @@ -2025,27 +1895,27 @@ __metadata: languageName: node linkType: hard -"@noble/hashes@npm:1.3.1": - version: 1.3.1 - resolution: "@noble/hashes@npm:1.3.1" - checksum: 7fdefc0f7a0c1ec27acc6ff88841793e3f93ec4ce6b8a6a12bfc0dd70ae6b7c4c82fe305fdfeda1735d5ad4a9eebe761e6693b3d355689c559e91242f4bc95b1 - languageName: node - linkType: hard - -"@noble/hashes@npm:1.3.2, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.1": +"@noble/hashes@npm:1.3.2": version: 1.3.2 resolution: "@noble/hashes@npm:1.3.2" checksum: fe23536b436539d13f90e4b9be843cc63b1b17666a07634a2b1259dded6f490be3d050249e6af98076ea8f2ea0d56f578773c2197f2aa0eeaa5fba5bc18ba474 languageName: node linkType: hard -"@noble/hashes@npm:^1.3.1, @noble/hashes@npm:~1.3.2": +"@noble/hashes@npm:1.3.3, @noble/hashes@npm:~1.3.0, @noble/hashes@npm:~1.3.2": version: 1.3.3 resolution: "@noble/hashes@npm:1.3.3" checksum: 8a6496d1c0c64797339bc694ad06cdfaa0f9e56cd0c3f68ae3666cfb153a791a55deb0af9c653c7ed2db64d537aa3e3054629740d2f2338bb1dcb7ab60cd205b languageName: node linkType: hard +"@noble/hashes@npm:^1.3.1, @noble/hashes@npm:^1.4.0": + version: 1.4.0 + resolution: "@noble/hashes@npm:1.4.0" + checksum: 8ba816ae26c90764b8c42493eea383716396096c5f7ba6bea559993194f49d80a73c081f315f4c367e51bd2d5891700bcdfa816b421d24ab45b41cb03e4f3342 + languageName: node + linkType: hard + "@noble/secp256k1@npm:1.7.1, @noble/secp256k1@npm:~1.7.0": version: 1.7.1 resolution: "@noble/secp256k1@npm:1.7.1" @@ -2080,117 +1950,85 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/ethereumjs-block@npm:5.0.4": - version: 5.0.4 - resolution: "@nomicfoundation/ethereumjs-block@npm:5.0.4" - dependencies: - "@nomicfoundation/ethereumjs-common": 4.0.4 - "@nomicfoundation/ethereumjs-rlp": 5.0.4 - "@nomicfoundation/ethereumjs-trie": 6.0.4 - "@nomicfoundation/ethereumjs-tx": 5.0.4 - "@nomicfoundation/ethereumjs-util": 9.0.4 - ethereum-cryptography: 0.1.3 - checksum: fe60b3dc31e0991eb6659f838485384e52992b72dd97a42c7bec320ea9902d1200352b5690a222442f77c5447cee4dd834fc25c53247aed5aa3130b0ab7e3c53 +"@nomicfoundation/edr-darwin-arm64@npm:0.3.8": + version: 0.3.8 + resolution: "@nomicfoundation/edr-darwin-arm64@npm:0.3.8" + checksum: 20166c1cd0413fb3078c8240ad3604fb6ff6076b8142dfff14e51715ed313c73ec90486fe0a3b5a48ca3031e98e92339cd2bf825f6f199bfdf9b41bec906ebb8 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-blockchain@npm:7.0.4": - version: 7.0.4 - resolution: "@nomicfoundation/ethereumjs-blockchain@npm:7.0.4" - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.4 - "@nomicfoundation/ethereumjs-common": 4.0.4 - "@nomicfoundation/ethereumjs-ethash": 3.0.4 - "@nomicfoundation/ethereumjs-rlp": 5.0.4 - "@nomicfoundation/ethereumjs-trie": 6.0.4 - "@nomicfoundation/ethereumjs-tx": 5.0.4 - "@nomicfoundation/ethereumjs-util": 9.0.4 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - lru-cache: ^10.0.0 - checksum: 0d35f28ed5ef356557b974b91898b6f61292a3e0fd3d1b1c8924250a59c7f583939453184f5b54f7cd2a2d8c055cdc6f3b8588c7b22f839beaa4ba69638ba2c8 +"@nomicfoundation/edr-darwin-x64@npm:0.3.8": + version: 0.3.8 + resolution: "@nomicfoundation/edr-darwin-x64@npm:0.3.8" + checksum: c9ba1c9eeda71876f6c69550b20f7b0d865f6249cb88c0a3dc853d7ca32061d9a71f40f14cc628fa7f286786fc2cd48c5a2a9527a6d0f55939f2a9565809b561 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-common@npm:4.0.4": - version: 4.0.4 - resolution: "@nomicfoundation/ethereumjs-common@npm:4.0.4" - dependencies: - "@nomicfoundation/ethereumjs-util": 9.0.4 - checksum: ce3f6e4ae15b976efdb7ccda27e19aadb62b5ffee209f9503e68b4fd8633715d4d697c0cc10ccd35f5e4e977edd05100d0f214e28880ec64fff77341dc34fcdf +"@nomicfoundation/edr-linux-arm64-gnu@npm:0.3.8": + version: 0.3.8 + resolution: "@nomicfoundation/edr-linux-arm64-gnu@npm:0.3.8" + checksum: bebb780f8c22ca13af9b336873a6d00091139f88669ba4c569d03efd7a6671f10b4c6afd7ee9444d9b18364d05eedf46f4dd82d1e7329de32267175127a6989b languageName: node linkType: hard -"@nomicfoundation/ethereumjs-ethash@npm:3.0.4": - version: 3.0.4 - resolution: "@nomicfoundation/ethereumjs-ethash@npm:3.0.4" - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.4 - "@nomicfoundation/ethereumjs-rlp": 5.0.4 - "@nomicfoundation/ethereumjs-util": 9.0.4 - bigint-crypto-utils: ^3.2.2 - ethereum-cryptography: 0.1.3 - checksum: 52c2b003078be233929ae8355e8d2e0949ac66f75312a47725790b87111293de4303750a446f10eec22f5ffd9a2accb3f17fff8e6a85c36b47786e25242dad66 +"@nomicfoundation/edr-linux-arm64-musl@npm:0.3.8": + version: 0.3.8 + resolution: "@nomicfoundation/edr-linux-arm64-musl@npm:0.3.8" + checksum: 6cf009e4686780c41c6af271e67d1414b5e5096e5422f64980b8c3a4ddd6273b3289a5d228d976b217d6c1d8da52af912f599d923a098225b9dd906f03b889c8 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-evm@npm:2.0.4": - version: 2.0.4 - resolution: "@nomicfoundation/ethereumjs-evm@npm:2.0.4" - dependencies: - "@nomicfoundation/ethereumjs-common": 4.0.4 - "@nomicfoundation/ethereumjs-statemanager": 2.0.4 - "@nomicfoundation/ethereumjs-tx": 5.0.4 - "@nomicfoundation/ethereumjs-util": 9.0.4 - "@types/debug": ^4.1.9 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - rustbn-wasm: ^0.2.0 - checksum: db25327f7bda067cd0726a1bc7937c1c0405602fbe692abaa804f44e4fe9d2dcce103d50a767c0f3dc3067b38c35f468e997789234d2a4aef0ad31a36ad6d916 +"@nomicfoundation/edr-linux-x64-gnu@npm:0.3.8": + version: 0.3.8 + resolution: "@nomicfoundation/edr-linux-x64-gnu@npm:0.3.8" + checksum: 6afb66601880bee40a254272ecb88d3c00b1acd97bde503127b2d900d15aa2707926b56e652abdfb0c0e75dde53e201aaef40ae0fd3bd7c6e48163eaa6ed3a17 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-rlp@npm:5.0.4": - version: 5.0.4 - resolution: "@nomicfoundation/ethereumjs-rlp@npm:5.0.4" - bin: - rlp: bin/rlp.cjs - checksum: ee2c2e5776c73801dc5ed636f4988b599b4563c2d0037da542ea57eb237c69dd1ac555f6bcb5e06f70515b6459779ba0d68252a6e105132b4659ab4bf62919b0 +"@nomicfoundation/edr-linux-x64-musl@npm:0.3.8": + version: 0.3.8 + resolution: "@nomicfoundation/edr-linux-x64-musl@npm:0.3.8" + checksum: 72cd4be88ea30fd47fa1f984f446d80bf6d33e928e35df02ae4b842701b459dd92d7ba4071e388c95739a9688d6247100cb7155f3e67a5e624f54b2b42098dfd languageName: node linkType: hard -"@nomicfoundation/ethereumjs-statemanager@npm:2.0.4": - version: 2.0.4 - resolution: "@nomicfoundation/ethereumjs-statemanager@npm:2.0.4" +"@nomicfoundation/edr-win32-x64-msvc@npm:0.3.8": + version: 0.3.8 + resolution: "@nomicfoundation/edr-win32-x64-msvc@npm:0.3.8" + checksum: d7b5bbe71f2347075a9e4d88d22609ec9b8058734ee048ff94300fecb51afad96d0d596686ad9cf6cf8ee74d1c117bf53ce5d77bf077cb472977d4a9bd88eb43 + languageName: node + linkType: hard + +"@nomicfoundation/edr@npm:^0.3.7": + version: 0.3.8 + resolution: "@nomicfoundation/edr@npm:0.3.8" dependencies: - "@nomicfoundation/ethereumjs-common": 4.0.4 - "@nomicfoundation/ethereumjs-rlp": 5.0.4 - "@nomicfoundation/ethereumjs-trie": 6.0.4 - "@nomicfoundation/ethereumjs-util": 9.0.4 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - js-sdsl: ^4.1.4 - lru-cache: ^10.0.0 - peerDependencies: - "@nomicfoundation/ethereumjs-verkle": 0.0.2 - peerDependenciesMeta: - "@nomicfoundation/ethereumjs-verkle": - optional: true - checksum: 585dc67872d37f39310d85fc5c1b3179691412b9450411422ad6468017d8723e5192d22447c927d8403f7b6e95c1ecf7b48467edc440e50f15b5ac81e1fecd1d + "@nomicfoundation/edr-darwin-arm64": 0.3.8 + "@nomicfoundation/edr-darwin-x64": 0.3.8 + "@nomicfoundation/edr-linux-arm64-gnu": 0.3.8 + "@nomicfoundation/edr-linux-arm64-musl": 0.3.8 + "@nomicfoundation/edr-linux-x64-gnu": 0.3.8 + "@nomicfoundation/edr-linux-x64-musl": 0.3.8 + "@nomicfoundation/edr-win32-x64-msvc": 0.3.8 + checksum: 31047fdde18034e2c6bd65dfbe3192c149b2af7f06a108e8c7b829c45bc5071c9d536c68d2d3b988bc67c7f7d331f0a88eee49ce3c882b3bcd5e20bc301d32a8 languageName: node linkType: hard -"@nomicfoundation/ethereumjs-trie@npm:6.0.4": - version: 6.0.4 - resolution: "@nomicfoundation/ethereumjs-trie@npm:6.0.4" +"@nomicfoundation/ethereumjs-common@npm:4.0.4": + version: 4.0.4 + resolution: "@nomicfoundation/ethereumjs-common@npm:4.0.4" dependencies: - "@nomicfoundation/ethereumjs-rlp": 5.0.4 "@nomicfoundation/ethereumjs-util": 9.0.4 - "@types/readable-stream": ^2.3.13 - ethereum-cryptography: 0.1.3 - lru-cache: ^10.0.0 - readable-stream: ^3.6.0 - checksum: 93a6be32657e67e74714fe557dbaf606d92c5cd1571c60f249295c27b0ab24b64e2e59cf211c214f8ba403d6475d23ed8c557be9077b92b2317e44384de8a6bf + checksum: ce3f6e4ae15b976efdb7ccda27e19aadb62b5ffee209f9503e68b4fd8633715d4d697c0cc10ccd35f5e4e977edd05100d0f214e28880ec64fff77341dc34fcdf + languageName: node + linkType: hard + +"@nomicfoundation/ethereumjs-rlp@npm:5.0.4": + version: 5.0.4 + resolution: "@nomicfoundation/ethereumjs-rlp@npm:5.0.4" + bin: + rlp: bin/rlp.cjs + checksum: ee2c2e5776c73801dc5ed636f4988b599b4563c2d0037da542ea57eb237c69dd1ac555f6bcb5e06f70515b6459779ba0d68252a6e105132b4659ab4bf62919b0 languageName: node linkType: hard @@ -2226,38 +2064,7 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/ethereumjs-verkle@npm:0.0.2": - version: 0.0.2 - resolution: "@nomicfoundation/ethereumjs-verkle@npm:0.0.2" - dependencies: - "@nomicfoundation/ethereumjs-rlp": 5.0.4 - "@nomicfoundation/ethereumjs-util": 9.0.4 - lru-cache: ^10.0.0 - rust-verkle-wasm: ^0.0.1 - checksum: e075d7a2475670bb7039e715f0edce849ef3947aae2c7d0b658f058686ac9df3863499a5324717beff5d8f20a751f85ba1449942af818ec6772d775dcbb011d6 - languageName: node - linkType: hard - -"@nomicfoundation/ethereumjs-vm@npm:7.0.4": - version: 7.0.4 - resolution: "@nomicfoundation/ethereumjs-vm@npm:7.0.4" - dependencies: - "@nomicfoundation/ethereumjs-block": 5.0.4 - "@nomicfoundation/ethereumjs-blockchain": 7.0.4 - "@nomicfoundation/ethereumjs-common": 4.0.4 - "@nomicfoundation/ethereumjs-evm": 2.0.4 - "@nomicfoundation/ethereumjs-rlp": 5.0.4 - "@nomicfoundation/ethereumjs-statemanager": 2.0.4 - "@nomicfoundation/ethereumjs-trie": 6.0.4 - "@nomicfoundation/ethereumjs-tx": 5.0.4 - "@nomicfoundation/ethereumjs-util": 9.0.4 - debug: ^4.3.3 - ethereum-cryptography: 0.1.3 - checksum: 6f3b2507189b236e65dd3eaf3f072385a0252b826a348fe6ea5532a810bc2b6aab11d8ccec2cdfed629995e61e4c82c6e8765ac5794154772064ba3f18397407 - languageName: node - linkType: hard - -"@nomicfoundation/hardhat-chai-matchers@npm:^2.0.3": +"@nomicfoundation/hardhat-chai-matchers@npm:^2.0.0": version: 2.0.6 resolution: "@nomicfoundation/hardhat-chai-matchers@npm:2.0.6" dependencies: @@ -2274,44 +2081,100 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/hardhat-ethers@npm:^3.0.5": - version: 3.0.5 - resolution: "@nomicfoundation/hardhat-ethers@npm:3.0.5" +"@nomicfoundation/hardhat-ethers@npm:^3.0.0": + version: 3.0.6 + resolution: "@nomicfoundation/hardhat-ethers@npm:3.0.6" dependencies: debug: ^4.1.1 lodash.isequal: ^4.5.0 peerDependencies: ethers: ^6.1.0 hardhat: ^2.0.0 - checksum: 34b092dfec68f8d8673c96af717660327edc814bc5c9cdb5bc1f82d5bde2b18bc9b9d3499a632784a3d4f2505ac174217e55d31b546b7eaa77a5bb30b3c80bb4 + checksum: 31a9b5aeb7b42cf3d8bcd1f11e680ce7018874a4c63b16b01a928fb34d2bd3e0f046fc4c7180e01bcd8b8b398874fc370317165284b3f543c4f3d1fbdcfbf05d languageName: node linkType: hard -"@nomicfoundation/hardhat-foundry@npm:^1.1.1": - version: 1.1.1 - resolution: "@nomicfoundation/hardhat-foundry@npm:1.1.1" +"@nomicfoundation/hardhat-foundry@npm:^1.1.2": + version: 1.1.2 + resolution: "@nomicfoundation/hardhat-foundry@npm:1.1.2" dependencies: chalk: ^2.4.2 peerDependencies: hardhat: ^2.17.2 - checksum: 35d241638c1dbcfd14ed2006d4d7bee4e40d50bd866fcf4f02cb06084d5220182bcaf3f57ea5e99ee40335dd15a9392e106a29e9fd3cf74ab87e9215573ce787 + checksum: 8711f4f383d5ad09e41dbb72af5106b049d11c1934efcdd48e9c44ac84a35e57115b98d4444480350ef9880dc82d3a24015b0d96bcb3d833ad788f435e286568 languageName: node linkType: hard -"@nomicfoundation/hardhat-network-helpers@npm:^1.0.6": - version: 1.0.9 - resolution: "@nomicfoundation/hardhat-network-helpers@npm:1.0.9" +"@nomicfoundation/hardhat-ignition-ethers@npm:^0.15.4": + version: 0.15.4 + resolution: "@nomicfoundation/hardhat-ignition-ethers@npm:0.15.4" + peerDependencies: + "@nomicfoundation/hardhat-ethers": ^3.0.4 + "@nomicfoundation/hardhat-ignition": ^0.15.4 + "@nomicfoundation/ignition-core": ^0.15.4 + ethers: ^6.7.0 + hardhat: ^2.18.0 + checksum: f876dbd1afae4420c80dbbc5534fb42c5ca56b32837a6c65148e7c42a1aec770a24df025b5c6039f59ccb709df6b9b1bf7c89a8d3907b47781b2b134c44a43f4 + languageName: node + linkType: hard + +"@nomicfoundation/hardhat-ignition@npm:^0.15.4": + version: 0.15.4 + resolution: "@nomicfoundation/hardhat-ignition@npm:0.15.4" + dependencies: + "@nomicfoundation/ignition-core": ^0.15.4 + "@nomicfoundation/ignition-ui": ^0.15.4 + chalk: ^4.0.0 + debug: ^4.3.2 + fs-extra: ^10.0.0 + prompts: ^2.4.2 + peerDependencies: + "@nomicfoundation/hardhat-verify": ^2.0.1 + hardhat: ^2.18.0 + checksum: b0c341e30f1bdc4cae03d485ff9270d573a5cc1dbbffcac2fb7499d2856c0b99759be84e6c0ee9483b84ef53ab896774226c9c3b8dae2e6ab14d435e43b31577 + languageName: node + linkType: hard + +"@nomicfoundation/hardhat-network-helpers@npm:^1.0.0": + version: 1.0.10 + resolution: "@nomicfoundation/hardhat-network-helpers@npm:1.0.10" dependencies: ethereumjs-util: ^7.1.4 peerDependencies: hardhat: ^2.9.5 - checksum: ff378795075af853aeaacb7bc0783928d947d7f9fb043c046fcaffdf1e1219c4af47b18ea7fa2c10fe0b25daef48f13ae8b103bc11ea494ecdfbe34a3dcdf936 + checksum: 675da8d3229946a2bac0df9d1b5cc278bba9cd1a8214b5ff6099dcba874d913df07b9772a2ead0cb7ea2ced6b3fa430a73f94a3e257ae105493931c38fc7bf61 languageName: node linkType: hard -"@nomicfoundation/hardhat-verify@npm:^2.0.3": - version: 2.0.4 - resolution: "@nomicfoundation/hardhat-verify@npm:2.0.4" +"@nomicfoundation/hardhat-toolbox@npm:^5.0.0": + version: 5.0.0 + resolution: "@nomicfoundation/hardhat-toolbox@npm:5.0.0" + peerDependencies: + "@nomicfoundation/hardhat-chai-matchers": ^2.0.0 + "@nomicfoundation/hardhat-ethers": ^3.0.0 + "@nomicfoundation/hardhat-ignition-ethers": ^0.15.0 + "@nomicfoundation/hardhat-network-helpers": ^1.0.0 + "@nomicfoundation/hardhat-verify": ^2.0.0 + "@typechain/ethers-v6": ^0.5.0 + "@typechain/hardhat": ^9.0.0 + "@types/chai": ^4.2.0 + "@types/mocha": ">=9.1.0" + "@types/node": ">=18.0.0" + chai: ^4.2.0 + ethers: ^6.4.0 + hardhat: ^2.11.0 + hardhat-gas-reporter: ^1.0.8 + solidity-coverage: ^0.8.1 + ts-node: ">=8.0.0" + typechain: ^8.3.0 + typescript: ">=4.5.0" + checksum: 18890eaf1cc130afb7dc83ea48cb6ef23c499eb5d28c3fbb36e706082383a320118ee6d4491ede64acf684d2f1ffa117cf84ad80d8ebde9fa52a443f8780a898 + languageName: node + linkType: hard + +"@nomicfoundation/hardhat-verify@npm:^2.0.0": + version: 2.0.7 + resolution: "@nomicfoundation/hardhat-verify@npm:2.0.7" dependencies: "@ethersproject/abi": ^5.1.2 "@ethersproject/address": ^5.0.2 @@ -2324,7 +2187,31 @@ __metadata: undici: ^5.14.0 peerDependencies: hardhat: ^2.0.4 - checksum: 249c73404e5ed71cd9d8fb4d4736804f4f358866985e6e59641ed9047cdb2f6aa19e407f690bf38a6dca35350e7dba168911c2810a6d670f0838f2865df718e8 + checksum: 4b9f2c3001d56c8a2d05af11cc57461e6985723220d9af33f46c01ecd1c4eece474e3860fc4e256bcb23a1a4f6e9a26ec535264aa7d1b97be146d46262a96473 + languageName: node + linkType: hard + +"@nomicfoundation/ignition-core@npm:^0.15.4": + version: 0.15.4 + resolution: "@nomicfoundation/ignition-core@npm:0.15.4" + dependencies: + "@ethersproject/address": 5.6.1 + "@nomicfoundation/solidity-analyzer": ^0.1.1 + cbor: ^9.0.0 + debug: ^4.3.2 + ethers: ^6.7.0 + fs-extra: ^10.0.0 + immer: 10.0.2 + lodash: 4.17.21 + ndjson: 2.0.0 + checksum: ec0a14ae723fe34011445011495bdfa61a1631f912da74f6ba662845e5b472c1a121032cabc3568ab62864ee9048ea5bbbf860c3e5eb9fffb7fcce31dd6504f9 + languageName: node + linkType: hard + +"@nomicfoundation/ignition-ui@npm:^0.15.4": + version: 0.15.4 + resolution: "@nomicfoundation/ignition-ui@npm:0.15.4" + checksum: 50d6f187a2c3654fb9fb96cad0bbf9bc6ca29ea047be5254d3666b319cc1816c8efe83157492510cbea480b40d3b09e9a67d0612a1dc2d68ba6f8c9d5021be32 languageName: node linkType: hard @@ -2398,7 +2285,7 @@ __metadata: languageName: node linkType: hard -"@nomicfoundation/solidity-analyzer@npm:^0.1.0": +"@nomicfoundation/solidity-analyzer@npm:^0.1.0, @nomicfoundation/solidity-analyzer@npm:^0.1.1": version: 0.1.1 resolution: "@nomicfoundation/solidity-analyzer@npm:0.1.1" dependencies: @@ -2437,42 +2324,25 @@ __metadata: languageName: node linkType: hard -"@nomiclabs/hardhat-ethers@npm:^2.2.3": - version: 2.2.3 - resolution: "@nomiclabs/hardhat-ethers@npm:2.2.3" - peerDependencies: - ethers: ^5.0.0 - hardhat: ^2.0.0 - checksum: 72321317e55eb510306e04c42353c5f7ceb42d086fc76cc740120da6e1635b7ad5bbf23a8d6b02bd590754adcf646618933111624085ab249b1ff3482e773226 - languageName: node - linkType: hard - -"@nomiclabs/hardhat-etherscan@npm:^3.1.0": - version: 3.1.8 - resolution: "@nomiclabs/hardhat-etherscan@npm:3.1.8" +"@npmcli/agent@npm:^2.0.0": + version: 2.2.2 + resolution: "@npmcli/agent@npm:2.2.2" dependencies: - "@ethersproject/abi": ^5.1.2 - "@ethersproject/address": ^5.0.2 - cbor: ^8.1.0 - chalk: ^2.4.2 - debug: ^4.1.1 - fs-extra: ^7.0.1 - lodash: ^4.17.11 - semver: ^6.3.0 - table: ^6.8.0 - undici: ^5.14.0 - peerDependencies: - hardhat: ^2.0.4 - checksum: 13864380d104705a54668adf2fb37a87d1147a064c1d29dbc356390e7254d5c7501b9b3af9c4ec2f9d9ff642a01417d5d35970d626fe706f5f4830820ae89ecb + agent-base: ^7.1.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.1 + lru-cache: ^10.0.1 + socks-proxy-agent: ^8.0.3 + checksum: 67de7b88cc627a79743c88bab35e023e23daf13831a8aa4e15f998b92f5507b644d8ffc3788afc8e64423c612e0785a6a92b74782ce368f49a6746084b50d874 languageName: node linkType: hard "@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" + version: 3.1.1 + resolution: "@npmcli/fs@npm:3.1.1" dependencies: semver: ^7.3.5 - checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e + checksum: d960cab4b93adcb31ce223bfb75c5714edbd55747342efb67dcc2f25e023d930a7af6ece3e75f2f459b6f38fc14d031c766f116cd124fdc937fd33112579e820 languageName: node linkType: hard @@ -2521,9 +2391,9 @@ __metadata: linkType: hard "@openzeppelin/contracts-upgradeable@npm:^4.7.3": - version: 4.9.3 - resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.3" - checksum: bda0240b1d44c913ec5a4e109c622f216c2bbd7b468d210822f75782a5f7fe0609d08bf03b78b253333625e99e507cf2f75212f1de3b274bd9fc64ae967aeec3 + version: 4.9.6 + resolution: "@openzeppelin/contracts-upgradeable@npm:4.9.6" + checksum: 481075e7222cab025ae55304263fca69a2d04305521957bc16d2aece9fa2b86b6914711724822493e3d04df7e793469cd0bcb1e09f0ddd10cb4e360ac7eed12a languageName: node linkType: hard @@ -2535,9 +2405,9 @@ __metadata: linkType: hard "@openzeppelin/contracts@npm:^4.8.1": - version: 4.9.5 - resolution: "@openzeppelin/contracts@npm:4.9.5" - checksum: 2cddeb08c006a8f99c5cc40cc80aecb449fd941cd1a92ebda315d77f48c4b4d487798a1254bffbc3ec811b390365d14665e92dbb2dd8f45aacef479d69d94574 + version: 4.9.6 + resolution: "@openzeppelin/contracts@npm:4.9.6" + checksum: 274b6e968268294f12d5ca4f0278f6e6357792c8bb4d76664f83dbdc325f780541538a127e6a6e97e4f018088b42f65952014dec9c745c0fa25081f43ef9c4bf languageName: node linkType: hard @@ -2611,14 +2481,14 @@ __metadata: languageName: node linkType: hard -"@parcel/watcher-wasm@npm:2.4.0": - version: 2.4.0 - resolution: "@parcel/watcher-wasm@npm:2.4.0" +"@parcel/watcher-wasm@npm:^2.4.1": + version: 2.4.1 + resolution: "@parcel/watcher-wasm@npm:2.4.1" dependencies: is-glob: ^4.0.3 micromatch: ^4.0.5 napi-wasm: ^1.1.0 - checksum: f32af594a20a809981b6830e8abdb59e604b670568f2344c7bc69b7447fbc135fb8a6900ba1feb5a197b3a5633a663bdfd9502e4a684aebd10abfb99f36f678b + checksum: 8ac9585b5aac43d7125ea326482b733fbe4564ed68846624647a93899885290a5a3e26c71d16adfc43dec98a69ee73256aa714f53b430be1ef501b6c69973b2e languageName: node linkType: hard @@ -2643,7 +2513,7 @@ __metadata: languageName: node linkType: hard -"@parcel/watcher@npm:^2.4.0": +"@parcel/watcher@npm:^2.4.1": version: 2.4.1 resolution: "@parcel/watcher@npm:2.4.1" dependencies: @@ -2693,14 +2563,14 @@ __metadata: languageName: node linkType: hard -"@peculiar/asn1-schema@npm:^2.3.6": - version: 2.3.6 - resolution: "@peculiar/asn1-schema@npm:2.3.6" +"@peculiar/asn1-schema@npm:^2.3.8": + version: 2.3.8 + resolution: "@peculiar/asn1-schema@npm:2.3.8" dependencies: asn1js: ^3.0.5 - pvtsutils: ^1.3.2 - tslib: ^2.4.0 - checksum: fc09387c6e3dea07fca21b54ea8c71ce3ec0f8c92377237e51aef729f0c2df92781aa7a18a546a6fe809519faeaa222df576ec21a35c6095037a78677204a55b + pvtsutils: ^1.3.5 + tslib: ^2.6.2 + checksum: 1f4dd421f1411df8bc52bca12b1cef710434c13ff0a8b5746ede42b10d62b5ad06a3925c4a6db53102aaf1e589947539a6955fa8554a9b8ebb1ffa38b0155a24 languageName: node linkType: hard @@ -2714,15 +2584,15 @@ __metadata: linkType: hard "@peculiar/webcrypto@npm:^1.4.0": - version: 1.4.3 - resolution: "@peculiar/webcrypto@npm:1.4.3" + version: 1.5.0 + resolution: "@peculiar/webcrypto@npm:1.5.0" dependencies: - "@peculiar/asn1-schema": ^2.3.6 + "@peculiar/asn1-schema": ^2.3.8 "@peculiar/json-schema": ^1.1.12 - pvtsutils: ^1.3.2 - tslib: ^2.5.0 - webcrypto-core: ^1.7.7 - checksum: 5604c02b7e9a8cef61bb4430e733e939c7737533ba65ba5fac4beb3a6d613add478ab45455cb57506789b6d00704d83e4965a0f712de3e8f40706e0961670e5c + pvtsutils: ^1.3.5 + tslib: ^2.6.2 + webcrypto-core: ^1.8.0 + checksum: 9022d7452d564a5a26fbacf477842be34736f2d9139f2f5026adc47fdeda7033193d727491503f2a829d35ab819bbfa61c82a785c49c999eac535ecd69a3a459 languageName: node linkType: hard @@ -2844,9 +2714,9 @@ __metadata: linkType: hard "@rushstack/eslint-patch@npm:^1.3.3": - version: 1.7.2 - resolution: "@rushstack/eslint-patch@npm:1.7.2" - checksum: 9c773e712cef97d4e9defbd80eb25430e727137acda45d5236c620da7b93d93ae00901f7e10e893f5a8445312f2a7ff74c241024109c066bffb423f5e3ed0b1c + version: 1.10.3 + resolution: "@rushstack/eslint-patch@npm:1.10.3" + checksum: 1042779367ee102576a3c132f052d718d7111fee9f815758a72b21e8145620f7d3403c14fcde3b4cfa1cbc14b08b8519151ff77d0f353bf647f0a0a16eafdef5 languageName: node linkType: hard @@ -2881,45 +2751,27 @@ __metadata: linkType: hard "@safe-global/safe-gateway-typescript-sdk@npm:^3.5.3": - version: 3.17.0 - resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.17.0" - checksum: 116d7e653ac5f80fe5983f7b1951e67d51731cd9cd492e23973f18fcfbd25fc2e14403080fb11533383e5cfa5339860d459b5278befb8b7cd98fbb6d5f2c210d + version: 3.21.1 + resolution: "@safe-global/safe-gateway-typescript-sdk@npm:3.21.1" + checksum: 04934d3ad1d6f97de499357522df123ebb03e15b5c9264dd1750fb6ea7cd2fa02b67223c92e27755946f2a043658071c4e5bc92a9cc7b470b9a29d261fdb5f2d languageName: node linkType: hard -"@scure/base@npm:^1.1.1, @scure/base@npm:^1.1.3, @scure/base@npm:~1.1.2": - version: 1.1.5 - resolution: "@scure/base@npm:1.1.5" - checksum: 9e9ee6088cb3aa0fb91f5a48497d26682c7829df3019b1251d088d166d7a8c0f941c68aaa8e7b96bbad20c71eb210397cb1099062cde3e29d4bad6b975c18519 - languageName: node - linkType: hard - -"@scure/base@npm:~1.1.0": - version: 1.1.3 - resolution: "@scure/base@npm:1.1.3" - checksum: 1606ab8a4db898cb3a1ada16c15437c3bce4e25854fadc8eb03ae93cbbbac1ed90655af4b0be3da37e12056fef11c0374499f69b9e658c9e5b7b3e06353c630c +"@scure/base@npm:^1.1.3, @scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2, @scure/base@npm:~1.1.4": + version: 1.1.6 + resolution: "@scure/base@npm:1.1.6" + checksum: d6deaae91deba99e87939af9e55d80edba302674983f32bba57f942e22b1726a83c62dc50d8f4370a5d5d35a212dda167fb169f4b0d0c297488d8604608fc3d3 languageName: node linkType: hard "@scure/bip32@npm:1.1.5": version: 1.1.5 - resolution: "@scure/bip32@npm:1.1.5" - dependencies: - "@noble/hashes": ~1.2.0 - "@noble/secp256k1": ~1.7.0 - "@scure/base": ~1.1.0 - checksum: b08494ab0d2b1efee7226d1b5100db5157ebea22a78bb87126982a76a186cb3048413e8be0ba2622d00d048a20acbba527af730de86c132a77de616eb9907a3b - languageName: node - linkType: hard - -"@scure/bip32@npm:1.3.1": - version: 1.3.1 - resolution: "@scure/bip32@npm:1.3.1" + resolution: "@scure/bip32@npm:1.1.5" dependencies: - "@noble/curves": ~1.1.0 - "@noble/hashes": ~1.3.1 + "@noble/hashes": ~1.2.0 + "@noble/secp256k1": ~1.7.0 "@scure/base": ~1.1.0 - checksum: 394d65f77a40651eba21a5096da0f4233c3b50d422864751d373fcf142eeedb94a1149f9ab1dbb078086dab2d0bc27e2b1afec8321bf22d4403c7df2fea5bfe2 + checksum: b08494ab0d2b1efee7226d1b5100db5157ebea22a78bb87126982a76a186cb3048413e8be0ba2622d00d048a20acbba527af730de86c132a77de616eb9907a3b languageName: node linkType: hard @@ -2934,6 +2786,17 @@ __metadata: languageName: node linkType: hard +"@scure/bip32@npm:1.3.3": + version: 1.3.3 + resolution: "@scure/bip32@npm:1.3.3" + dependencies: + "@noble/curves": ~1.3.0 + "@noble/hashes": ~1.3.2 + "@scure/base": ~1.1.4 + checksum: f939ca733972622fcc1e61d4fdf170a0ad294b24ddb7ed7cdd4c467e1ef283b970154cb101cf5f1a7b64cf5337e917ad31135911dfc36b1d76625320167df2fa + languageName: node + linkType: hard + "@scure/bip39@npm:1.1.1": version: 1.1.1 resolution: "@scure/bip39@npm:1.1.1" @@ -2954,50 +2817,47 @@ __metadata: languageName: node linkType: hard +"@scure/bip39@npm:1.2.2": + version: 1.2.2 + resolution: "@scure/bip39@npm:1.2.2" + dependencies: + "@noble/hashes": ~1.3.2 + "@scure/base": ~1.1.4 + checksum: cb99505e6d2deef8e55e81df8c563ce8dbfdf1595596dc912bceadcf366c91b05a98130e928ecb090df74efdb20150b64acc4be55bc42768cab4d39a2833d234 + languageName: node + linkType: hard + "@se-2/hardhat@workspace:packages/hardhat": version: 0.0.0-use.local resolution: "@se-2/hardhat@workspace:packages/hardhat" dependencies: "@chainlink/contracts": ^0.6.1 - "@ethersproject/abi": ^5.7.0 - "@ethersproject/providers": ^5.7.1 - "@nomicfoundation/hardhat-chai-matchers": ^2.0.3 - "@nomicfoundation/hardhat-ethers": ^3.0.5 - "@nomicfoundation/hardhat-foundry": ^1.1.1 - "@nomicfoundation/hardhat-network-helpers": ^1.0.6 - "@nomicfoundation/hardhat-verify": ^2.0.3 - "@nomiclabs/hardhat-ethers": ^2.2.3 - "@nomiclabs/hardhat-etherscan": ^3.1.0 + "@nomicfoundation/hardhat-chai-matchers": ^2.0.0 + "@nomicfoundation/hardhat-ethers": ^3.0.0 + "@nomicfoundation/hardhat-foundry": ^1.1.2 + "@nomicfoundation/hardhat-ignition": ^0.15.4 + "@nomicfoundation/hardhat-ignition-ethers": ^0.15.4 + "@nomicfoundation/hardhat-network-helpers": ^1.0.0 + "@nomicfoundation/hardhat-toolbox": ^5.0.0 + "@nomicfoundation/hardhat-verify": ^2.0.0 + "@nomicfoundation/ignition-core": ^0.15.4 "@openzeppelin/contracts": ^4.8.1 "@openzeppelin/contracts-upgradeable": 4.7.3 - "@typechain/ethers-v5": ^10.1.0 - "@typechain/ethers-v6": ^0.5.1 - "@typechain/hardhat": ^9.1.0 - "@types/eslint": ^8 - "@types/mocha": ^9.1.1 - "@types/prettier": ^2 - "@types/qrcode": ^1 - "@typescript-eslint/eslint-plugin": latest - "@typescript-eslint/parser": latest - chai: ^4.3.6 - dotenv: ^16.0.3 - envfile: ^6.18.0 - eslint: ^8.26.0 - eslint-config-prettier: ^8.5.0 - eslint-plugin-prettier: ^4.2.1 - ethers: ^6.10.0 - hardhat: ^2.19.4 - hardhat-deploy: ^0.11.45 - hardhat-deploy-ethers: ^0.4.1 - hardhat-gas-reporter: ^1.0.9 + "@typechain/ethers-v6": ^0.5.0 + "@typechain/hardhat": ^9.0.0 + "@types/chai": ^4.2.0 + "@types/jest": ^29.5.12 + "@types/mocha": ">=9.1.0" + ethers: ^6.4.0 + hardhat: ^2.22.4 + hardhat-gas-reporter: ^1.0.8 hardhat-jest: ^1.0.8 - jest: ^29.6.1 - prettier: ^2.8.4 - qrcode: ^1.5.1 - solidity-coverage: ^0.8.5 - ts-node: ^10.9.1 - typechain: ^8.1.0 - typescript: ^5.1.6 + jest: ^29.7.0 + solidity-coverage: ^0.8.1 + ts-jest: ^29.1.2 + ts-node: ^10.9.2 + typechain: ^8.3.0 + typescript: ^5.4.5 languageName: unknown linkType: soft @@ -3140,12 +3000,12 @@ __metadata: languageName: node linkType: hard -"@sideway/address@npm:^4.1.3": - version: 4.1.4 - resolution: "@sideway/address@npm:4.1.4" +"@sideway/address@npm:^4.1.5": + version: 4.1.5 + resolution: "@sideway/address@npm:4.1.5" dependencies: "@hapi/hoek": ^9.0.0 - checksum: b9fca2a93ac2c975ba12e0a6d97853832fb1f4fb02393015e012b47fa916a75ca95102d77214b2a29a2784740df2407951af8c5dde054824c65577fd293c4cdb + checksum: 3e3ea0f00b4765d86509282290368a4a5fd39a7995fdc6de42116ca19a96120858e56c2c995081def06e1c53e1f8bccc7d013f6326602bec9d56b72ee2772b9d languageName: node linkType: hard @@ -3381,12 +3241,20 @@ __metadata: languageName: node linkType: hard -"@swc/helpers@npm:0.5.2": - version: 0.5.2 - resolution: "@swc/helpers@npm:0.5.2" +"@swc/counter@npm:^0.1.3": + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: df8f9cfba9904d3d60f511664c70d23bb323b3a0803ec9890f60133954173047ba9bdeabce28cd70ba89ccd3fd6c71c7b0bd58be85f611e1ffbe5d5c18616598 + languageName: node + linkType: hard + +"@swc/helpers@npm:0.5.5": + version: 0.5.5 + resolution: "@swc/helpers@npm:0.5.5" dependencies: + "@swc/counter": ^0.1.3 tslib: ^2.4.0 - checksum: 51d7e3d8bd56818c49d6bfbd715f0dbeedc13cf723af41166e45c03e37f109336bbcb57a1f2020f4015957721aeb21e1a7fff281233d797ff7d3dd1f447fa258 + checksum: d4f207b191e54b29460804ddf2984ba6ece1d679a0b2f6a9c765dcf27bba92c5769e7965668a4546fb9f1021eaf0ff9be4bf5c235ce12adcd65acdfe77187d11 languageName: node linkType: hard @@ -3445,7 +3313,7 @@ __metadata: languageName: node linkType: hard -"@tootallnate/once@npm:2, @tootallnate/once@npm:2.0.0": +"@tootallnate/once@npm:2.0.0": version: 2.0.0 resolution: "@tootallnate/once@npm:2.0.0" checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 @@ -3485,9 +3353,9 @@ __metadata: linkType: hard "@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df + version: 1.0.11 + resolution: "@tsconfig/node10@npm:1.0.11" + checksum: 51fe47d55fe1b80ec35e6e5ed30a13665fd3a531945350aa74a14a1e82875fb60b350c2f2a5e72a64831b1b6bc02acb6760c30b3738b54954ec2dea82db7a267 languageName: node linkType: hard @@ -3512,23 +3380,7 @@ __metadata: languageName: node linkType: hard -"@typechain/ethers-v5@npm:^10.1.0": - version: 10.2.1 - resolution: "@typechain/ethers-v5@npm:10.2.1" - dependencies: - lodash: ^4.17.15 - ts-essentials: ^7.0.1 - peerDependencies: - "@ethersproject/abi": ^5.0.0 - "@ethersproject/providers": ^5.0.0 - ethers: ^5.1.3 - typechain: ^8.1.1 - typescript: ">=4.3.0" - checksum: 852da4b1ff368ef87251111a5d50077de3d0fc12c519529269a74223740f8bda89297e67a5eb6c1f5b04ee23119566d6cbccf58264d32a83132be0f328a58d22 - languageName: node - linkType: hard - -"@typechain/ethers-v6@npm:^0.5.1": +"@typechain/ethers-v6@npm:^0.5.0": version: 0.5.1 resolution: "@typechain/ethers-v6@npm:0.5.1" dependencies: @@ -3542,7 +3394,7 @@ __metadata: languageName: node linkType: hard -"@typechain/hardhat@npm:^9.1.0": +"@typechain/hardhat@npm:^9.0.0": version: 9.1.0 resolution: "@typechain/hardhat@npm:9.1.0" dependencies: @@ -3589,11 +3441,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6": - version: 7.20.5 - resolution: "@types/babel__traverse@npm:7.20.5" + version: 7.20.6 + resolution: "@types/babel__traverse@npm:7.20.6" dependencies: "@babel/types": ^7.20.7 - checksum: 608e0ab4fc31cd47011d98942e6241b34d461608c0c0e153377c5fd822c436c475f1ded76a56bfa76a1adf8d9266b727bbf9bfac90c4cb152c97f30dadc5b7e8 + checksum: 2bdc65eb62232c2d5c1086adeb0c31e7980e6fd7e50a3483b4a724a1a1029c84d9cb59749cf8de612f9afa2bc14c85b8f50e64e21f8a4398fa77eb9059a4283c languageName: node linkType: hard @@ -3607,36 +3459,36 @@ __metadata: linkType: hard "@types/bn.js@npm:^5.1.0": - version: 5.1.2 - resolution: "@types/bn.js@npm:5.1.2" + version: 5.1.5 + resolution: "@types/bn.js@npm:5.1.5" dependencies: "@types/node": "*" - checksum: 8d9fdb43836646c2ecd445041de03e057f9b459885be57faee64104160487a63730b9f371e8ad7d33f360b3cc6dc0e323543962fc5fa296b92b322b946732be0 + checksum: c87b28c4af74545624f8a3dae5294b16aa190c222626e8d4b2e327b33b1a3f1eeb43e7a24d914a9774bca43d8cd6e1cb0325c1f4b3a244af6693a024e1d918e6 languageName: node linkType: hard "@types/chai-as-promised@npm:^7.1.3": - version: 7.1.6 - resolution: "@types/chai-as-promised@npm:7.1.6" + version: 7.1.8 + resolution: "@types/chai-as-promised@npm:7.1.8" dependencies: "@types/chai": "*" - checksum: f765dd249ae9384540f8e6402bd3a9f5e87b97f9078ef58f4b5ec15f7c3673e1f10f0089f819eceb20e00b3df40b7aae1bd44d2b8f4edbbedfcb33ce296f6791 + checksum: f0e5eab451b91bc1e289ed89519faf6591932e8a28d2ec9bbe95826eb73d28fe43713633e0c18706f3baa560a7d97e7c7c20dc53ce639e5d75bac46b2a50bf21 languageName: node linkType: hard -"@types/chai@npm:*": - version: 4.3.8 - resolution: "@types/chai@npm:4.3.8" - checksum: 21431e46fa4a5602641726a24c7631bbf7ba8a41b1a290d0c73dcef6b3521c1d973ee605236b83a978cc918e55470fd04a3109d51aa30dcdf93a8b122e6c3e2c +"@types/chai@npm:*, @types/chai@npm:^4.2.0": + version: 4.3.16 + resolution: "@types/chai@npm:4.3.16" + checksum: bb5f52d1b70534ed8b4bf74bd248add003ffe1156303802ea367331607c06b494da885ffbc2b674a66b4f90c9ee88759790a5f243879f6759f124f22328f5e95 languageName: node linkType: hard "@types/cli-progress@npm:^3.11.0": - version: 3.11.3 - resolution: "@types/cli-progress@npm:3.11.3" + version: 3.11.5 + resolution: "@types/cli-progress@npm:3.11.5" dependencies: "@types/node": "*" - checksum: bc05d46091686f0d569301ad942dd25ebd7766b5ec2d7aaa5e1fc2c3b55b9a0148e8433d71e45b761e748dc4b64b6afad1ba3361e83cd3a329757d48ed430275 + checksum: 571fb3b11646415ac49c90e8003b82f3ac58d75fde5952caf40b4a079517b6e25e79ab0a7455d0ab0398d0b2de062646dba075d3d1f8d147eed2ab4d41abbf64 languageName: node linkType: hard @@ -3650,15 +3502,15 @@ __metadata: linkType: hard "@types/connect@npm:^3.4.33": - version: 3.4.36 - resolution: "@types/connect@npm:3.4.36" + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" dependencies: "@types/node": "*" - checksum: 4dee3d966fb527b98f0cbbdcf6977c9193fc3204ed539b7522fe5e64dfa45f9017bdda4ffb1f760062262fce7701a0ee1c2f6ce2e50af36c74d4e37052303172 + checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 languageName: node linkType: hard -"@types/debug@npm:^4.1.7, @types/debug@npm:^4.1.9": +"@types/debug@npm:^4.1.7": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" dependencies: @@ -3667,23 +3519,6 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:^8": - version: 8.44.4 - resolution: "@types/eslint@npm:8.44.4" - dependencies: - "@types/estree": "*" - "@types/json-schema": "*" - checksum: 15bafdaba800e2995f38d3a2a929d8e9303035315e8d3535523a21cd719b6769a45884afa955f0b845ffa545a4150429b0178e2c44feeedf59ebb285eeae9825 - languageName: node - linkType: hard - -"@types/estree@npm:*": - version: 1.0.2 - resolution: "@types/estree@npm:1.0.2" - checksum: aeedb1b2fe20cbe06f44b99b562bf9703e360bfcdf5bb3d61d248182ee1dd63500f2474e12f098ffe1f5ac3202b43b3e18ec99902d9328d5374f5512fa077e45 - languageName: node - linkType: hard - "@types/form-data@npm:0.0.33": version: 0.0.33 resolution: "@types/form-data@npm:0.0.33" @@ -3737,10 +3572,13 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12": - version: 7.0.13 - resolution: "@types/json-schema@npm:7.0.13" - checksum: 345df21a678fa72fb389f35f33de77833d09d4a142bb2bcb27c18690efa4cf70fc2876e43843cefb3fbdb9fcb12cd3e970a90936df30f53bbee899865ff605ab +"@types/jest@npm:^29.5.12": + version: 29.5.12 + resolution: "@types/jest@npm:29.5.12" + dependencies: + expect: ^29.0.0 + pretty-format: ^29.0.0 + checksum: 19b1efdeed9d9a60a81edc8226cdeae5af7479e493eaed273e01243891c9651f7b8b4c08fc633a7d0d1d379b091c4179bbaa0807af62542325fd72f2dd17ce1c languageName: node linkType: hard @@ -3795,10 +3633,10 @@ __metadata: languageName: node linkType: hard -"@types/mocha@npm:^9.1.1": - version: 9.1.1 - resolution: "@types/mocha@npm:9.1.1" - checksum: 516077c0acd9806dc78317f88aaac0df5aaf0bdc2f63dfdadeabdf0b0137953b6ca65472e6ff7c30bc93ce4e0ae76eae70e8d46764b9a8eae4877a928b6ef49a +"@types/mocha@npm:>=9.1.0": + version: 10.0.6 + resolution: "@types/mocha@npm:10.0.6" + checksum: f7c836cf6cf27dc0f5970d262591b56f2a3caeaec8cfdc612c12e1cfbb207f601f710ece207e935164d4e3343b93be5054d0db5544f31f453b3923775d82099f languageName: node linkType: hard @@ -3810,11 +3648,11 @@ __metadata: linkType: hard "@types/node@npm:*, @types/node@npm:>=13.7.0": - version: 20.8.6 - resolution: "@types/node@npm:20.8.6" + version: 20.12.12 + resolution: "@types/node@npm:20.12.12" dependencies: - undici-types: ~5.25.1 - checksum: ccfb7ac482c5a96edeb239893c5c099f5257fcc2ed9ae62fefdfbc782b79e16dbc2af9a85b379665237bf759904b44ca2be68e75d239e0297882aad42f61905c + undici-types: ~5.26.4 + checksum: 5373983874b9af7c216e7ca5d26b32a8d9829c703a69f1e66f2113598b5be8582c0e009ca97369f1ec9a6282b3f92812208d06eb1e9fc3bd9b939b022303d042 languageName: node linkType: hard @@ -3868,22 +3706,22 @@ __metadata: linkType: hard "@types/parse-json@npm:^4.0.0": - version: 4.0.0 - resolution: "@types/parse-json@npm:4.0.0" - checksum: fd6bce2b674b6efc3db4c7c3d336bd70c90838e8439de639b909ce22f3720d21344f52427f1d9e57b265fcb7f6c018699b99e5e0c208a1a4823014269a6bf35b + version: 4.0.2 + resolution: "@types/parse-json@npm:4.0.2" + checksum: 5bf62eec37c332ad10059252fc0dab7e7da730764869c980b0714777ad3d065e490627be9f40fc52f238ffa3ac4199b19de4127196910576c2fe34dd47c7a470 languageName: node linkType: hard "@types/pbkdf2@npm:^3.0.0": - version: 3.1.0 - resolution: "@types/pbkdf2@npm:3.1.0" + version: 3.1.2 + resolution: "@types/pbkdf2@npm:3.1.2" dependencies: "@types/node": "*" - checksum: d15024b1957c21cf3b8887329d9bd8dfde754cf13a09d76ae25f1391cfc62bb8b8d7b760773c5dbaa748172fba8b3e0c3dbe962af6ccbd69b76df12a48dfba40 + checksum: bebe1e596cbbe5f7d2726a58859e61986c5a42459048e29cb7f2d4d764be6bbb0844572fd5d70ca8955a8a17e8b4ed80984fc4903e165d9efb8807a3fbb051aa languageName: node linkType: hard -"@types/prettier@npm:^2, @types/prettier@npm:^2.1.1": +"@types/prettier@npm:^2.1.1": version: 2.7.3 resolution: "@types/prettier@npm:2.7.3" checksum: 705384209cea6d1433ff6c187c80dcc0b95d99d5c5ce21a46a9a58060c527973506822e428789d842761e0280d25e3359300f017fbe77b9755bc772ab3dc2f83 @@ -3891,25 +3729,16 @@ __metadata: linkType: hard "@types/prop-types@npm:*": - version: 15.7.11 - resolution: "@types/prop-types@npm:15.7.11" - checksum: 7519ff11d06fbf6b275029fe03fff9ec377b4cb6e864cac34d87d7146c7f5a7560fd164bdc1d2dbe00b60c43713631251af1fd3d34d46c69cd354602bc0c7c54 + version: 15.7.12 + resolution: "@types/prop-types@npm:15.7.12" + checksum: ac16cc3d0a84431ffa5cfdf89579ad1e2269549f32ce0c769321fdd078f84db4fbe1b461ed5a1a496caf09e637c0e367d600c541435716a55b1d9713f5035dfe languageName: node linkType: hard -"@types/qrcode@npm:^1": - version: 1.5.2 - resolution: "@types/qrcode@npm:1.5.2" - dependencies: - "@types/node": "*" - checksum: 2f696916e66002ecf0616451a44308b33948ce68f7ee1eae0ff8a4acc133024a3d9a7314e9dcb6455ab7f7e126963c204a687a665e3688ba39ec4ae80eb30670 - languageName: node - linkType: hard - -"@types/qs@npm:^6.2.31, @types/qs@npm:^6.9.7": - version: 6.9.8 - resolution: "@types/qs@npm:6.9.8" - checksum: c28e07d00d07970e5134c6eed184a0189b8a4649e28fdf36d9117fe671c067a44820890de6bdecef18217647a95e9c6aebdaaae69f5fe4b0bec9345db885f77e +"@types/qs@npm:^6.2.31": + version: 6.9.15 + resolution: "@types/qs@npm:6.9.15" + checksum: 97d8208c2b82013b618e7a9fc14df6bd40a73e1385ac479b6896bafc7949a46201c15f42afd06e86a05e914f146f495f606b6fb65610cc60cf2e0ff743ec38a2 languageName: node linkType: hard @@ -3923,62 +3752,37 @@ __metadata: linkType: hard "@types/react@npm:*, @types/react@npm:^18.0.9": - version: 18.2.58 - resolution: "@types/react@npm:18.2.58" + version: 18.3.3 + resolution: "@types/react@npm:18.3.3" dependencies: "@types/prop-types": "*" - "@types/scheduler": "*" csstype: ^3.0.2 - checksum: 42551e30c8a54161a11b2ecd11406782ddba4472a4471d45034c551295263d56f06234f283526d0c0420352ce9ce9675b2a6c65db7a287d9613643d3ceaaf1f0 - languageName: node - linkType: hard - -"@types/readable-stream@npm:^2.3.13": - version: 2.3.15 - resolution: "@types/readable-stream@npm:2.3.15" - dependencies: - "@types/node": "*" - safe-buffer: ~5.1.1 - checksum: ec36f525cad09b6c65a1dafcb5ad99b9e2ed824ec49b7aa23180ac427e5d35b8a0706193ecd79ab4253a283ad485ba03d5917a98daaaa144f0ea34f4823e9d82 + checksum: c63d6a78163244e2022b01ef79b0baec4fe4da3475dc4a90bb8accefad35ef0c43560fd0312e5974f92a0f1108aa4d669ac72d73d66396aa060ea03b5d2e3873 languageName: node linkType: hard "@types/responselike@npm:^1.0.0": - version: 1.0.1 - resolution: "@types/responselike@npm:1.0.1" + version: 1.0.3 + resolution: "@types/responselike@npm:1.0.3" dependencies: "@types/node": "*" - checksum: ae8c36c9354aaedfa462dab655aa17613529d545a418acc54ba0214145fc1d0454be2ae107031a1b2c24768f19f2af7e4096a85d1e604010becd0bec2355cb0e - languageName: node - linkType: hard - -"@types/scheduler@npm:*": - version: 0.16.8 - resolution: "@types/scheduler@npm:0.16.8" - checksum: 6c091b096daa490093bf30dd7947cd28e5b2cd612ec93448432b33f724b162587fed9309a0acc104d97b69b1d49a0f3fc755a62282054d62975d53d7fd13472d + checksum: 6ac4b35723429b11b117e813c7acc42c3af8b5554caaf1fc750404c1ae59f9b7376bc69b9e9e194a5a97357a597c2228b7173d317320f0360d617b6425212f58 languageName: node linkType: hard "@types/secp256k1@npm:^4.0.1": - version: 4.0.4 - resolution: "@types/secp256k1@npm:4.0.4" + version: 4.0.6 + resolution: "@types/secp256k1@npm:4.0.6" dependencies: "@types/node": "*" - checksum: 6f521a08486a98e71c8529f5c3119f99e610196a47243cc6052c6160b216dff2c85dc50a8f3208ed47028dbb470bbb6fdee47a3fdc064687e46021d5a712767c + checksum: 984494caf49a4ce99fda2b9ea1840eb47af946b8c2737314108949bcc0c06b4880e871296bd49ed6ea4c8423e3a302ad79fec43abfc987330e7eb98f0c4e8ba4 languageName: node linkType: hard "@types/semver@npm:^7.3.12": - version: 7.5.7 - resolution: "@types/semver@npm:7.5.7" - checksum: 5af9b13e3d74d86d4b618f6506ccbded801fb35dbc28608cd5a7bfb8bcac0021dd35ef305a72a0c2a8def0cff60acd706bfee16a9ed1c39a893d2a175e778ea7 - languageName: node - linkType: hard - -"@types/semver@npm:^7.5.0": - version: 7.5.3 - resolution: "@types/semver@npm:7.5.3" - checksum: 349fdd1ab6c213bac5c991bac766bd07b8b12e63762462bb058740dcd2eb09c8193d068bb226f134661275f2022976214c0e727a4e5eb83ec1b131127c980d3e + version: 7.5.8 + resolution: "@types/semver@npm:7.5.8" + checksum: ea6f5276f5b84c55921785a3a27a3cd37afee0111dfe2bcb3e03c31819c197c782598f17f0b150a69d453c9584cd14c4c4d7b9a55d2c5e6cacd4d66fdb3b3663 languageName: node linkType: hard @@ -4045,64 +3849,21 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:latest": - version: 6.8.0 - resolution: "@typescript-eslint/eslint-plugin@npm:6.8.0" - dependencies: - "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.8.0 - "@typescript-eslint/type-utils": 6.8.0 - "@typescript-eslint/utils": 6.8.0 - "@typescript-eslint/visitor-keys": 6.8.0 - debug: ^4.3.4 - graphemer: ^1.4.0 - ignore: ^5.2.4 - natural-compare: ^1.4.0 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependencies: - "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: c36ccf606ebcaff8263c4ffa3b4cda58c6f93474b9eea9906e51be2fef8596977a245cc13770b21c6bfd38ccf45a3cf3613d5f4499429f62ec80afe15ae345bd - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0": - version: 6.21.0 - resolution: "@typescript-eslint/parser@npm:6.21.0" - dependencies: - "@typescript-eslint/scope-manager": 6.21.0 - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/typescript-estree": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - debug: ^4.3.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:latest": - version: 6.8.0 - resolution: "@typescript-eslint/parser@npm:6.8.0" +"@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0": + version: 7.2.0 + resolution: "@typescript-eslint/parser@npm:7.2.0" dependencies: - "@typescript-eslint/scope-manager": 6.8.0 - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/typescript-estree": 6.8.0 - "@typescript-eslint/visitor-keys": 6.8.0 + "@typescript-eslint/scope-manager": 7.2.0 + "@typescript-eslint/types": 7.2.0 + "@typescript-eslint/typescript-estree": 7.2.0 + "@typescript-eslint/visitor-keys": 7.2.0 debug: ^4.3.4 peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10d7a3ae383fee5a5cba9541c72e23d6ab01cca6b414a62b44dacb5ebc15c80b80aa6c105b6469d3795f2f8514ae2499c069cd2d9dcac61f3db9ef6c7a75e080 + checksum: 21deb2e7ad1fc730f637af08f5c549f30ef5b50f424639f57f5bc01274e648db47c696bb994bb24e87424b593d4084e306447c9431a0c0e4807952996db306f4 languageName: node linkType: hard @@ -4116,23 +3877,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/scope-manager@npm:6.21.0" - dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 - checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/scope-manager@npm:6.8.0" +"@typescript-eslint/scope-manager@npm:7.2.0": + version: 7.2.0 + resolution: "@typescript-eslint/scope-manager@npm:7.2.0" dependencies: - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/visitor-keys": 6.8.0 - checksum: b6cf2803531d1c14b56c30fd3cd807b80e17fe48d0da8e5aa9ae50915407ed732c7e2a7ac8030b7cf8ed07b8e481a1138d76bf05b727837a0e016280c2f6873b + "@typescript-eslint/types": 7.2.0 + "@typescript-eslint/visitor-keys": 7.2.0 + checksum: b4ef8e35a56f590fa56cf769e111907828abb4793f482bf57e3fc8c987294ec119acb96359aa4b0150eea7416816e0b2d8635dccd1e4a5c2b02678b0f74def94 languageName: node linkType: hard @@ -4153,23 +3904,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/type-utils@npm:6.8.0" - dependencies: - "@typescript-eslint/typescript-estree": 6.8.0 - "@typescript-eslint/utils": 6.8.0 - debug: ^4.3.4 - ts-api-utils: ^1.0.1 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 9b7d56904dc1a5719ef79eb1b7989d6fad10c71fb07ec3e66cf69b8c8dc5383d644ab122d4701bc4960fb7c99cc08aee4e645db3e4675d488d5779197e15dfda - languageName: node - linkType: hard - "@typescript-eslint/types@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/types@npm:5.62.0" @@ -4177,17 +3911,10 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/types@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/types@npm:6.21.0" - checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/types@npm:6.8.0" - checksum: 1fcd85f6d575116d51c6ee757ed37610ae5e7e4296a29f93c9c6949f6cd16d24550eb7fc5bae7a43119cc08e13836f69a7ae7c54ebba6c95aef96b34d3bfb7f7 +"@typescript-eslint/types@npm:7.2.0": + version: 7.2.0 + resolution: "@typescript-eslint/types@npm:7.2.0" + checksum: 237acd24aa55b762ee98904e4f422ba86579325200dcd058b3cbfe70775926e7f00ee0295788d81eb728f3a6326fe4401c648aee9eb1480d9030a441c17520e8 languageName: node linkType: hard @@ -4209,12 +3936,12 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" +"@typescript-eslint/typescript-estree@npm:7.2.0": + version: 7.2.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.2.0" dependencies: - "@typescript-eslint/types": 6.21.0 - "@typescript-eslint/visitor-keys": 6.21.0 + "@typescript-eslint/types": 7.2.0 + "@typescript-eslint/visitor-keys": 7.2.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 @@ -4224,25 +3951,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/typescript-estree@npm:6.8.0" - dependencies: - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/visitor-keys": 6.8.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependenciesMeta: - typescript: - optional: true - checksum: 388db7f33ef1bc0e7b960c0bce9c744c2e32c66c7ab8dfae73d8533958202ad6f31663b0010f79c45b5ff93159c67f45b00693d73b9da2472b17156dfd26b4a8 + checksum: fe882195cad45bb67e7e127efa9c31977348d0ca923ef26bb9fbd03a2ab64e6772e6e60954ba07a437684fae8e35897d71f0e6a1ef8fbf3f0025cd314960cd9d languageName: node linkType: hard @@ -4264,23 +3973,6 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/utils@npm:6.8.0" - dependencies: - "@eslint-community/eslint-utils": ^4.4.0 - "@types/json-schema": ^7.0.12 - "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.8.0 - "@typescript-eslint/types": 6.8.0 - "@typescript-eslint/typescript-estree": 6.8.0 - semver: ^7.5.4 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: 6d9f90db504502a9aa10e834830c3ffa25483757414670acc6141a3ebef9171a57688a3a179febf35a0e1e0b322f37228d9537bf1b279f1af7fc97888b873bc3 - languageName: node - linkType: hard - "@typescript-eslint/visitor-keys@npm:5.62.0": version: 5.62.0 resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" @@ -4291,23 +3983,13 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" - dependencies: - "@typescript-eslint/types": 6.21.0 - eslint-visitor-keys: ^3.4.1 - checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:6.8.0": - version: 6.8.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.8.0" +"@typescript-eslint/visitor-keys@npm:7.2.0": + version: 7.2.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.2.0" dependencies: - "@typescript-eslint/types": 6.8.0 + "@typescript-eslint/types": 7.2.0 eslint-visitor-keys: ^3.4.1 - checksum: 710d9067b85d7715a400ae625c083c41733abb891d7b35108de083913980f9642e79d27689599fa39915f0fecae16dbfc30367007fccc838ccd917943660de22 + checksum: d9b11b52737450f213cea5c6e07e4672684da48325905c096ee09302b6b261c0bb226e1e350011bdf127c0cbbdd9e6474c905befdfa0a2118fc89ece16770f2b languageName: node linkType: hard @@ -4319,8 +4001,8 @@ __metadata: linkType: hard "@uniswap/sdk-core@npm:^4.0.1, @uniswap/sdk-core@npm:^4.0.7": - version: 4.1.3 - resolution: "@uniswap/sdk-core@npm:4.1.3" + version: 4.2.1 + resolution: "@uniswap/sdk-core@npm:4.2.1" dependencies: "@ethersproject/address": ^5.0.2 big.js: ^5.2.2 @@ -4328,7 +4010,7 @@ __metadata: jsbi: ^3.1.4 tiny-invariant: ^1.1.0 toformat: ^2.0.0 - checksum: 6498ec4a641a5665ca00230b731f8e3020bf104d14508376735956b47f3ba5f8b70e36032514162e3e9c040ec859b13a04e1867a03320c55adf88b76b6fc4f5f + checksum: a72b85e7fafe787a0cb2215cab5f7981fb18c1f63b58a3257accbefe0cc8fd64b7ad99d6ae9d0fc12f4383ac90d3991bae49a6af1fc5c89b72e1a9132af2c8e5 languageName: node linkType: hard @@ -4374,9 +4056,9 @@ __metadata: linkType: hard "@vanilla-extract/private@npm:^1.0.3": - version: 1.0.3 - resolution: "@vanilla-extract/private@npm:1.0.3" - checksum: 866a71ba6804edeb0735684e7723ba78f5cf0bb40d4fb538fe6bf7d73928099e341312337b2a510ac0ce96ff8a4b39eb7f7a5fad0c842532353dd20e7278f29b + version: 1.0.5 + resolution: "@vanilla-extract/private@npm:1.0.5" + checksum: 147acf9b1795f0681372db92e483bc27eeddad050b7d517e9ab87c5e9bcbdce69c0be300c4948f42e3bdeb81b8dd16b8243f3404ce74e6bc9acbb31112429ff4 languageName: node linkType: hard @@ -4739,18 +4421,18 @@ __metadata: linkType: hard "@walletconnect/jsonrpc-http-connection@npm:^1.0.4, @walletconnect/jsonrpc-http-connection@npm:^1.0.7": - version: 1.0.7 - resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.7" + version: 1.0.8 + resolution: "@walletconnect/jsonrpc-http-connection@npm:1.0.8" dependencies: "@walletconnect/jsonrpc-utils": ^1.0.6 "@walletconnect/safe-json": ^1.0.1 cross-fetch: ^3.1.4 - tslib: 1.14.1 - checksum: c4efcd46d4b344727ca6879badca2c2f855499ac76c8dace5d118f4423167adce34e41a99f3dcab0febb945ce51c6ef0ac8556567d5e38d8dad864b131eb5b00 + events: ^3.3.0 + checksum: 2b7c49aca54af2ec37f7bb493062e0bb522ec262889890aa00c133a85dd39beffcfcdb73252600446383a9e6db360cffdc6c50ef7c9b68aae7f5606c8781bdbc languageName: node linkType: hard -"@walletconnect/jsonrpc-provider@npm:1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.6": +"@walletconnect/jsonrpc-provider@npm:1.0.13": version: 1.0.13 resolution: "@walletconnect/jsonrpc-provider@npm:1.0.13" dependencies: @@ -4761,7 +4443,18 @@ __metadata: languageName: node linkType: hard -"@walletconnect/jsonrpc-types@npm:1.0.3, @walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": +"@walletconnect/jsonrpc-provider@npm:^1.0.13, @walletconnect/jsonrpc-provider@npm:^1.0.6": + version: 1.0.14 + resolution: "@walletconnect/jsonrpc-provider@npm:1.0.14" + dependencies: + "@walletconnect/jsonrpc-utils": ^1.0.8 + "@walletconnect/safe-json": ^1.0.2 + events: ^3.3.0 + checksum: db8f931f93285520c51939603108f5cfe2a90a651d12744766d14471db3a488d2964ece5bfedc6cc93832ecd008cd37e7e1b1a950d9ef3385106ee052b936573 + languageName: node + linkType: hard + +"@walletconnect/jsonrpc-types@npm:1.0.3": version: 1.0.3 resolution: "@walletconnect/jsonrpc-types@npm:1.0.3" dependencies: @@ -4771,6 +4464,16 @@ __metadata: languageName: node linkType: hard +"@walletconnect/jsonrpc-types@npm:^1.0.2, @walletconnect/jsonrpc-types@npm:^1.0.3": + version: 1.0.4 + resolution: "@walletconnect/jsonrpc-types@npm:1.0.4" + dependencies: + events: ^3.3.0 + keyvaluestorage-interface: ^1.0.0 + checksum: 99ea5f9f3b0c5892ff874de87dee62cf4fc345124177db1e6e5eaf48b85e2ea3833f0157beca43c51047444938e8eda6362fa8069b33e11d39e1050e7ef6e821 + languageName: node + linkType: hard + "@walletconnect/jsonrpc-utils@npm:1.0.8, @walletconnect/jsonrpc-utils@npm:^1.0.4, @walletconnect/jsonrpc-utils@npm:^1.0.6, @walletconnect/jsonrpc-utils@npm:^1.0.7, @walletconnect/jsonrpc-utils@npm:^1.0.8": version: 1.0.8 resolution: "@walletconnect/jsonrpc-utils@npm:1.0.8" @@ -4881,12 +4584,12 @@ __metadata: linkType: hard "@walletconnect/logger@npm:^2.0.1": - version: 2.0.1 - resolution: "@walletconnect/logger@npm:2.0.1" + version: 2.1.2 + resolution: "@walletconnect/logger@npm:2.1.2" dependencies: + "@walletconnect/safe-json": ^1.0.2 pino: 7.11.0 - tslib: 1.14.1 - checksum: b686679d176d5d22a3441d93e71be2652e6c447682a6d6f014baf7c2d9dcd23b93e2f434d4410e33cc532d068333f6b3c1d899aeb0d6f60cc296ed17f57b0c2c + checksum: a2bb88b76d95ec5a95279dcc919f1d044d17be8fdda98a01665a607561b445bb56f2245a280933fb19aa7d41d41b688d0ffdb434ac56c46163ad2eb5338f389a languageName: node linkType: hard @@ -4934,12 +4637,11 @@ __metadata: linkType: hard "@walletconnect/relay-api@npm:^1.0.9": - version: 1.0.9 - resolution: "@walletconnect/relay-api@npm:1.0.9" + version: 1.0.10 + resolution: "@walletconnect/relay-api@npm:1.0.10" dependencies: "@walletconnect/jsonrpc-types": ^1.0.2 - tslib: 1.14.1 - checksum: 5870579b6552f1ce7351878f1acb8386b0c11288c64d39133c7cee5040feeb7ccf9114228d97a59749d60366ad107b097d656407d534567c24f5d3878ea6e246 + checksum: a332cbfdf0d3bad7046b0559653a5121a4b5a540f029cc01eeb8ef466681b10626a5a24d55668405e7c635535f35b8038d4aa5a2f0d16c8b512c41fecff2448c languageName: node linkType: hard @@ -5157,7 +4859,7 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:1, abbrev@npm:^1.0.0": +"abbrev@npm:1": version: 1.1.1 resolution: "abbrev@npm:1.1.1" checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 @@ -5171,6 +4873,13 @@ __metadata: languageName: node linkType: hard +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 + languageName: node + linkType: hard + "abitype@npm:0.8.7": version: 0.8.7 resolution: "abitype@npm:0.8.7" @@ -5218,13 +4927,13 @@ __metadata: linkType: hard "acorn-walk@npm:^8.1.1": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + version: 8.3.2 + resolution: "acorn-walk@npm:8.3.2" + checksum: 3626b9d26a37b1b427796feaa5261faf712307a8920392c8dce9a5739fb31077667f4ad2ec71c7ac6aaf9f61f04a9d3d67ff56f459587206fc04aa31c27ef392 languageName: node linkType: hard -"acorn@npm:^8.11.3, acorn@npm:^8.6.0": +"acorn@npm:^8.11.3, acorn@npm:^8.4.1, acorn@npm:^8.6.0, acorn@npm:^8.9.0": version: 8.11.3 resolution: "acorn@npm:8.11.3" bin: @@ -5233,15 +4942,6 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.4.1, acorn@npm:^8.9.0": - version: 8.10.0 - resolution: "acorn@npm:8.10.0" - bin: - acorn: bin/acorn - checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d - languageName: node - linkType: hard - "adm-zip@npm:^0.4.16": version: 0.4.16 resolution: "adm-zip@npm:0.4.16" @@ -5270,7 +4970,7 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:6, agent-base@npm:^6.0.2": +"agent-base@npm:6": version: 6.0.2 resolution: "agent-base@npm:6.0.2" dependencies: @@ -5279,12 +4979,12 @@ __metadata: languageName: node linkType: hard -"agentkeepalive@npm:^4.2.1": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": + version: 7.1.1 + resolution: "agent-base@npm:7.1.1" dependencies: - humanize-ms: ^1.2.1 - checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 + debug: ^4.3.4 + checksum: 51c158769c5c051482f9ca2e6e1ec085ac72b5a418a9b31b4e82fe6c0a6699adb94c1c42d246699a587b3335215037091c79e0de512c516f73b6ea844202f037 languageName: node linkType: hard @@ -5323,14 +5023,14 @@ __metadata: linkType: hard "ajv@npm:^8.0.1": - version: 8.12.0 - resolution: "ajv@npm:8.12.0" + version: 8.14.0 + resolution: "ajv@npm:8.14.0" dependencies: - fast-deep-equal: ^3.1.1 + fast-deep-equal: ^3.1.3 json-schema-traverse: ^1.0.0 require-from-string: ^2.0.2 - uri-js: ^4.2.2 - checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + uri-js: ^4.4.1 + checksum: 83a933ee20ca25026236cd44634ab8b88d386be26f666e4bc8e34085bbe6775bdb52cb8e25afdaca20d90cb59828a4a168993e21dd2adad3612308f568b2320e languageName: node linkType: hard @@ -5526,16 +5226,6 @@ __metadata: languageName: node linkType: hard -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - "arg@npm:4.1.0": version: 4.1.0 resolution: "arg@npm:4.1.0" @@ -5606,16 +5296,17 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7": - version: 3.1.7 - resolution: "array-includes@npm:3.1.7" +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7, array-includes@npm:^3.1.8": + version: 3.1.8 + resolution: "array-includes@npm:3.1.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.4 is-string: ^1.0.7 - checksum: 06f9e4598fac12a919f7c59a3f04f010ea07f0b7f0585465ed12ef528a60e45f374e79d1bddbb34cdd4338357d00023ddbd0ac18b0be36964f5e726e8965d7fc + checksum: eb39ba5530f64e4d8acab39297c11c1c5be2a4ea188ab2b34aba5fb7224d918f77717a9d57a3e2900caaa8440e59431bdaf5c974d5212ef65d97f132e38e2d91 languageName: node linkType: hard @@ -5633,29 +5324,31 @@ __metadata: languageName: node linkType: hard -"array.prototype.filter@npm:^1.0.3": - version: 1.0.3 - resolution: "array.prototype.filter@npm:1.0.3" +"array.prototype.findlast@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlast@npm:1.2.5" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-array-method-boxes-properly: ^1.0.0 - is-string: ^1.0.7 - checksum: 5443cde6ad64596649e5751252b1b2f5242b41052980c2fb2506ba485e3ffd7607e8f6f2f1aefa0cb1cfb9b8623b2b2be103579cb367a161a3426400619b6e73 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + es-shim-unscopables: ^1.0.2 + checksum: 83ce4ad95bae07f136d316f5a7c3a5b911ac3296c3476abe60225bc4a17938bf37541972fcc37dd5adbc99cbb9c928c70bbbfc1c1ce549d41a415144030bb446 languageName: node linkType: hard "array.prototype.findlastindex@npm:^1.2.3": - version: 1.2.4 - resolution: "array.prototype.findlastindex@npm:1.2.4" + version: 1.2.5 + resolution: "array.prototype.findlastindex@npm:1.2.5" dependencies: - call-bind: ^1.0.5 + call-bind: ^1.0.7 define-properties: ^1.2.1 - es-abstract: ^1.22.3 + es-abstract: ^1.23.2 es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 es-shim-unscopables: ^1.0.2 - checksum: cc8dce27a06dddf6d9c40a15d4c573f96ac5ca3583f89f8d8cd7d7ffdb96a71d819890a5bdb211f221bda8fafa0d97d1d8cbb5460a5cbec1fff57ae80b8abc31 + checksum: 2c81cff2a75deb95bf1ed89b6f5f2bfbfb882211e3b7cc59c3d6b87df774cd9d6b36949a8ae39ac476e092c1d4a4905f5ee11a86a456abb10f35f8211ae4e710 languageName: node linkType: hard @@ -5671,7 +5364,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": +"array.prototype.flatmap@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flatmap@npm:1.3.2" dependencies: @@ -5683,7 +5376,19 @@ __metadata: languageName: node linkType: hard -"array.prototype.tosorted@npm:^1.1.1": +"array.prototype.toreversed@npm:^1.1.2": + version: 1.1.2 + resolution: "array.prototype.toreversed@npm:1.1.2" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + es-shim-unscopables: ^1.0.0 + checksum: 58598193426282155297bedf950dc8d464624a0d81659822fb73124286688644cb7e0e4927a07f3ab2daaeb6617b647736cc3a5e6ca7ade5bb8e573b284e6240 + languageName: node + linkType: hard + +"array.prototype.tosorted@npm:^1.1.3": version: 1.1.3 resolution: "array.prototype.tosorted@npm:1.1.3" dependencies: @@ -5839,9 +5544,9 @@ __metadata: linkType: hard "async@npm:^3.2.3": - version: 3.2.4 - resolution: "async@npm:3.2.4" - checksum: 43d07459a4e1d09b84a20772414aa684ff4de085cbcaec6eea3c7a8f8150e8c62aa6cd4e699fe8ee93c3a5b324e777d34642531875a0817a35697522c1b02e89 + version: 3.2.5 + resolution: "async@npm:3.2.5" + checksum: 5ec77f1312301dee02d62140a6b1f7ee0edd2a0f983b6fd2b0849b969f245225b990b47b8243e7b9ad16451a53e7f68e753700385b706198ced888beedba3af4 languageName: node linkType: hard @@ -5852,15 +5557,6 @@ __metadata: languageName: node linkType: hard -"asynciterator.prototype@npm:^1.0.0": - version: 1.0.0 - resolution: "asynciterator.prototype@npm:1.0.0" - dependencies: - has-symbols: ^1.0.3 - checksum: e8ebfd9493ac651cf9b4165e9d64030b3da1d17181bb1963627b59e240cdaf021d9b59d44b827dc1dde4e22387ec04c2d0f8720cf58a1c282e34e40cc12721b3 - languageName: node - linkType: hard - "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -5883,11 +5579,11 @@ __metadata: linkType: hard "autoprefixer@npm:^10.4.12": - version: 10.4.17 - resolution: "autoprefixer@npm:10.4.17" + version: 10.4.19 + resolution: "autoprefixer@npm:10.4.19" dependencies: - browserslist: ^4.22.2 - caniuse-lite: ^1.0.30001578 + browserslist: ^4.23.0 + caniuse-lite: ^1.0.30001599 fraction.js: ^4.3.7 normalize-range: ^0.1.2 picocolors: ^1.0.0 @@ -5896,11 +5592,11 @@ __metadata: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 1b4cf4097507f9dc48cef3194f18a05901311c881380cc634b308fce54a6554cf2dcd20aec8384b44e994d4665ab12c63dc89492523f8d74ff5d4d5eb1469f8c + checksum: 3a4bc5bace05e057396dca2b306503efc175e90e8f2abf5472d3130b72da1d54d97c0ee05df21bf04fe66a7df93fd8c8ec0f1aca72a165f4701a02531abcbf11 languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.6, available-typed-arrays@npm:^1.0.7": +"available-typed-arrays@npm:^1.0.7": version: 1.0.7 resolution: "available-typed-arrays@npm:1.0.7" dependencies: @@ -5917,9 +5613,9 @@ __metadata: linkType: hard "aws4@npm:^1.8.0": - version: 1.12.0 - resolution: "aws4@npm:1.12.0" - checksum: 68f79708ac7c335992730bf638286a3ee0a645cf12575d557860100767c500c08b30e24726b9f03265d74116417f628af78509e1333575e9f8d52a80edfe8cbc + version: 1.13.0 + resolution: "aws4@npm:1.13.0" + checksum: 71594a17a5f7b1a9151ef515500c18f1029caa51e2cb65c1b5b324d9bd8dac89896a9e296825d4e6befdcd612d7fc3b0d8042c667555a56df3ee1ab15d4d9b35 languageName: node linkType: hard @@ -5940,13 +5636,13 @@ __metadata: linkType: hard "axios@npm:^1.4.0, axios@npm:^1.5.1": - version: 1.5.1 - resolution: "axios@npm:1.5.1" + version: 1.7.2 + resolution: "axios@npm:1.7.2" dependencies: - follow-redirects: ^1.15.0 + follow-redirects: ^1.15.6 form-data: ^4.0.0 proxy-from-env: ^1.1.0 - checksum: 4444f06601f4ede154183767863d2b8e472b4a6bfc5253597ed6d21899887e1fd0ee2b3de792ac4f8459fe2e359d2aa07c216e45fd8b9e4e0688a6ebf48a5a8d + checksum: e457e2b0ab748504621f6fa6609074ac08c824bf0881592209dfa15098ece7e88495300e02cd22ba50b3468fd712fe687e629dcb03d6a3f6a51989727405aedf languageName: node linkType: hard @@ -6081,13 +5777,6 @@ __metadata: languageName: node linkType: hard -"bigint-crypto-utils@npm:^3.2.2": - version: 3.3.0 - resolution: "bigint-crypto-utils@npm:3.3.0" - checksum: 9598ce57b23f776c8936d44114c9f051e62b5fa654915b664784cbcbacc5aa0485f4479571c51ff58008abb1210c0d6a234853742f07cf84bda890f2a1e01000 - languageName: node - linkType: hard - "bin-build@npm:^3.0.0": version: 3.0.0 resolution: "bin-build@npm:3.0.0" @@ -6102,9 +5791,9 @@ __metadata: linkType: hard "binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 languageName: node linkType: hard @@ -6164,9 +5853,9 @@ __metadata: linkType: hard "blo@npm:^1.0.1": - version: 1.1.1 - resolution: "blo@npm:1.1.1" - checksum: 896183e4ff43e8ebfc89153f6772e510d8f4566ef25e6bebb7e31531e1059c0517bc23d2d605758c9e5ea0c62c21203172575625a53748d013ed78ace08f30f4 + version: 1.2.0 + resolution: "blo@npm:1.2.0" + checksum: be7dc5f3047d538c0038b469c309440e5b7de872ee811cc7ca97005b6b534a01dbf461150145f2f09524aeda6923197ea31290fbe9865cb8cb32152b3caf3dc7 languageName: node linkType: hard @@ -6235,12 +5924,12 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" +"braces@npm:^3.0.2, braces@npm:^3.0.3, braces@npm:~3.0.2": + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + fill-range: ^7.1.1 + checksum: b95aa0b3bd909f6cd1720ffcf031aeaf46154dd88b4da01f9a1d3f7ea866a79eba76a6d01cbc3c422b2ee5cdc39a4f02491058d5df0d7bf6e6a162a832df1f69 languageName: node linkType: hard @@ -6279,7 +5968,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.22.2": +"browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": version: 4.23.0 resolution: "browserslist@npm:4.23.0" dependencies: @@ -6293,6 +5982,15 @@ __metadata: languageName: node linkType: hard +"bs-logger@npm:0.x": + version: 0.2.6 + resolution: "bs-logger@npm:0.2.6" + dependencies: + fast-json-stable-stringify: 2.x + checksum: d34bdaf68c64bd099ab97c3ea608c9ae7d3f5faa1178b3f3f345acd94e852e608b2d4f9103fb2e503f5e69780e98293df41691b84be909b41cf5045374d54606 + languageName: node + linkType: hard + "bs58@npm:^4.0.0": version: 4.0.1 resolution: "bs58@npm:4.0.1" @@ -6417,33 +6115,23 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^17.0.0": - version: 17.1.4 - resolution: "cacache@npm:17.1.4" +"cacache@npm:^18.0.0": + version: 18.0.3 + resolution: "cacache@npm:18.0.3" dependencies: "@npmcli/fs": ^3.1.0 fs-minipass: ^3.0.0 glob: ^10.2.2 - lru-cache: ^7.7.1 + lru-cache: ^10.0.1 minipass: ^7.0.3 - minipass-collect: ^1.0.2 + minipass-collect: ^2.0.1 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 p-map: ^4.0.0 ssri: ^10.0.0 tar: ^6.1.11 unique-filename: ^3.0.0 - checksum: b7751df756656954a51201335addced8f63fc53266fa56392c9f5ae83c8d27debffb4458ac2d168a744a4517ec3f2163af05c20097f93d17bdc2dc8a385e14a6 - languageName: node - linkType: hard - -"call-bind@npm:^1.0.0": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" - dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + checksum: b717fd9b36e9c3279bfde4545c3a8f6d5a539b084ee26a9504d48f83694beb724057d26e090b97540f9cc62bea18b9f6cf671c50e18fb7dac60eda9db691714f languageName: node linkType: hard @@ -6488,10 +6176,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001578, caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001587": - version: 1.0.30001589 - resolution: "caniuse-lite@npm:1.0.30001589" - checksum: 7a6e6c4fb14c2bd0103a8f744bdd8701c1a5f19162f4a7600b89e25bc86d689f82204dc135f3a1dcd1a53050caa04fd0bb39b7df88698a6b90f189ec48900689 +"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001587, caniuse-lite@npm:^1.0.30001599": + version: 1.0.30001624 + resolution: "caniuse-lite@npm:1.0.30001624" + checksum: 0b9d0c17e28c0c14c0a845fd595ab25e2c79a69f9d85b56c9459ec712ba3a912b71d2ad2e6eb2763ed1574ec80a1c2a37a3cd404dc6b6989b03658c825abeed0 languageName: node linkType: hard @@ -6535,6 +6223,15 @@ __metadata: languageName: node linkType: hard +"cbor@npm:^9.0.0": + version: 9.0.2 + resolution: "cbor@npm:9.0.2" + dependencies: + nofilter: ^3.1.0 + checksum: 925edae7bf964be5a26dba1b7ba6311ac12b6a66234dc958958997a0576cdc740632dc19852a5b84d8a75101936bea1fe122dc22539d6e11f4539c731853ba2e + languageName: node + linkType: hard + "cborg@npm:^1.5.4, cborg@npm:^1.6.0": version: 1.10.2 resolution: "cborg@npm:1.10.2" @@ -6545,19 +6242,19 @@ __metadata: linkType: hard "chai-as-promised@npm:^7.1.1": - version: 7.1.1 - resolution: "chai-as-promised@npm:7.1.1" + version: 7.1.2 + resolution: "chai-as-promised@npm:7.1.2" dependencies: check-error: ^1.0.2 peerDependencies: - chai: ">= 2.1.2 < 5" - checksum: 7262868a5b51a12af4e432838ddf97a893109266a505808e1868ba63a12de7ee1166e9d43b5c501a190c377c1b11ecb9ff8e093c89f097ad96c397e8ec0f8d6a + chai: ">= 2.1.2 < 6" + checksum: 671ee980054eb23a523875c1d22929a2ac05d89b5428e1fd12800f54fc69baf41014667b87e2368e2355ee2a3140d3e3d7d5a1f8638b07cfefd7fe38a149e3f6 languageName: node linkType: hard -"chai@npm:^4.3.4, chai@npm:^4.3.6": - version: 4.3.10 - resolution: "chai@npm:4.3.10" +"chai@npm:^4.3.4": + version: 4.4.1 + resolution: "chai@npm:4.4.1" dependencies: assertion-error: ^1.1.0 check-error: ^1.0.3 @@ -6566,7 +6263,7 @@ __metadata: loupe: ^2.3.6 pathval: ^1.1.1 type-detect: ^4.0.8 - checksum: 536668c60a0d985a0fbd94418028e388d243a925d7c5e858c7443e334753511614a3b6a124bac9ca077dfc4c37acc367d62f8c294960f440749536dc181dfc6d + checksum: 9ab84f36eb8e0b280c56c6c21ca4da5933132cd8a0c89c384f1497f77953640db0bc151edd47f81748240a9fab57b78f7d925edfeedc8e8fc98016d71f40c36e languageName: node linkType: hard @@ -6650,7 +6347,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.3, chokidar@npm:^3.4.0, chokidar@npm:^3.5.2": +"chokidar@npm:3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" dependencies: @@ -6669,7 +6366,7 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.5.3": +"chokidar@npm:^3.4.0, chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -6726,7 +6423,7 @@ __metadata: languageName: node linkType: hard -"citty@npm:^0.1.5": +"citty@npm:^0.1.5, citty@npm:^0.1.6": version: 0.1.6 resolution: "citty@npm:0.1.6" dependencies: @@ -6736,9 +6433,9 @@ __metadata: linkType: hard "cjs-module-lexer@npm:^1.0.0": - version: 1.2.3 - resolution: "cjs-module-lexer@npm:1.2.3" - checksum: 5ea3cb867a9bb609b6d476cd86590d105f3cfd6514db38ff71f63992ab40939c2feb68967faa15a6d2b1f90daa6416b79ea2de486e9e2485a6f8b66a21b4fb0a + version: 1.3.1 + resolution: "cjs-module-lexer@npm:1.3.1" + checksum: 75f20ac264a397ea5c63f9c2343a51ab878043666468f275e94862f7180ec1d764a400ec0c09085dcf0db3193c74a8b571519abd2bf4be0d2be510d1377c8d4b languageName: node linkType: hard @@ -6793,9 +6490,9 @@ __metadata: linkType: hard "cli-spinners@npm:^2.2.0": - version: 2.9.1 - resolution: "cli-spinners@npm:2.9.1" - checksum: 1780618be58309c469205bc315db697934bac68bce78cd5dfd46248e507a533172d623c7348ecfd904734f597ce0a4e5538684843d2cfb7af485d4466699940c + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 1bd588289b28432e4676cb5d40505cfe3e53f2e4e10fbe05c8a710a154d6fe0ce7836844b00d6858f740f2ffe67cdc36e0fce9c7b6a8430e80e6388d5aa4956c languageName: node linkType: hard @@ -6895,13 +6592,6 @@ __metadata: languageName: node linkType: hard -"cluster-key-slot@npm:^1.1.0": - version: 1.1.2 - resolution: "cluster-key-slot@npm:1.1.2" - checksum: be0ad2d262502adc998597e83f9ded1b80f827f0452127c5a37b22dfca36bab8edf393f7b25bb626006fb9fb2436106939ede6d2d6ecf4229b96a47f27edd681 - languageName: node - linkType: hard - "co@npm:^4.6.0": version: 4.6.0 resolution: "co@npm:4.6.0" @@ -6955,7 +6645,7 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.2, color-support@npm:^1.1.3": +"color-support@npm:^1.1.2": version: 1.1.3 resolution: "color-support@npm:1.1.3" bin: @@ -7072,6 +6762,13 @@ __metadata: languageName: node linkType: hard +"confbox@npm:^0.1.7": + version: 0.1.7 + resolution: "confbox@npm:0.1.7" + checksum: bde836c26f5154a348b0c0a757f8a0138929e5737e0553be3c4f07a056abca618b861aa63ac3b22d344789b56be99a1382928933e08cd500df00213bf4d8fb43 + languageName: node + linkType: hard + "config-chain@npm:^1.1.11": version: 1.1.13 resolution: "config-chain@npm:1.1.13" @@ -7127,9 +6824,9 @@ __metadata: linkType: hard "cookie-es@npm:^1.0.0": - version: 1.0.0 - resolution: "cookie-es@npm:1.0.0" - checksum: e8721cf4d38f3e44049c9118874b323f4f674b1c5cef84a2b888f5bf86ad720ad17b51b43150cad7535a375c24e2921da603801ad28aa6125c3d36c031b41468 + version: 1.1.0 + resolution: "cookie-es@npm:1.1.0" + checksum: 953ee436e9daeb8f93e36f726e4ad15fd20fa8181c4085198db9e617a5dbd200326376d84c2dac7364c4395bcfb2b314017822bfba3fef44d24258b0ac90e639 languageName: node linkType: hard @@ -7267,10 +6964,15 @@ __metadata: languageName: node linkType: hard -"crossws@npm:^0.1.0": - version: 0.1.1 - resolution: "crossws@npm:0.1.1" - checksum: 4cd8eadb497d852998b770d54a10779ba9e0c38c823d141c35040c7a7afc7a6fcd274ce82a8614e992e3f71cb5e41c71a01ee0923ab6e1bec215842404555d7d +"crossws@npm:^0.2.0, crossws@npm:^0.2.2": + version: 0.2.4 + resolution: "crossws@npm:0.2.4" + peerDependencies: + uWebSockets.js: "*" + peerDependenciesMeta: + uWebSockets.js: + optional: true + checksum: dcaf730a3af32cf081ab49fdb9c31192a738d7e0585585975e581e71a3d7d14df8d3b42ba183e13e34a1fc26645f695362abf30c40369d12652bcee372a484c3 languageName: node linkType: hard @@ -7349,6 +7051,39 @@ __metadata: languageName: node linkType: hard +"data-view-buffer@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-buffer@npm:1.0.1" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: ce24348f3c6231223b216da92e7e6a57a12b4af81a23f27eff8feabdf06acfb16c00639c8b705ca4d167f761cfc756e27e5f065d0a1f840c10b907fdaf8b988c + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-length@npm:1.0.1" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: dbb3200edcb7c1ef0d68979834f81d64fd8cab2f7691b3a4c6b97e67f22182f3ec2c8602efd7b76997b55af6ff8bce485829c1feda4fa2165a6b71fb7baa4269 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "data-view-byte-offset@npm:1.0.0" + dependencies: + call-bind: ^1.0.6 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: 7f0bf8720b7414ca719eedf1846aeec392f2054d7af707c5dc9a753cc77eb8625f067fa901e0b5127e831f9da9056138d894b9c2be79c27a21f6db5824f009c2 + languageName: node + linkType: hard + "death@npm:^1.1.0": version: 1.1.0 resolution: "death@npm:1.1.0" @@ -7356,7 +7091,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -7487,14 +7222,14 @@ __metadata: linkType: hard "dedent@npm:^1.0.0": - version: 1.5.1 - resolution: "dedent@npm:1.5.1" + version: 1.5.3 + resolution: "dedent@npm:1.5.3" peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: babel-plugin-macros: optional: true - checksum: c3c300a14edf1bdf5a873f9e4b22e839d62490bc5c8d6169c1f15858a1a76733d06a9a56930e963d677a2ceeca4b6b0894cc5ea2f501aa382ca5b92af3413c2a + checksum: 045b595557b2a8ea2eb9b0b4623d764e9a87326486fe2b61191b4342ed93dc01245644d8a09f3108a50c0ee7965f1eedd92e4a3a503ed89ea8e810566ea27f9a languageName: node linkType: hard @@ -7544,7 +7279,7 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.2, define-data-property@npm:^1.1.4": +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": version: 1.1.4 resolution: "define-data-property@npm:1.1.4" dependencies: @@ -7555,7 +7290,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": +"define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -7594,13 +7329,6 @@ __metadata: languageName: node linkType: hard -"denque@npm:^2.1.0": - version: 2.1.0 - resolution: "denque@npm:2.1.0" - checksum: 1d4ae1d05e59ac3a3481e7b478293f4b4c813819342273f3d5b826c7ffa9753c520919ba264f377e09108d24ec6cf0ec0ac729a5686cbb8f32d797126c5dae74 - languageName: node - linkType: hard - "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -7622,7 +7350,7 @@ __metadata: languageName: node linkType: hard -"destr@npm:^2.0.1, destr@npm:^2.0.2": +"destr@npm:^2.0.3": version: 2.0.3 resolution: "destr@npm:2.0.3" checksum: 4521b145ba6118919a561f7d979d623793695a516d1b9df704de81932601bf9cf21c47278e1cb93a309c88a14f4fd1f18680bb49ebef8b2546cc7f415e7ae48e @@ -7646,9 +7374,9 @@ __metadata: linkType: hard "detect-libc@npm:^2.0.0": - version: 2.0.2 - resolution: "detect-libc@npm:2.0.2" - checksum: 2b2cd3649b83d576f4be7cc37eb3b1815c79969c8b1a03a40a4d55d83bc74d010753485753448eacb98784abf22f7dbd3911fd3b60e29fda28fed2d1a997944d + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 2ba6a939ae55f189aea996ac67afceb650413c7a34726ee92c40fb0deb2400d57ef94631a8a3f052055eea7efb0f99a9b5e6ce923415daa3e68221f963cfc27d languageName: node linkType: hard @@ -7787,13 +7515,6 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:^16.0.3": - version: 16.3.1 - resolution: "dotenv@npm:16.3.1" - checksum: 15d75e7279018f4bafd0ee9706593dd14455ddb71b3bcba9c52574460b7ccaf67d5cf8b2c08a5af1a9da6db36c956a04a1192b101ee102a3e0cf8817bbcf3dfd - languageName: node - linkType: hard - "download@npm:^6.2.2": version: 6.2.5 resolution: "download@npm:6.2.5" @@ -7821,14 +7542,14 @@ __metadata: linkType: hard "duplexify@npm:^4.1.2": - version: 4.1.2 - resolution: "duplexify@npm:4.1.2" + version: 4.1.3 + resolution: "duplexify@npm:4.1.3" dependencies: end-of-stream: ^1.4.1 inherits: ^2.0.3 readable-stream: ^3.1.1 - stream-shift: ^1.0.0 - checksum: 964376c61c0e92f6ed0694b3ba97c84f199413dc40ab8dfdaef80b7a7f4982fcabf796214e28ed614a5bc1ec45488a29b81e7d46fa3f5ddf65bcb118c20145ad + stream-shift: ^1.0.2 + checksum: 9636a027345de3dd3c801594d01a7c73d9ce260019538beb1ee650bba7544e72f40a4d4902b52e1ab283dc32a06f210d42748773af02ff15e3064a9659deab7f languageName: node linkType: hard @@ -7876,13 +7597,13 @@ __metadata: linkType: hard "ejs@npm:^3.1.8": - version: 3.1.9 - resolution: "ejs@npm:3.1.9" + version: 3.1.10 + resolution: "ejs@npm:3.1.10" dependencies: jake: ^10.8.5 bin: ejs: bin/cli.js - checksum: af6f10eb815885ff8a8cfacc42c6b6cf87daf97a4884f87a30e0c3271fedd85d76a3a297d9c33a70e735b97ee632887f85e32854b9cdd3a2d97edf931519a35f + checksum: ce90637e9c7538663ae023b8a7a380b2ef7cc4096de70be85abf5a3b9641912dde65353211d05e24d56b1f242d71185c6d00e02cb8860701d571786d92c71f05 languageName: node linkType: hard @@ -7896,13 +7617,13 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.668": - version: 1.4.681 - resolution: "electron-to-chromium@npm:1.4.681" - checksum: 57697690c4dbb0290fd6b89dcd227ee6c3e8b40be0efc73cbc586b64029cf044125b5feab5e171dd45a8889013faba6bd7bb762312cc8614c9c49e1513edb52d + version: 1.4.783 + resolution: "electron-to-chromium@npm:1.4.783" + checksum: 49dfd8614c8e28076ca82e241a4a246685440dacde5e2cdb85d57a0d5bcc1cbd5de3201b3158b94ad5f1016e91ab9bb0d4da8cfe46d2897400fb62e6a5be198e languageName: node linkType: hard -"elliptic@npm:6.5.4, elliptic@npm:^6.5.2, elliptic@npm:^6.5.4": +"elliptic@npm:6.5.4": version: 6.5.4 resolution: "elliptic@npm:6.5.4" dependencies: @@ -7917,6 +7638,21 @@ __metadata: languageName: node linkType: hard +"elliptic@npm:^6.5.2, elliptic@npm:^6.5.4": + version: 6.5.5 + resolution: "elliptic@npm:6.5.5" + 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 + checksum: ec9105e4469eb3b32b0ee2579756c888ddf3f99d259aa0d65fccb906ee877768aaf8880caae73e3e669c9a4adeb3eb1945703aa974ec5000d2d33a239f4567eb + languageName: node + linkType: hard + "emittery@npm:^0.13.1": version: 0.13.1 resolution: "emittery@npm:0.13.1" @@ -7938,7 +7674,7 @@ __metadata: languageName: node linkType: hard -"encode-utf8@npm:^1.0.2, encode-utf8@npm:^1.0.3": +"encode-utf8@npm:^1.0.3": version: 1.0.3 resolution: "encode-utf8@npm:1.0.3" checksum: 550224bf2a104b1d355458c8a82e9b4ea07f9fc78387bc3a49c151b940ad26473de8dc9e121eefc4e84561cb0b46de1e4cd2bc766f72ee145e9ea9541482817f @@ -7973,12 +7709,12 @@ __metadata: linkType: hard "enhanced-resolve@npm:^5.12.0": - version: 5.15.0 - resolution: "enhanced-resolve@npm:5.15.0" + version: 5.16.1 + resolution: "enhanced-resolve@npm:5.16.1" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: fbd8cdc9263be71cc737aa8a7d6c57b43d6aa38f6cc75dde6fcd3598a130cc465f979d2f4d01bb3bf475acb43817749c79f8eef9be048683602ca91ab52e4f11 + checksum: 6e4c166fef72ef231455f9119686d93ecccb11874f8256d73a42de5b293cb2536050849382468864b25973514ca4fa4cb13c37be2ff857a211e2aca3ff05bb6c languageName: node linkType: hard @@ -7991,7 +7727,7 @@ __metadata: languageName: node linkType: hard -"enquirer@npm:^2.3.0, enquirer@npm:^2.3.6": +"enquirer@npm:^2.3.0": version: 2.4.1 resolution: "enquirer@npm:2.4.1" dependencies: @@ -8008,15 +7744,6 @@ __metadata: languageName: node linkType: hard -"envfile@npm:^6.18.0": - version: 6.18.0 - resolution: "envfile@npm:6.18.0" - bin: - envfile: bin.cjs - checksum: 3a3762994d7b84ccf0293c1269cdfa5ea8971bdbbf7e3571fb686a6415eee2029e43d3faf36ed4222a83eaaf38fbc4fa37b3f50b77ea417ca35561e0e54059c1 - languageName: node - linkType: hard - "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -8040,17 +7767,21 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.22.4": - version: 1.22.4 - resolution: "es-abstract@npm:1.22.4" +"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3": + version: 1.23.3 + resolution: "es-abstract@npm:1.23.3" dependencies: array-buffer-byte-length: ^1.0.1 arraybuffer.prototype.slice: ^1.0.3 - available-typed-arrays: ^1.0.6 + available-typed-arrays: ^1.0.7 call-bind: ^1.0.7 + data-view-buffer: ^1.0.1 + data-view-byte-length: ^1.0.1 + data-view-byte-offset: ^1.0.0 es-define-property: ^1.0.0 es-errors: ^1.3.0 - es-set-tostringtag: ^2.0.2 + es-object-atoms: ^1.0.0 + es-set-tostringtag: ^2.0.3 es-to-primitive: ^1.2.1 function.prototype.name: ^1.1.6 get-intrinsic: ^1.2.4 @@ -8058,15 +7789,16 @@ __metadata: globalthis: ^1.0.3 gopd: ^1.0.1 has-property-descriptors: ^1.0.2 - has-proto: ^1.0.1 + has-proto: ^1.0.3 has-symbols: ^1.0.3 - hasown: ^2.0.1 + hasown: ^2.0.2 internal-slot: ^1.0.7 is-array-buffer: ^3.0.4 is-callable: ^1.2.7 - is-negative-zero: ^2.0.2 + is-data-view: ^1.0.1 + is-negative-zero: ^2.0.3 is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 + is-shared-array-buffer: ^1.0.3 is-string: ^1.0.7 is-typed-array: ^1.1.13 is-weakref: ^1.0.2 @@ -8074,25 +7806,18 @@ __metadata: object-keys: ^1.1.1 object.assign: ^4.1.5 regexp.prototype.flags: ^1.5.2 - safe-array-concat: ^1.1.0 + safe-array-concat: ^1.1.2 safe-regex-test: ^1.0.3 - string.prototype.trim: ^1.2.8 - string.prototype.trimend: ^1.0.7 - string.prototype.trimstart: ^1.0.7 - typed-array-buffer: ^1.0.1 - typed-array-byte-length: ^1.0.0 - typed-array-byte-offset: ^1.0.0 - typed-array-length: ^1.0.4 + string.prototype.trim: ^1.2.9 + string.prototype.trimend: ^1.0.8 + string.prototype.trimstart: ^1.0.8 + typed-array-buffer: ^1.0.2 + typed-array-byte-length: ^1.0.1 + typed-array-byte-offset: ^1.0.2 + typed-array-length: ^1.0.6 unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.14 - checksum: c254102395bd59315b713d72a1ce07980c0f71c9edcac6b036868740789ab5344020e940d6321fc1b31aecf6b27941fdd9655b602696e08f170986dd4d75ddc6 - languageName: node - linkType: hard - -"es-array-method-boxes-properly@npm:^1.0.0": - version: 1.0.0 - resolution: "es-array-method-boxes-properly@npm:1.0.0" - checksum: 2537fcd1cecf187083890bc6f5236d3a26bf39237433587e5bf63392e88faae929dbba78ff0120681a3f6f81c23fe3816122982c160d63b38c95c830b633b826 + which-typed-array: ^1.1.15 + checksum: f840cf161224252512f9527306b57117192696571e07920f777cb893454e32999206198b4f075516112af6459daca282826d1735c450528470356d09eff3a9ae languageName: node linkType: hard @@ -8105,37 +7830,45 @@ __metadata: languageName: node linkType: hard -"es-errors@npm:^1.0.0, es-errors@npm:^1.1.0, es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": +"es-errors@npm:^1.1.0, es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.12, es-iterator-helpers@npm:^1.0.15": - version: 1.0.17 - resolution: "es-iterator-helpers@npm:1.0.17" +"es-iterator-helpers@npm:^1.0.15, es-iterator-helpers@npm:^1.0.19": + version: 1.0.19 + resolution: "es-iterator-helpers@npm:1.0.19" dependencies: - asynciterator.prototype: ^1.0.0 call-bind: ^1.0.7 define-properties: ^1.2.1 - es-abstract: ^1.22.4 + es-abstract: ^1.23.3 es-errors: ^1.3.0 - es-set-tostringtag: ^2.0.2 + es-set-tostringtag: ^2.0.3 function-bind: ^1.1.2 get-intrinsic: ^1.2.4 globalthis: ^1.0.3 has-property-descriptors: ^1.0.2 - has-proto: ^1.0.1 + has-proto: ^1.0.3 has-symbols: ^1.0.3 internal-slot: ^1.0.7 iterator.prototype: ^1.1.2 - safe-array-concat: ^1.1.0 - checksum: f0962abbf120c37516c9008716fcaffeacf7bc6147a07e63cda3c3ac8be94b88e4ef8d71234c4b8873d1fc209f65c6d9e11a7faac78f59b5d3bcfa399affed7b + safe-array-concat: ^1.1.2 + checksum: 7ae112b88359fbaf4b9d7d1d1358ae57c5138768c57ba3a8fb930393662653b0512bfd7917c15890d1471577fb012fee8b73b4465e59b331739e6ee94f961683 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0": + version: 1.0.0 + resolution: "es-object-atoms@npm:1.0.0" + dependencies: + es-errors: ^1.3.0 + checksum: 26f0ff78ab93b63394e8403c353842b2272836968de4eafe97656adfb8a7c84b9099bf0fe96ed58f4a4cddc860f6e34c77f91649a58a5daa4a9c40b902744e3c languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.2": +"es-set-tostringtag@npm:^2.0.3": version: 2.0.3 resolution: "es-set-tostringtag@npm:2.0.3" dependencies: @@ -8393,10 +8126,10 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 +"escalade@npm:^3.1.1, escalade@npm:^3.1.2": + version: 3.1.2 + resolution: "escalade@npm:3.1.2" + checksum: 1ec0977aa2772075493002bdbd549d595ff6e9393b1cb0d7d6fcaf78c750da0c158f180938365486f75cb69fba20294351caddfce1b46552a7b6c3cde52eaa02 languageName: node linkType: hard @@ -8441,12 +8174,12 @@ __metadata: linkType: hard "eslint-config-next@npm:^14.0.4": - version: 14.1.0 - resolution: "eslint-config-next@npm:14.1.0" + version: 14.2.3 + resolution: "eslint-config-next@npm:14.2.3" dependencies: - "@next/eslint-plugin-next": 14.1.0 + "@next/eslint-plugin-next": 14.2.3 "@rushstack/eslint-patch": ^1.3.3 - "@typescript-eslint/parser": ^5.4.2 || ^6.0.0 + "@typescript-eslint/parser": ^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0 eslint-import-resolver-node: ^0.3.6 eslint-import-resolver-typescript: ^3.5.2 eslint-plugin-import: ^2.28.1 @@ -8459,7 +8192,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 6275f6bd05d0db34e11bda22efc88f56a3f10e2620cbaaad001016497d87b9cf9814ca9ddbf8f4ecd1456e6a2a486e5f12806602aac488b167a240488fe07611 + checksum: 512bc0c21c189d086a6aa1f01fbb3b1d4ee62c017670a5bbf6b0fa9b44ad2b61047364d9b0800ec25f6208364090d87a20b513e65902367e795f33327c09e023 languageName: node linkType: hard @@ -8504,14 +8237,14 @@ __metadata: linkType: hard "eslint-module-utils@npm:^2.7.4, eslint-module-utils@npm:^2.8.0": - version: 2.8.0 - resolution: "eslint-module-utils@npm:2.8.0" + version: 2.8.1 + resolution: "eslint-module-utils@npm:2.8.1" dependencies: debug: ^3.2.7 peerDependenciesMeta: eslint: optional: true - checksum: 74c6dfea7641ebcfe174be61168541a11a14aa8d72e515f5f09af55cd0d0862686104b0524aa4b8e0ce66418a44aa38a94d2588743db5fd07a6b49ffd16921d2 + checksum: 3cecd99b6baf45ffc269167da0f95dcb75e5aa67b93d73a3bab63e2a7eedd9cdd6f188eed048e2f57c1b77db82c9cbf2adac20b512fa70e597d863dd3720170d languageName: node linkType: hard @@ -8593,28 +8326,30 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.33.2": - version: 7.33.2 - resolution: "eslint-plugin-react@npm:7.33.2" + version: 7.34.2 + resolution: "eslint-plugin-react@npm:7.34.2" dependencies: - array-includes: ^3.1.6 - array.prototype.flatmap: ^1.3.1 - array.prototype.tosorted: ^1.1.1 + array-includes: ^3.1.8 + array.prototype.findlast: ^1.2.5 + array.prototype.flatmap: ^1.3.2 + array.prototype.toreversed: ^1.1.2 + array.prototype.tosorted: ^1.1.3 doctrine: ^2.1.0 - es-iterator-helpers: ^1.0.12 + es-iterator-helpers: ^1.0.19 estraverse: ^5.3.0 jsx-ast-utils: ^2.4.1 || ^3.0.0 minimatch: ^3.1.2 - object.entries: ^1.1.6 - object.fromentries: ^2.0.6 - object.hasown: ^1.1.2 - object.values: ^1.1.6 + object.entries: ^1.1.8 + object.fromentries: ^2.0.8 + object.hasown: ^1.1.4 + object.values: ^1.2.0 prop-types: ^15.8.1 - resolve: ^2.0.0-next.4 + resolve: ^2.0.0-next.5 semver: ^6.3.1 - string.prototype.matchall: ^4.0.8 + string.prototype.matchall: ^4.0.11 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: b4c3d76390b0ae6b6f9fed78170604cc2c04b48e6778a637db339e8e3911ec9ef22510b0ae77c429698151d0f1b245f282177f384105b6830e7b29b9c9b26610 + checksum: aed331239f3a64fcd884380534ece4b8716f1eca4899c8636d04306879e6b4e7339e28e427bdd571d372b78b713025e0767e5f5b5486a8d19bff82616ebe8959 languageName: node linkType: hard @@ -8693,53 +8428,6 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.26.0": - version: 8.51.0 - resolution: "eslint@npm:8.51.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.6.1 - "@eslint/eslintrc": ^2.1.2 - "@eslint/js": 8.51.0 - "@humanwhocodes/config-array": ^0.11.11 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.12.4 - chalk: ^4.0.0 - cross-spawn: ^7.0.2 - debug: ^4.3.2 - doctrine: ^3.0.0 - escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.2 - eslint-visitor-keys: ^3.4.3 - espree: ^9.6.1 - esquery: ^1.4.2 - esutils: ^2.0.2 - fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 - find-up: ^5.0.0 - glob-parent: ^6.0.2 - globals: ^13.19.0 - graphemer: ^1.4.0 - ignore: ^5.2.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-yaml: ^4.1.0 - json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 - lodash.merge: ^4.6.2 - minimatch: ^3.1.2 - natural-compare: ^1.4.0 - optionator: ^0.9.3 - strip-ansi: ^6.0.1 - text-table: ^0.2.0 - bin: - eslint: bin/eslint.js - checksum: 214fa5d1fcb67af1b8992ce9584ccd85e1aa7a482f8b8ea5b96edc28fa838a18a3b69456db45fc1ed3ef95f1e9efa9714f737292dc681e572d471d02fda9649c - languageName: node - linkType: hard - "espree@npm:^9.6.0, espree@npm:^9.6.1": version: 9.6.1 resolution: "espree@npm:9.6.1" @@ -8903,11 +8591,11 @@ __metadata: linkType: hard "ethereum-bloom-filters@npm:^1.0.6": - version: 1.0.10 - resolution: "ethereum-bloom-filters@npm:1.0.10" + version: 1.1.0 + resolution: "ethereum-bloom-filters@npm:1.1.0" dependencies: - js-sha3: ^0.8.0 - checksum: 4019cc6f9274ae271a52959194a72f6e9b013366f168f922dc3b349319faf7426bf1010125ee0676b4f75714fe4a440edd4e7e62342c121a046409f4cd4c0af9 + "@noble/hashes": ^1.4.0 + checksum: 9565cd1e2002509852a05461cc93ee6874e8f961e0f66929cfc34d05f6f451fcfa4df287f8735ee184e4ba5f6e63a76a3c69bbeda5dda5bdf486f68fb9fa61f3 languageName: node linkType: hard @@ -8947,14 +8635,14 @@ __metadata: linkType: hard "ethereum-cryptography@npm:^2.0.0, ethereum-cryptography@npm:^2.1.2": - version: 2.1.2 - resolution: "ethereum-cryptography@npm:2.1.2" + version: 2.1.3 + resolution: "ethereum-cryptography@npm:2.1.3" dependencies: - "@noble/curves": 1.1.0 - "@noble/hashes": 1.3.1 - "@scure/bip32": 1.3.1 - "@scure/bip39": 1.2.1 - checksum: 2e8f7b8cc90232ae838ab6a8167708e8362621404d26e79b5d9e762c7b53d699f7520aff358d9254de658fcd54d2d0af168ff909943259ed27dc4cef2736410c + "@noble/curves": 1.3.0 + "@noble/hashes": 1.3.3 + "@scure/bip32": 1.3.3 + "@scure/bip39": 1.2.2 + checksum: 7f9c14f868a588641179cace3eb86c332c4743290865db699870710253cabc4dc74bd4bce5e7bc6db667482e032e94d6f79521219eb6be5dc422059d279a27b7 languageName: node linkType: hard @@ -8996,7 +8684,7 @@ __metadata: languageName: node linkType: hard -"ethers@npm:^5.7.0, ethers@npm:^5.7.2": +"ethers@npm:^5.7.2": version: 5.7.2 resolution: "ethers@npm:5.7.2" dependencies: @@ -9034,9 +8722,9 @@ __metadata: languageName: node linkType: hard -"ethers@npm:^6.10.0": - version: 6.11.1 - resolution: "ethers@npm:6.11.1" +"ethers@npm:^6.4.0, ethers@npm:^6.7.0": + version: 6.12.1 + resolution: "ethers@npm:6.12.1" dependencies: "@adraffy/ens-normalize": 1.10.1 "@noble/curves": 1.2.0 @@ -9045,7 +8733,7 @@ __metadata: aes-js: 4.0.0-beta.5 tslib: 2.4.0 ws: 8.5.0 - checksum: e8027c5071ad0370c61a1978f0602ab950d840c5923948f55e88b9808300e4e02e792bb793ea109ce7fa0e748f30a40a05f1202204a2b0402cdffbcb64a218e4 + checksum: ddf398c91f584b9e643740ec17a9c82b4a1c4ea3fb6efd00f1a043b89d1ec6f9427aa80894f75850ee805722e91b8d054bce18579a2c621226302c096774df90 languageName: node linkType: hard @@ -9231,7 +8919,7 @@ __metadata: languageName: node linkType: hard -"expect@npm:^29.7.0": +"expect@npm:^29.0.0, expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" dependencies: @@ -9326,20 +9014,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.9": - version: 3.3.1 - resolution: "fast-glob@npm:3.3.1" - 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 - checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 - languageName: node - linkType: hard - -"fast-glob@npm:^3.2.7, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1": +"fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -9352,7 +9027,7 @@ __metadata: languageName: node linkType: hard -"fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": +"fast-json-stable-stringify@npm:2.x, fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb @@ -9376,9 +9051,9 @@ __metadata: linkType: hard "fast-redact@npm:^3.0.0": - version: 3.3.0 - resolution: "fast-redact@npm:3.3.0" - checksum: 3f7becc70a5a2662a9cbfdc52a4291594f62ae998806ee00315af307f32d9559dbf512146259a22739ee34401950ef47598c1f4777d33b0ed5027203d67f549c + version: 3.5.0 + resolution: "fast-redact@npm:3.5.0" + checksum: ef03f0d1849da074a520a531ad299bf346417b790a643931ab4e01cb72275c8d55b60dc8512fb1f1818647b696790edefaa96704228db9f012da935faa1940af languageName: node linkType: hard @@ -9406,11 +9081,11 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" + version: 1.17.1 + resolution: "fastq@npm:1.17.1" dependencies: reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a + checksum: a8c5b26788d5a1763f88bae56a8ddeee579f935a831c5fe7a8268cea5b0a91fbfe705f612209e02d639b881d7b48e461a50da4a10cfaa40da5ca7cc9da098d88 languageName: node linkType: hard @@ -9496,12 +9171,12 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + checksum: b4abfbca3839a3d55e4ae5ec62e131e2e356bf4859ce8480c64c4876100f4df292a63e5bb1618e1d7460282ca2b305653064f01654474aa35c68000980f17798 languageName: node linkType: hard @@ -9551,13 +9226,13 @@ __metadata: linkType: hard "flat-cache@npm:^3.0.4": - version: 3.1.1 - resolution: "flat-cache@npm:3.1.1" + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" dependencies: flatted: ^3.2.9 keyv: ^4.5.3 rimraf: ^3.0.2 - checksum: 4958cfe0f46acf84953d4e16676ef5f0d38eab3a92d532a1e8d5f88f11eea8b36d5d598070ff2aeae15f1fde18f8d7d089eefaf9db10b5a587cc1c9072325c7a + checksum: e7e0f59801e288b54bee5cb9681e9ee21ee28ef309f886b312c9d08415b79fc0f24ac842f84356ce80f47d6a53de62197ce0e6e148dc42d5db005992e2a756ec languageName: node linkType: hard @@ -9571,28 +9246,19 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.2.9 - resolution: "flatted@npm:3.2.9" - checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 - languageName: node - linkType: hard - -"fmix@npm:^0.1.0": - version: 0.1.0 - resolution: "fmix@npm:0.1.0" - dependencies: - imul: ^1.0.0 - checksum: c465344d4f169eaf10d45c33949a1e7a633f09dba2ac7063ce8ae8be743df5979d708f7f24900163589f047f5194ac5fc2476177ce31175e8805adfa7b8fb7a4 + version: 3.3.1 + resolution: "flatted@npm:3.3.1" + checksum: 85ae7181650bb728c221e7644cbc9f4bf28bc556f2fc89bb21266962bdf0ce1029cc7acc44bb646cd469d9baac7c317f64e841c4c4c00516afa97320cdac7f94 languageName: node linkType: hard -"follow-redirects@npm:^1.12.1, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.15.0": - version: 1.15.3 - resolution: "follow-redirects@npm:1.15.3" +"follow-redirects@npm:^1.12.1, follow-redirects@npm:^1.14.0, follow-redirects@npm:^1.15.6": + version: 1.15.6 + resolution: "follow-redirects@npm:1.15.6" peerDependenciesMeta: debug: optional: true - checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231 + checksum: a62c378dfc8c00f60b9c80cab158ba54e99ba0239a5dd7c81245e5a5b39d10f0c35e249c3379eae719ff0285fff88c365dd446fab19dee771f1d76252df1bbf5 languageName: node linkType: hard @@ -9841,7 +9507,7 @@ __metadata: languageName: node linkType: hard -"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": +"function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 @@ -9884,22 +9550,6 @@ __metadata: languageName: node linkType: hard -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d - languageName: node - linkType: hard - "generic-pool@npm:3.4.2": version: 3.4.2 resolution: "generic-pool@npm:3.4.2" @@ -9928,19 +9578,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2": - version: 1.2.1 - resolution: "get-intrinsic@npm:1.2.1" - dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - checksum: 5b61d88552c24b0cf6fa2d1b3bc5459d7306f699de060d76442cce49a4721f52b8c560a33ab392cf5575b7810277d54ded9d4d39a1ea61855619ebc005aa7e5f - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": +"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.3, get-intrinsic@npm:^1.2.4": version: 1.2.4 resolution: "get-intrinsic@npm:1.2.4" dependencies: @@ -10049,11 +9687,11 @@ __metadata: linkType: hard "get-tsconfig@npm:^4.5.0": - version: 4.7.2 - resolution: "get-tsconfig@npm:4.7.2" + version: 4.7.5 + resolution: "get-tsconfig@npm:4.7.5" dependencies: resolve-pkg-maps: ^1.0.0 - checksum: 172358903250eff0103943f816e8a4e51d29b8e5449058bdf7266714a908a48239f6884308bd3a6ff28b09f692b9533dbebfd183ab63e4e14f073cda91f1bca9 + checksum: e5b271fae2b4cd1869bbfc58db56983026cc4a08fdba988725a6edd55d04101507de154722503a22ee35920898ff9bdcba71f99d93b17df35dddb8e8a2ad91be languageName: node linkType: hard @@ -10096,7 +9734,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:10.3.10, glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:10.3.10": version: 10.3.10 resolution: "glob@npm:10.3.10" dependencies: @@ -10139,6 +9777,19 @@ __metadata: languageName: node linkType: hard +"glob@npm:8.1.0": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 + once: ^1.3.0 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 + languageName: node + linkType: hard + "glob@npm:9.3.4": version: 9.3.4 resolution: "glob@npm:9.3.4" @@ -10151,6 +9802,21 @@ __metadata: languageName: node linkType: hard +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.4.1 + resolution: "glob@npm:10.4.1" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^3.1.2 + minimatch: ^9.0.4 + minipass: ^7.1.2 + path-scurry: ^1.11.1 + bin: + glob: dist/esm/bin.mjs + checksum: 5d33c686c80bf6877f4284adf99a8c3cbb2a6eccbc92342943fe5d4b42c01d78c1881f2223d950c92a938d0f857e12e37b86a8e5483ab2141822e053b67d0dde + languageName: node + linkType: hard + "glob@npm:^5.0.15": version: 5.0.15 resolution: "glob@npm:5.0.15" @@ -10206,20 +9872,21 @@ __metadata: linkType: hard "globals@npm:^13.19.0": - version: 13.23.0 - resolution: "globals@npm:13.23.0" + version: 13.24.0 + resolution: "globals@npm:13.24.0" dependencies: type-fest: ^0.20.2 - checksum: 194c97cf8d1ef6ba59417234c2386549c4103b6e5f24b1ff1952de61a4753e5d2069435ba629de711a6480b1b1d114a98e2ab27f85e966d5a10c319c3bbd3dc3 + checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c languageName: node linkType: hard "globalthis@npm:^1.0.3": - version: 1.0.3 - resolution: "globalthis@npm:1.0.3" + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" dependencies: - define-properties: ^1.1.3 - checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 + define-properties: ^1.2.1 + gopd: ^1.0.1 + checksum: 39ad667ad9f01476474633a1834a70842041f70a55571e8dcef5fb957980a92da5022db5430fca8aecc5d47704ae30618c0bc877a579c70710c904e9ef06108a languageName: node linkType: hard @@ -10371,20 +10038,21 @@ __metadata: languageName: node linkType: hard -"h3@npm:^1.10.1, h3@npm:^1.8.2": - version: 1.10.2 - resolution: "h3@npm:1.10.2" +"h3@npm:^1.10.2, h3@npm:^1.11.1": + version: 1.11.1 + resolution: "h3@npm:1.11.1" dependencies: cookie-es: ^1.0.0 + crossws: ^0.2.2 defu: ^6.1.4 - destr: ^2.0.2 + destr: ^2.0.3 iron-webcrypto: ^1.0.0 ohash: ^1.1.3 radix3: ^1.1.0 - ufo: ^1.3.2 + ufo: ^1.4.0 uncrypto: ^0.1.3 unenv: ^1.9.0 - checksum: 04f36371cd05fdecc6810ff88e4441ac1f077ea1c90ec66bed5c77ad7cf1ba1b25518f70e5b2501b7f9648d2532870898851a782393d37e329f33e56b395e7cb + checksum: 505ef90cf095f5a6c1e7fb7f26e83b44477634c31eda4459b683e96837ba33d163e89599b3a883e645688b761ffa754ff1f77a432c4e229bf5ab916272e0bee5 languageName: node linkType: hard @@ -10447,59 +10115,16 @@ __metadata: languageName: node linkType: hard -"hardhat-deploy-ethers@npm:^0.4.1": - version: 0.4.1 - resolution: "hardhat-deploy-ethers@npm:0.4.1" - peerDependencies: - "@nomicfoundation/hardhat-ethers": ^3.0.2 - hardhat: ^2.16.0 - hardhat-deploy: ^0.11.34 - checksum: 757b1d4ca7bdf37b87559e5aac03b6a751a06b11ba04bc23543fd794e86354872809e01089e85a21b63005b6068f7c61f8d62a6d8c1a8362ee234346b6c6f4e3 - languageName: node - linkType: hard - -"hardhat-deploy@npm:^0.11.45": - version: 0.11.45 - resolution: "hardhat-deploy@npm:0.11.45" - dependencies: - "@ethersproject/abi": ^5.7.0 - "@ethersproject/abstract-signer": ^5.7.0 - "@ethersproject/address": ^5.7.0 - "@ethersproject/bignumber": ^5.7.0 - "@ethersproject/bytes": ^5.7.0 - "@ethersproject/constants": ^5.7.0 - "@ethersproject/contracts": ^5.7.0 - "@ethersproject/providers": ^5.7.2 - "@ethersproject/solidity": ^5.7.0 - "@ethersproject/transactions": ^5.7.0 - "@ethersproject/wallet": ^5.7.0 - "@types/qs": ^6.9.7 - axios: ^0.21.1 - chalk: ^4.1.2 - chokidar: ^3.5.2 - debug: ^4.3.2 - enquirer: ^2.3.6 - ethers: ^5.7.0 - form-data: ^4.0.0 - fs-extra: ^10.0.0 - match-all: ^1.2.6 - murmur-128: ^0.2.1 - qs: ^6.9.4 - zksync-web3: ^0.14.3 - checksum: 7ecce33c3305857bdd1873a25d391e27ae9f581df75757035cb028ace7bb5fbb83f053435e843bc3d925e7fd8412c3dc582797fe5b4bbe1fef7f3dd989a7c878 - languageName: node - linkType: hard - -"hardhat-gas-reporter@npm:^1.0.9": - version: 1.0.9 - resolution: "hardhat-gas-reporter@npm:1.0.9" +"hardhat-gas-reporter@npm:^1.0.8": + version: 1.0.10 + resolution: "hardhat-gas-reporter@npm:1.0.10" dependencies: array-uniq: 1.0.3 eth-gas-reporter: ^0.2.25 sha1: ^1.1.1 peerDependencies: hardhat: ^2.0.2 - checksum: 77f8f8d085ff3d9d7787f0227e5355e1800f7d6707bc70171e0567bf69706703ae7f6f53dce1be1d409e7e71e3629a434c94b546bdbbc1e4c1af47cd5d0c6776 + checksum: caaec13ab3fcda47b8768257e4416b5fd0e8ef3aca5369aa8195419d3d4a948cc182075333651df44215cfc629d088f5ed9f762c8c14ae5a4b4a4f2613e583d0 languageName: node linkType: hard @@ -10512,23 +10137,16 @@ __metadata: languageName: node linkType: hard -"hardhat@npm:^2.19.4": - version: 2.20.1 - resolution: "hardhat@npm:2.20.1" +"hardhat@npm:^2.22.4": + version: 2.22.4 + resolution: "hardhat@npm:2.22.4" dependencies: "@ethersproject/abi": ^5.1.2 "@metamask/eth-sig-util": ^4.0.0 - "@nomicfoundation/ethereumjs-block": 5.0.4 - "@nomicfoundation/ethereumjs-blockchain": 7.0.4 + "@nomicfoundation/edr": ^0.3.7 "@nomicfoundation/ethereumjs-common": 4.0.4 - "@nomicfoundation/ethereumjs-evm": 2.0.4 - "@nomicfoundation/ethereumjs-rlp": 5.0.4 - "@nomicfoundation/ethereumjs-statemanager": 2.0.4 - "@nomicfoundation/ethereumjs-trie": 6.0.4 "@nomicfoundation/ethereumjs-tx": 5.0.4 "@nomicfoundation/ethereumjs-util": 9.0.4 - "@nomicfoundation/ethereumjs-verkle": 0.0.2 - "@nomicfoundation/ethereumjs-vm": 7.0.4 "@nomicfoundation/solidity-analyzer": ^0.1.0 "@sentry/node": ^5.18.1 "@types/bn.js": ^5.1.0 @@ -10576,7 +10194,7 @@ __metadata: optional: true bin: hardhat: internal/cli/bootstrap.js - checksum: 191f2878f18740a59afa9afa3486487a6e2c7c57d54410779349a40a1046117b6329a151f6e66bba0c2a94b15f9880f38a1e4d7053c33eca022a3de5669326e8 + checksum: c10deb21dac800fe4356f7325646ffef6542704894bd5712fe91246ba307d1f9b02a26998cf2e2adddf299c82e2f19afce33dadbc1afcd7de1692296157fdefc languageName: node linkType: hard @@ -10608,7 +10226,7 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.1, has-property-descriptors@npm:^1.0.2": +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": version: 1.0.2 resolution: "has-property-descriptors@npm:1.0.2" dependencies: @@ -10617,14 +10235,7 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "has-proto@npm:1.0.1" - checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e - languageName: node - linkType: hard - -"has-proto@npm:^1.0.3": +"has-proto@npm:^1.0.1, has-proto@npm:^1.0.3": version: 1.0.3 resolution: "has-proto@npm:1.0.3" checksum: fe7c3d50b33f50f3933a04413ed1f69441d21d2d2944f81036276d30635cad9279f6b43bc8f32036c31ebdfcf6e731150f46c1907ad90c669ffe9b066c3ba5c4 @@ -10654,7 +10265,7 @@ __metadata: languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.1, has-tostringtag@npm:^1.0.2": +"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": version: 1.0.2 resolution: "has-tostringtag@npm:1.0.2" dependencies: @@ -10670,13 +10281,6 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.4 - resolution: "has@npm:1.0.4" - checksum: 8a11ba062e0627c9578a1d08285401e39f1d071a9692ddf793199070edb5648b21c774dd733e2a181edd635bf6862731885f476f4ccf67c998d7a5ff7cef2550 - languageName: node - linkType: hard - "hash-base@npm:^3.0.0": version: 3.1.0 resolution: "hash-base@npm:3.1.0" @@ -10698,12 +10302,12 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.1": - version: 2.0.1 - resolution: "hasown@npm:2.0.1" +"hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" dependencies: function-bind: ^1.1.2 - checksum: 9081c382a4fe8a62639a8da5c7d3322b203c319147e48783763dd741863d9f2dcaa743574fe2a1283871c445d8ba99ea45d5fff384e5ad27ca9dd7a367d79de0 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db languageName: node linkType: hard @@ -10803,14 +10407,13 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" +"http-proxy-agent@npm:^7.0.0": + version: 7.0.2 + resolution: "http-proxy-agent@npm:7.0.2" dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + agent-base: ^7.1.0 + debug: ^4.3.4 + checksum: 670858c8f8f3146db5889e1fa117630910101db601fff7d5a8aa637da0abedf68c899f03d3451cac2f83bcc4c3d2dabf339b3aa00ff8080571cceb02c3ce02f3 languageName: node linkType: hard @@ -10851,6 +10454,16 @@ __metadata: languageName: node linkType: hard +"https-proxy-agent@npm:^7.0.1": + version: 7.0.4 + resolution: "https-proxy-agent@npm:7.0.4" + dependencies: + agent-base: ^7.0.2 + debug: 4 + checksum: daaab857a967a2519ddc724f91edbbd388d766ff141b9025b629f92b9408fc83cee8a27e11a907aede392938e9c398e240d643e178408a59e4073539cde8cfe9 + languageName: node + linkType: hard + "human-signals@npm:^1.1.1": version: 1.1.1 resolution: "human-signals@npm:1.1.1" @@ -10879,15 +10492,6 @@ __metadata: languageName: node linkType: hard -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - "husky@npm:^8.0.1": version: 8.0.3 resolution: "husky@npm:8.0.3" @@ -10936,10 +10540,17 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef +"ignore@npm:^5.1.1, ignore@npm:^5.2.0": + version: 5.3.1 + resolution: "ignore@npm:5.3.1" + checksum: 71d7bb4c1dbe020f915fd881108cbe85a0db3d636a0ea3ba911393c53946711d13a9b1143c7e70db06d571a5822c0a324a6bcde5c9904e7ca5047f01f1bf8cd3 + languageName: node + linkType: hard + +"immer@npm:10.0.2": + version: 10.0.2 + resolution: "immer@npm:10.0.2" + checksum: 525a3b14210d02ae420c3b9f6ca14f7e9bcf625611d1356e773e7739f14c7c8de50dac442e6c7de3a6e24a782f7b792b6b8666bc0b3f00269d21a95f8f68ca84 languageName: node linkType: hard @@ -10951,9 +10562,9 @@ __metadata: linkType: hard "immutable@npm:^4.0.0-rc.12": - version: 4.3.4 - resolution: "immutable@npm:4.3.4" - checksum: de3edd964c394bab83432429d3fb0b4816b42f56050f2ca913ba520bd3068ec3e504230d0800332d3abc478616e8f55d3787424a90d0952e6aba864524f1afc3 + version: 4.3.6 + resolution: "immutable@npm:4.3.6" + checksum: 3afd020be988ec9ba42c1e585b88858970beba91332ac04ac11446722c7e5da03d5956f5049806573d29dfee25f69262297cb7f3bd6b16fc83a175a0176c6c2a languageName: node linkType: hard @@ -10979,13 +10590,6 @@ __metadata: languageName: node linkType: hard -"imul@npm:^1.0.0": - version: 1.0.1 - resolution: "imul@npm:1.0.1" - checksum: 6c2af3d5f09e2135e14d565a2c108412b825b221eb2c881f9130467f2adccf7ae201773ae8bcf1be169e2d090567a1fdfa9cf20d3b7da7b9cecb95b920ff3e52 - languageName: node - linkType: hard - "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -11049,7 +10653,7 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.5, internal-slot@npm:^1.0.7": +"internal-slot@npm:^1.0.7": version: 1.0.7 resolution: "internal-slot@npm:1.0.7" dependencies: @@ -11085,20 +10689,13 @@ __metadata: languageName: node linkType: hard -"ioredis@npm:^5.3.2": - version: 5.3.2 - resolution: "ioredis@npm:5.3.2" +"ip-address@npm:^9.0.5": + version: 9.0.5 + resolution: "ip-address@npm:9.0.5" dependencies: - "@ioredis/commands": ^1.1.1 - cluster-key-slot: ^1.1.0 - debug: ^4.3.4 - denque: ^2.1.0 - lodash.defaults: ^4.2.0 - lodash.isarguments: ^3.1.0 - redis-errors: ^1.2.0 - redis-parser: ^3.0.0 - standard-as-callback: ^2.1.0 - checksum: 9a23559133e862a768778301efb68ae8c2af3c33562174b54a4c2d6574b976e85c75a4c34857991af733e35c48faf4c356e7daa8fb0a3543d85ff1768c8754bc + jsbn: 1.1.0 + sprintf-js: ^1.1.3 + checksum: aa15f12cfd0ef5e38349744e3654bae649a34c3b10c77a674a167e99925d1549486c5b14730eebce9fea26f6db9d5e42097b00aa4f9f612e68c79121c71652dc languageName: node linkType: hard @@ -11109,13 +10706,6 @@ __metadata: languageName: node linkType: hard -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 - languageName: node - linkType: hard - "ipfs-core-types@npm:^0.9.0": version: 0.9.0 resolution: "ipfs-core-types@npm:0.9.0" @@ -11217,9 +10807,9 @@ __metadata: linkType: hard "iron-webcrypto@npm:^1.0.0": - version: 1.0.0 - resolution: "iron-webcrypto@npm:1.0.0" - checksum: bbd96cbbfec7d072296bc7464763b96555bdadb12aca50f1f1c7e4fcdc6acb102bc3488333e924f94404dd50eda24f84b67ad28323b9138ec7255a023e8dc19e + version: 1.2.1 + resolution: "iron-webcrypto@npm:1.2.1" + checksum: b158d1893c8d037c11a7dcfd1998b519f31f979643c2c505c6eb1170fd63553498a58b05947d5dea116975df8f12ede5ca235cb68e4c1f404fa6695e4508c60c languageName: node linkType: hard @@ -11284,7 +10874,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.1": +"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -11293,12 +10883,12 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0": - version: 2.13.0 - resolution: "is-core-module@npm:2.13.0" +"is-data-view@npm:^1.0.1": + version: 1.0.1 + resolution: "is-data-view@npm:1.0.1" dependencies: - has: ^1.0.3 - checksum: 053ab101fb390bfeb2333360fd131387bed54e476b26860dc7f5a700bbf34a0ec4454f7c8c4d43e8a0030957e4b3db6e16d35e1890ea6fb654c833095e040355 + is-typed-array: ^1.1.13 + checksum: 4ba4562ac2b2ec005fefe48269d6bd0152785458cd253c746154ffb8a8ab506a29d0cfb3b74af87513843776a88e4981ae25c89457bf640a33748eab1a7216b5 languageName: node linkType: hard @@ -11464,10 +11054,10 @@ __metadata: languageName: node linkType: hard -"is-map@npm:^2.0.1": - version: 2.0.2 - resolution: "is-map@npm:2.0.2" - checksum: ace3d0ecd667bbdefdb1852de601268f67f2db725624b1958f279316e13fecb8fa7df91fd60f690d7417b4ec180712f5a7ee967008e27c65cfd475cc84337728 +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: e6ce5f6380f32b141b3153e6ba9074892bbbbd655e92e7ba5ff195239777e767a976dcd4e22f864accaf30e53ebf961ab1995424aef91af68788f0591b7396cc languageName: node linkType: hard @@ -11478,7 +11068,7 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": +"is-negative-zero@npm:^2.0.3": version: 2.0.3 resolution: "is-negative-zero@npm:2.0.3" checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd @@ -11546,14 +11136,14 @@ __metadata: languageName: node linkType: hard -"is-set@npm:^2.0.1": - version: 2.0.2 - resolution: "is-set@npm:2.0.2" - checksum: b64343faf45e9387b97a6fd32be632ee7b269bd8183701f3b3f5b71a7cf00d04450ed8669d0bd08753e08b968beda96fca73a10fd0ff56a32603f64deba55a57 +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 36e3f8c44bdbe9496c9689762cc4110f6a6a12b767c5d74c0398176aa2678d4467e3bf07595556f2dba897751bde1422480212b97d973c7b08a343100b0c0dfe languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": +"is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "is-shared-array-buffer@npm:1.0.3" dependencies: @@ -11633,10 +11223,10 @@ __metadata: languageName: node linkType: hard -"is-weakmap@npm:^2.0.1": - version: 2.0.1 - resolution: "is-weakmap@npm:2.0.1" - checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6 +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: f36aef758b46990e0d3c37269619c0a08c5b29428c0bb11ecba7f75203442d6c7801239c2f31314bc79199217ef08263787f3837d9e22610ad1da62970d6616d languageName: node linkType: hard @@ -11649,13 +11239,13 @@ __metadata: languageName: node linkType: hard -"is-weakset@npm:^2.0.1": - version: 2.0.2 - resolution: "is-weakset@npm:2.0.2" +"is-weakset@npm:^2.0.3": + version: 2.0.3 + resolution: "is-weakset@npm:2.0.3" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367 + call-bind: ^1.0.7 + get-intrinsic: ^1.2.4 + checksum: 8b6a20ee9f844613ff8f10962cfee49d981d584525f2357fee0a04dfbcde9fd607ed60cb6dab626dbcc470018ae6392e1ff74c0c1aced2d487271411ad9d85ae languageName: node linkType: hard @@ -11714,6 +11304,13 @@ __metadata: languageName: node linkType: hard +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e + languageName: node + linkType: hard + "iso-url@npm:^1.1.5": version: 1.2.1 resolution: "iso-url@npm:1.2.1" @@ -11906,9 +11503,22 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^3.1.2": + version: 3.1.2 + resolution: "jackspeak@npm:3.1.2" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 134276d5f785c518930701a0dcba1f3b0e9ce3e5b1c3e300898e2ae0bbd9b5195088b77252bf2110768de072c426e9e39f47e13912b0b002da4a3f4ff6e16eac + languageName: node + linkType: hard + "jake@npm:^10.8.5": - version: 10.8.7 - resolution: "jake@npm:10.8.7" + version: 10.9.1 + resolution: "jake@npm:10.9.1" dependencies: async: ^3.2.3 chalk: ^4.0.2 @@ -11916,7 +11526,7 @@ __metadata: minimatch: ^3.1.2 bin: jake: bin/cli.js - checksum: a23fd2273fb13f0d0d845502d02c791fd55ef5c6a2d207df72f72d8e1eac6d2b8ffa6caf660bc8006b3242e0daaa88a3ecc600194d72b5c6016ad56e9cd43553 + checksum: 49659c156b8ad921af377fb782505ae3cc7e7dd8793695b782070d99b4b66d2688b4e3efb32e09252400bfe6e49a7fb393a3a0959e8e1a51dbda95bcacbb9c36 languageName: node linkType: hard @@ -12313,7 +11923,7 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^29.7.0": +"jest-util@npm:^29.0.0, jest-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-util@npm:29.7.0" dependencies: @@ -12369,7 +11979,7 @@ __metadata: languageName: node linkType: hard -"jest@npm:^29.6.1": +"jest@npm:^29.7.0": version: 29.7.0 resolution: "jest@npm:29.7.0" dependencies: @@ -12388,7 +11998,7 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.19.1, jiti@npm:^1.21.0": +"jiti@npm:^1.21.0": version: 1.21.0 resolution: "jiti@npm:1.21.0" bin: @@ -12398,22 +12008,15 @@ __metadata: linkType: hard "joi@npm:^17.4.0": - version: 17.11.0 - resolution: "joi@npm:17.11.0" + version: 17.13.1 + resolution: "joi@npm:17.13.1" dependencies: - "@hapi/hoek": ^9.0.0 - "@hapi/topo": ^5.0.0 - "@sideway/address": ^4.1.3 + "@hapi/hoek": ^9.3.0 + "@hapi/topo": ^5.1.0 + "@sideway/address": ^4.1.5 "@sideway/formula": ^3.0.1 "@sideway/pinpoint": ^2.0.0 - checksum: 3a4e9ecba345cdafe585e7ed8270a44b39718e11dff3749aa27e0001a63d578b75100c062be28e6f48f960b594864034e7a13833f33fbd7ad56d5ce6b617f9bf - languageName: node - linkType: hard - -"js-sdsl@npm:^4.1.4": - version: 4.4.2 - resolution: "js-sdsl@npm:4.4.2" - checksum: ba705adc1788bf3c6f6c8e5077824f2bb4f0acab5a984420ce5cc492c7fff3daddc26335ad2c9a67d4f5e3241ec790f9e5b72a625adcf20cf321d2fd85e62b8b + checksum: e755140446a0e0fb679c0f512d20dfe1625691de368abe8069507c9bccae5216b5bb56b5a83100a600808b1753ab44fdfdc9933026268417f84b6e0832a9604e languageName: node linkType: hard @@ -12461,6 +12064,13 @@ __metadata: languageName: node linkType: hard +"jsbn@npm:1.1.0": + version: 1.1.0 + resolution: "jsbn@npm:1.1.0" + checksum: 944f924f2bd67ad533b3850eee47603eed0f6ae425fd1ee8c760f477e8c34a05f144c1bd4f5a5dd1963141dc79a2c55f89ccc5ab77d039e7077f3ad196b64965 + languageName: node + linkType: hard + "jsbn@npm:~0.1.0": version: 0.1.1 resolution: "jsbn@npm:0.1.1" @@ -12573,13 +12183,6 @@ __metadata: languageName: node linkType: hard -"jsonc-parser@npm:^3.2.0": - version: 3.2.1 - resolution: "jsonc-parser@npm:3.2.1" - checksum: 656d9027b91de98d8ab91b3aa0d0a4cab7dc798a6830845ca664f3e76c82d46b973675bbe9b500fae1de37fd3e81aceacbaa2a57884bf2f8f29192150d2d1ef7 - languageName: node - linkType: hard - "jsonfile@npm:^2.1.0": version: 2.4.0 resolution: "jsonfile@npm:2.4.0" @@ -12710,9 +12313,9 @@ __metadata: linkType: hard "language-subtag-registry@npm:^0.3.20": - version: 0.3.22 - resolution: "language-subtag-registry@npm:0.3.22" - checksum: 8ab70a7e0e055fe977ac16ea4c261faec7205ac43db5e806f72e5b59606939a3b972c4bd1e10e323b35d6ffa97c3e1c4c99f6553069dad2dfdd22020fa3eb56a + version: 0.3.23 + resolution: "language-subtag-registry@npm:0.3.23" + checksum: 0b64c1a6c5431c8df648a6d25594ff280613c886f4a1a542d9b864e5472fb93e5c7856b9c41595c38fac31370328fc79fcc521712e89ea6d6866cbb8e0995d81 languageName: node linkType: hard @@ -12793,32 +12396,32 @@ __metadata: languageName: node linkType: hard -"listhen@npm:^1.5.5": - version: 1.6.0 - resolution: "listhen@npm:1.6.0" +"listhen@npm:^1.7.2": + version: 1.7.2 + resolution: "listhen@npm:1.7.2" dependencies: - "@parcel/watcher": ^2.4.0 - "@parcel/watcher-wasm": 2.4.0 - citty: ^0.1.5 + "@parcel/watcher": ^2.4.1 + "@parcel/watcher-wasm": ^2.4.1 + citty: ^0.1.6 clipboardy: ^4.0.0 consola: ^3.2.3 - crossws: ^0.1.0 + crossws: ^0.2.0 defu: ^6.1.4 get-port-please: ^3.1.2 - h3: ^1.10.1 + h3: ^1.10.2 http-shutdown: ^1.2.2 jiti: ^1.21.0 - mlly: ^1.5.0 + mlly: ^1.6.1 node-forge: ^1.3.1 pathe: ^1.1.2 std-env: ^3.7.0 - ufo: ^1.3.2 + ufo: ^1.4.0 untun: ^0.1.3 uqr: ^0.1.2 bin: listen: bin/listhen.mjs listhen: bin/listhen.mjs - checksum: b5e1725838847ff6c08e65c62ec2977debe4becc35b0d75b7d2a064da9ec14ad098726859e626c7295e2cdc1309084e604679b02aa26df93997326675e56bff6 + checksum: 92b160ab493bbdb4941ba7fbfc7e0815b4c1da9ca01f792df2e77da13a6b726086d62d57cd2da51242c47a463d59a68798666fb8b64338510e2edf8dc2e7a1c3 languageName: node linkType: hard @@ -12921,20 +12524,6 @@ __metadata: languageName: node linkType: hard -"lodash.defaults@npm:^4.2.0": - version: 4.2.0 - resolution: "lodash.defaults@npm:4.2.0" - checksum: 84923258235592c8886e29de5491946ff8c2ae5c82a7ac5cddd2e3cb697e6fbdfbbb6efcca015795c86eec2bb953a5a2ee4016e3735a3f02720428a40efbb8f1 - languageName: node - linkType: hard - -"lodash.isarguments@npm:^3.1.0": - version: 3.1.0 - resolution: "lodash.isarguments@npm:3.1.0" - checksum: ae1526f3eb5c61c77944b101b1f655f846ecbedcb9e6b073526eba6890dc0f13f09f72e11ffbf6540b602caee319af9ac363d6cdd6be41f4ee453436f04f13b5 - languageName: node - linkType: hard - "lodash.isequal@npm:4.5.0, lodash.isequal@npm:^4.5.0": version: 4.5.0 resolution: "lodash.isequal@npm:4.5.0" @@ -12963,6 +12552,13 @@ __metadata: languageName: node linkType: hard +"lodash.memoize@npm:4.x": + version: 4.1.2 + resolution: "lodash.memoize@npm:4.1.2" + checksum: 9ff3942feeccffa4f1fafa88d32f0d24fdc62fd15ded5a74a5f950ff5f0c6f61916157246744c620173dddf38d37095a92327d5fd3861e2063e736a5c207d089 + languageName: node + linkType: hard + "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" @@ -13054,7 +12650,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.21": +"lodash@npm:4.17.21, lodash@npm:^4.17.11, lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -13134,10 +12730,10 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.0, lru-cache@npm:^10.0.2": - version: 10.2.0 - resolution: "lru-cache@npm:10.2.0" - checksum: eee7ddda4a7475deac51ac81d7dd78709095c6fa46e8350dc2d22462559a1faa3b81ed931d5464b13d48cbd7e08b46100b6f768c76833912bc444b99c37e25db +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": + version: 10.2.2 + resolution: "lru-cache@npm:10.2.2" + checksum: 98e8fc93691c546f719a76103ef2bee5a3ac823955c755a47641ec41f8c7fafa1baeaba466937cc1cbfa9cfd47e03536d10e2db3158a64ad91ff3a58a32c893e languageName: node linkType: hard @@ -13169,20 +12765,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - -"lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.1 - resolution: "lru-cache@npm:10.0.1" - checksum: 06f8d0e1ceabd76bb6f644a26dbb0b4c471b79c7b514c13c6856113879b3bf369eb7b497dad4ff2b7e2636db202412394865b33c332100876d838ad1372f0181 - languageName: node - linkType: hard - "lru_map@npm:^0.3.3": version: 0.3.3 resolution: "lru_map@npm:0.3.3" @@ -13217,33 +12799,30 @@ __metadata: languageName: node linkType: hard -"make-error@npm:^1.1.1": +"make-error@npm:1.x, make-error@npm:^1.1.1": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 languageName: node linkType: hard -"make-fetch-happen@npm:^11.0.3": - version: 11.1.1 - resolution: "make-fetch-happen@npm:11.1.1" +"make-fetch-happen@npm:^13.0.0": + version: 13.0.1 + resolution: "make-fetch-happen@npm:13.0.1" dependencies: - agentkeepalive: ^4.2.1 - cacache: ^17.0.0 + "@npmcli/agent": ^2.0.0 + cacache: ^18.0.0 http-cache-semantics: ^4.1.1 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^5.0.0 + minipass: ^7.0.2 minipass-fetch: ^3.0.0 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 negotiator: ^0.6.3 + proc-log: ^4.2.0 promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 ssri: ^10.0.0 - checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 + checksum: 5c9fad695579b79488fa100da05777213dd9365222f85e4757630f8dd2a21a79ddd3206c78cfd6f9b37346819681782b67900ac847a57cf04190f52dda5343fd languageName: node linkType: hard @@ -13263,13 +12842,6 @@ __metadata: languageName: node linkType: hard -"match-all@npm:^1.2.6": - version: 1.2.6 - resolution: "match-all@npm:1.2.6" - checksum: 3d4f16b8fd082f2fd10e362f4a8b71c62f8a767591b3db831ca2bdcf726337e9a64e4abc30e2ef053dc2bcfb875a9ed80bd78e006ad5ef11380a7158d0cb00e1 - languageName: node - linkType: hard - "md5.js@npm:^1.3.4": version: 1.3.5 resolution: "md5.js@npm:1.3.5" @@ -13340,7 +12912,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:4.0.5, micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": +"micromatch@npm:4.0.5": version: 4.0.5 resolution: "micromatch@npm:4.0.5" dependencies: @@ -13350,6 +12922,16 @@ __metadata: languageName: node linkType: hard +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": + version: 4.0.7 + resolution: "micromatch@npm:4.0.7" + dependencies: + braces: ^3.0.3 + picomatch: ^2.3.1 + checksum: 3cde047d70ad80cf60c787b77198d680db3b8c25b23feb01de5e2652205d9c19f43bd81882f69a0fd1f0cde6a7a122d774998aad3271ddb1b8accf8a0f480cf7 + languageName: node + linkType: hard + "mime-db@npm:1.52.0, mime-db@npm:^1.28.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" @@ -13428,7 +13010,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:9.0.3, minimatch@npm:^9.0.1": +"minimatch@npm:9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" dependencies: @@ -13455,6 +13037,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.1, minimatch@npm:^9.0.4": + version: 9.0.4 + resolution: "minimatch@npm:9.0.4" + dependencies: + brace-expansion: ^2.0.1 + checksum: cf717f597ec3eed7dabc33153482a2e8d49f4fd3c26e58fd9c71a94c5029a0838728841b93f46bf1263b65a8010e2ee800d0dc9b004ab8ba8b6d1ec07cc115b5 + languageName: node + linkType: hard + "minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -13462,18 +13053,18 @@ __metadata: languageName: node linkType: hard -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + minipass: ^7.0.3 + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 languageName: node linkType: hard "minipass-fetch@npm:^3.0.0": - version: 3.0.4 - resolution: "minipass-fetch@npm:3.0.4" + version: 3.0.5 + resolution: "minipass-fetch@npm:3.0.5" dependencies: encoding: ^0.1.13 minipass: ^7.0.3 @@ -13482,7 +13073,7 @@ __metadata: dependenciesMeta: encoding: optional: true - checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a + checksum: 8047d273236157aab27ab7cd8eab7ea79e6ecd63e8f80c3366ec076cb9a0fed550a6935bab51764369027c414647fd8256c2a20c5445fb250c483de43350de83 languageName: node linkType: hard @@ -13546,10 +13137,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": + version: 7.1.2 + resolution: "minipass@npm:7.1.2" + checksum: 2bfd325b95c555f2b4d2814d49325691c7bee937d753814861b0b49d5edcda55cbbf22b6b6a60bb91eddac8668771f03c5ff647dcd9d0f798e9548b9cdc46ee3 languageName: node linkType: hard @@ -13592,15 +13183,15 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.2.0, mlly@npm:^1.5.0": - version: 1.6.1 - resolution: "mlly@npm:1.6.1" +"mlly@npm:^1.6.1, mlly@npm:^1.7.0": + version: 1.7.0 + resolution: "mlly@npm:1.7.0" dependencies: acorn: ^8.11.3 pathe: ^1.1.2 - pkg-types: ^1.0.3 - ufo: ^1.3.2 - checksum: c40a547dba8f6b2a5a840899d49f4c9550c233d47fd7bd75f4ac27f388047bad655ad86684329809c1640df4373b45bec77304f73530ca4354bc1199700e2a46 + pkg-types: ^1.1.0 + ufo: ^1.5.3 + checksum: c1548f4dd0e31ce15d293ebb7c61778bd28c405573dc43dcf799eaeb8f6b776d7dadd95e957d6631b9cc4bb963cd01079d58b7e2290ed540aa460e061bdbd1fa languageName: node linkType: hard @@ -13614,8 +13205,8 @@ __metadata: linkType: hard "mocha@npm:^10.0.0, mocha@npm:^10.2.0": - version: 10.2.0 - resolution: "mocha@npm:10.2.0" + version: 10.4.0 + resolution: "mocha@npm:10.4.0" dependencies: ansi-colors: 4.1.1 browser-stdout: 1.3.1 @@ -13624,13 +13215,12 @@ __metadata: diff: 5.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 7.2.0 + glob: 8.1.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 @@ -13641,7 +13231,7 @@ __metadata: bin: _mocha: bin/_mocha mocha: bin/mocha.js - checksum: 406c45eab122ffd6ea2003c2f108b2bc35ba036225eee78e0c784b6fa2c7f34e2b13f1dbacef55a4fdf523255d76e4f22d1b5aacda2394bd11666febec17c719 + checksum: 090771d6d42a65a934c7ed448d524bcc663836351af9f0678578caa69943b01a9535a73192d24fd625b3fdb5979cce5834dfe65e3e1ee982444d65e19975b81c languageName: node linkType: hard @@ -13687,7 +13277,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.1.1": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -13724,17 +13314,6 @@ __metadata: languageName: node linkType: hard -"murmur-128@npm:^0.2.1": - version: 0.2.1 - resolution: "murmur-128@npm:0.2.1" - dependencies: - encode-utf8: ^1.0.2 - fmix: ^0.1.0 - imul: ^1.0.0 - checksum: 94ff8b39bf1a1a7bde83b6d13f656bbe591e0a5b5ffe4384c39470120ab70e9eadf0af38557742a30d24421ddc63aea6bba1028a1d6b66553038ee86a660dd92 - languageName: node - linkType: hard - "mute-stream@npm:0.0.8": version: 0.0.8 resolution: "mute-stream@npm:0.0.8" @@ -13753,25 +13332,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:3.3.3": - version: 3.3.3 - resolution: "nanoid@npm:3.3.3" - bin: - nanoid: bin/nanoid.cjs - checksum: ada019402a07464a694553c61d2dca8a4353645a7d92f2830f0d487fedff403678a0bee5323a46522752b2eab95a0bc3da98b6cccaa7c0c55cd9975130e6d6f0 - languageName: node - linkType: hard - -"nanoid@npm:^3.0.2, nanoid@npm:^3.1.20, nanoid@npm:^3.1.23": - version: 3.3.6 - resolution: "nanoid@npm:3.3.6" - bin: - nanoid: bin/nanoid.cjs - checksum: 7d0eda657002738aa5206107bd0580aead6c95c460ef1bdd0b1a87a9c7ae6277ac2e9b945306aaa5b32c6dcb7feaf462d0f552e7f8b5718abfc6ead5c94a71b3 - languageName: node - linkType: hard - -"nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": +"nanoid@npm:^3.0.2, nanoid@npm:^3.1.20, nanoid@npm:^3.1.23, nanoid@npm:^3.3.6, nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" bin: @@ -13826,6 +13387,21 @@ __metadata: languageName: node linkType: hard +"ndjson@npm:2.0.0": + version: 2.0.0 + resolution: "ndjson@npm:2.0.0" + dependencies: + json-stringify-safe: ^5.0.1 + minimist: ^1.2.5 + readable-stream: ^3.6.0 + split2: ^3.0.0 + through2: ^4.0.0 + bin: + ndjson: cli.js + checksum: f847a51a2275b8a6a1bfdb24095183836b71c3085670161678c9922bc59644f04e53ced385e549a5565fdc44c28e206bd3f2199d12525028f843a86b680c4446 + languageName: node + linkType: hard + "negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" @@ -13852,20 +13428,20 @@ __metadata: linkType: hard "next@npm:^14.0.4": - version: 14.1.0 - resolution: "next@npm:14.1.0" - dependencies: - "@next/env": 14.1.0 - "@next/swc-darwin-arm64": 14.1.0 - "@next/swc-darwin-x64": 14.1.0 - "@next/swc-linux-arm64-gnu": 14.1.0 - "@next/swc-linux-arm64-musl": 14.1.0 - "@next/swc-linux-x64-gnu": 14.1.0 - "@next/swc-linux-x64-musl": 14.1.0 - "@next/swc-win32-arm64-msvc": 14.1.0 - "@next/swc-win32-ia32-msvc": 14.1.0 - "@next/swc-win32-x64-msvc": 14.1.0 - "@swc/helpers": 0.5.2 + version: 14.2.3 + resolution: "next@npm:14.2.3" + dependencies: + "@next/env": 14.2.3 + "@next/swc-darwin-arm64": 14.2.3 + "@next/swc-darwin-x64": 14.2.3 + "@next/swc-linux-arm64-gnu": 14.2.3 + "@next/swc-linux-arm64-musl": 14.2.3 + "@next/swc-linux-x64-gnu": 14.2.3 + "@next/swc-linux-x64-musl": 14.2.3 + "@next/swc-win32-arm64-msvc": 14.2.3 + "@next/swc-win32-ia32-msvc": 14.2.3 + "@next/swc-win32-x64-msvc": 14.2.3 + "@swc/helpers": 0.5.5 busboy: 1.6.0 caniuse-lite: ^1.0.30001579 graceful-fs: ^4.2.11 @@ -13873,6 +13449,7 @@ __metadata: styled-jsx: 5.1.1 peerDependencies: "@opentelemetry/api": ^1.1.0 + "@playwright/test": ^1.41.2 react: ^18.2.0 react-dom: ^18.2.0 sass: ^1.3.0 @@ -13898,11 +13475,13 @@ __metadata: peerDependenciesMeta: "@opentelemetry/api": optional: true + "@playwright/test": + optional: true sass: optional: true bin: next: dist/bin/next - checksum: 077fd76a6fe7127a8be3d11035dcefb2c829f304aaa85144e0d1b531a1549b6c9bb99459af1ef0782c1f1110ca08f6f33efd293a2dc51672dd9dc45ede608ecf + checksum: d34ea63adf23fe46efebe2a9c536c9127c0ee006d74c60d6d23aecbef650798c976b27c17910ca585f3bb1223b10924cb429b9ce930f3074aee1170d1519dccc languageName: node linkType: hard @@ -13942,10 +13521,10 @@ __metadata: languageName: node linkType: hard -"node-fetch-native@npm:^1.4.0, node-fetch-native@npm:^1.4.1, node-fetch-native@npm:^1.6.1": - version: 1.6.2 - resolution: "node-fetch-native@npm:1.6.2" - checksum: a6e7b9bf2f671895421441177ebd1d12d2a6f18bc1afc29b8d413f65716faebb6c03adab332eff6392e538da8f40e862c67402bfb8a12c6b54b6a84a1a267377 +"node-fetch-native@npm:^1.6.1, node-fetch-native@npm:^1.6.2, node-fetch-native@npm:^1.6.3": + version: 1.6.4 + resolution: "node-fetch-native@npm:1.6.4" + checksum: 7b159f610e037e8813750096a6616ec6771e9abf868aa6e75e5b790bfc2ba2d92cf2abcce33c18fd01f2e5e5cc72de09c78bd4381e7f8c0887f7de21bd96f045 languageName: node linkType: hard @@ -13998,46 +13577,34 @@ __metadata: languageName: node linkType: hard -"node-gyp-build@npm:^4.2.0": - version: 4.6.1 - resolution: "node-gyp-build@npm:4.6.1" - bin: - node-gyp-build: bin.js - node-gyp-build-optional: optional.js - node-gyp-build-test: build-test.js - checksum: c3676d337b36803bc7792e35bf7fdcda7cdcb7e289b8f9855a5535702a82498eb976842fefcf487258c58005ca32ce3d537fbed91280b04409161dcd7232a882 - languageName: node - linkType: hard - -"node-gyp-build@npm:^4.2.2": - version: 4.8.0 - resolution: "node-gyp-build@npm:4.8.0" +"node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.2.2": + version: 4.8.1 + resolution: "node-gyp-build@npm:4.8.1" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: b82a56f866034b559dd3ed1ad04f55b04ae381b22ec2affe74b488d1582473ca6e7f85fccf52da085812d3de2b0bf23109e752a57709ac7b9963951c710fea40 + checksum: fe6e95da6f4608c1a98655f6bf2fe4e8dd9c877cd13256056a8acaf585cc7f98718823fe9366be11b78c2f332d5a184b00cf07a4af96c9d8fea45f640c019f98 languageName: node linkType: hard "node-gyp@npm:latest": - version: 9.4.0 - resolution: "node-gyp@npm:9.4.0" + version: 10.1.0 + resolution: "node-gyp@npm:10.1.0" dependencies: env-paths: ^2.2.0 exponential-backoff: ^3.1.1 - glob: ^7.1.4 + glob: ^10.3.10 graceful-fs: ^4.2.6 - make-fetch-happen: ^11.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 + make-fetch-happen: ^13.0.0 + nopt: ^7.0.0 + proc-log: ^3.0.0 semver: ^7.3.5 tar: ^6.1.2 - which: ^2.0.2 + which: ^4.0.0 bin: node-gyp: bin/node-gyp.js - checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 + checksum: 72e2ab4b23fc32007a763da94018f58069fc0694bf36115d49a2b195c8831e12cf5dd1e7a3718fa85c06969aedf8fc126722d3b672ec1cb27e06ed33caee3c60 languageName: node linkType: hard @@ -14098,14 +13665,14 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" +"nopt@npm:^7.0.0": + version: 7.2.1 + resolution: "nopt@npm:7.2.1" dependencies: - abbrev: ^1.0.0 + abbrev: ^2.0.0 bin: nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + checksum: 6fa729cc77ce4162cfad8abbc9ba31d4a0ff6850c3af61d59b505653bef4781ec059f8890ecfe93ee8aa0c511093369cca88bfc998101616a2904e715bbbb7c9 languageName: node linkType: hard @@ -14152,11 +13719,11 @@ __metadata: linkType: hard "npm-run-path@npm:^5.1.0": - version: 5.1.0 - resolution: "npm-run-path@npm:5.1.0" + version: 5.3.0 + resolution: "npm-run-path@npm:5.3.0" dependencies: path-key: ^4.0.0 - checksum: dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66 + checksum: ae8e7a89da9594fb9c308f6555c73f618152340dcaae423e5fb3620026fefbec463618a8b761920382d666fa7a2d8d240b6fe320e8a6cdd54dc3687e2b659d25 languageName: node linkType: hard @@ -14172,18 +13739,6 @@ __metadata: languageName: node linkType: hard -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - "nprogress@npm:^0.2.0": version: 0.2.0 resolution: "nprogress@npm:0.2.0" @@ -14229,13 +13784,6 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.9.0": - version: 1.13.0 - resolution: "object-inspect@npm:1.13.0" - checksum: 21353e910a3079466cb44adca71d8bef15bd8b87e518eb68bb33d82c5c70b83193993edce432cc92268f7dd02c4a8ab338663a011844367d0bd0559f6dde1fed - languageName: node - linkType: hard - "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" @@ -14262,59 +13810,59 @@ __metadata: languageName: node linkType: hard -"object.entries@npm:^1.1.6, object.entries@npm:^1.1.7": - version: 1.1.7 - resolution: "object.entries@npm:1.1.7" +"object.entries@npm:^1.1.7, object.entries@npm:^1.1.8": + version: 1.1.8 + resolution: "object.entries@npm:1.1.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: da287d434e7e32989586cd734382364ba826a2527f2bc82e6acbf9f9bfafa35d51018b66ec02543ffdfa2a5ba4af2b6f1ca6e588c65030cb4fd9c67d6ced594c + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: 5314877cb637ef3437a30bba61d9bacdb3ce74bf73ac101518be0633c37840c8cc67407edb341f766e8093b3d7516d5c3358f25adfee4a2c697c0ec4c8491907 languageName: node linkType: hard -"object.fromentries@npm:^2.0.6, object.fromentries@npm:^2.0.7": - version: 2.0.7 - resolution: "object.fromentries@npm:2.0.7" +"object.fromentries@npm:^2.0.7, object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 7341ce246e248b39a431b87a9ddd331ff52a454deb79afebc95609f94b1f8238966cf21f52188f2a353f0fdf83294f32f1ebf1f7826aae915ebad21fd0678065 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + checksum: 29b2207a2db2782d7ced83f93b3ff5d425f901945f3665ffda1821e30a7253cd1fd6b891a64279976098137ddfa883d748787a6fea53ecdb51f8df8b8cec0ae1 languageName: node linkType: hard "object.groupby@npm:^1.0.1": - version: 1.0.2 - resolution: "object.groupby@npm:1.0.2" + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" dependencies: - array.prototype.filter: ^1.0.3 - call-bind: ^1.0.5 + call-bind: ^1.0.7 define-properties: ^1.2.1 - es-abstract: ^1.22.3 - es-errors: ^1.0.0 - checksum: 5f95c2a3a5f60a1a8c05fdd71455110bd3d5e6af0350a20b133d8cd70f9c3385d5c7fceb6a17b940c3c61752d9c202d10d5e2eb5ce73b89002656a87e7bf767a + es-abstract: ^1.23.2 + checksum: 0d30693ca3ace29720bffd20b3130451dca7a56c612e1926c0a1a15e4306061d84410bdb1456be2656c5aca53c81b7a3661eceaa362db1bba6669c2c9b6d1982 languageName: node linkType: hard -"object.hasown@npm:^1.1.2": - version: 1.1.3 - resolution: "object.hasown@npm:1.1.3" +"object.hasown@npm:^1.1.4": + version: 1.1.4 + resolution: "object.hasown@npm:1.1.4" dependencies: - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 76bc17356f6124542fb47e5d0e78d531eafa4bba3fc2d6fc4b1a8ce8b6878912366c0d99f37ce5c84ada8fd79df7aa6ea1214fddf721f43e093ad2df51f27da1 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + checksum: bc46eb5ca22106fcd07aab1411508c2c68b7565fe8fb272f166fb9bf203972e8b5c86a5a4b2c86204beead0626a7a4119d32cefbaf7c5dd57b400bf9e6363cb6 languageName: node linkType: hard -"object.values@npm:^1.1.6, object.values@npm:^1.1.7": - version: 1.1.7 - resolution: "object.values@npm:1.1.7" +"object.values@npm:^1.1.6, object.values@npm:^1.1.7, object.values@npm:^1.2.0": + version: 1.2.0 + resolution: "object.values@npm:1.2.0" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: f3e4ae4f21eb1cc7cebb6ce036d4c67b36e1c750428d7b7623c56a0db90edced63d08af8a316d81dfb7c41a3a5fa81b05b7cc9426e98d7da986b1682460f0777 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: 51fef456c2a544275cb1766897f34ded968b22adfc13ba13b5e4815fdaf4304a90d42a3aee114b1f1ede048a4890381d47a5594d84296f2767c6a0364b9da8fa languageName: node linkType: hard @@ -14326,13 +13874,13 @@ __metadata: linkType: hard "ofetch@npm:^1.3.3": - version: 1.3.3 - resolution: "ofetch@npm:1.3.3" + version: 1.3.4 + resolution: "ofetch@npm:1.3.4" dependencies: - destr: ^2.0.1 - node-fetch-native: ^1.4.0 - ufo: ^1.3.0 - checksum: 945d757b25ba144f9f45d9de3382de743f0950e68e76726a4c0d2ef01456fa6700a6b102cc343a4e06f71d5ac59a8affdd9a673751c448f4265996f7f22ffa3d + destr: ^2.0.3 + node-fetch-native: ^1.6.3 + ufo: ^1.5.3 + checksum: 46749d5bf88cc924657520fa409ece473ee7d70303a374e0acf8a88883576be515861b2342b4e5d491776e2da9c8c52911c3ef298329619ef34832a5a4ffe64c languageName: node linkType: hard @@ -14410,16 +13958,16 @@ __metadata: linkType: hard "optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: - "@aashutoshrathi/word-wrap": ^1.2.3 deep-is: ^0.1.3 fast-levenshtein: ^2.0.6 levn: ^0.4.1 prelude-ls: ^1.2.1 type-check: ^0.4.0 - checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + word-wrap: ^1.2.5 + checksum: ecbd010e3dc73e05d239976422d9ef54a82a13f37c11ca5911dff41c98a6c7f0f163b27f922c37e7f8340af9d36febd3b6e9cef508f3339d4c393d7276d716bb languageName: node linkType: hard @@ -14734,13 +14282,13 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.10.1, path-scurry@npm:^1.6.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" +"path-scurry@npm:^1.10.1, path-scurry@npm:^1.11.1, path-scurry@npm:^1.6.1": + version: 1.11.1 + resolution: "path-scurry@npm:1.11.1" dependencies: - lru-cache: ^9.1.1 || ^10.0.0 + lru-cache: ^10.2.0 minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + checksum: 890d5abcd593a7912dcce7cf7c6bf7a0b5648e3dee6caf0712c126ca0a65c7f3d7b9d769072a4d1baf370f61ce493ab5b038d59988688e0c5f3f646ee3c69023 languageName: node linkType: hard @@ -14774,7 +14322,7 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.0, pathe@npm:^1.1.1, pathe@npm:^1.1.2": +"pathe@npm:^1.1.1, pathe@npm:^1.1.2": version: 1.1.2 resolution: "pathe@npm:1.1.2" checksum: ec5f778d9790e7b9ffc3e4c1df39a5bb1ce94657a4e3ad830c1276491ca9d79f189f47609884671db173400256b005f4955f7952f52a2aeb5834ad5fb4faf134 @@ -14815,13 +14363,20 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:1.0.0, picocolors@npm:^1, picocolors@npm:^1.0.0": +"picocolors@npm:1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 languageName: node linkType: hard +"picocolors@npm:^1, picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": + version: 1.0.1 + resolution: "picocolors@npm:1.0.1" + checksum: fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.0.7, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -14936,14 +14491,14 @@ __metadata: languageName: node linkType: hard -"pkg-types@npm:^1.0.3": - version: 1.0.3 - resolution: "pkg-types@npm:1.0.3" +"pkg-types@npm:^1.1.0": + version: 1.1.1 + resolution: "pkg-types@npm:1.1.1" dependencies: - jsonc-parser: ^3.2.0 - mlly: ^1.2.0 - pathe: ^1.1.0 - checksum: 4b305c834b912ddcc8a0fe77530c0b0321fe340396f84cbb87aecdbc126606f47f2178f23b8639e71a4870f9631c7217aef52ffed0ae17ea2dbbe7e43d116a6e + confbox: ^0.1.7 + mlly: ^1.7.0 + pathe: ^1.1.2 + checksum: 78ee49eea8c03802ffbdc79dfb6a741f905a4053453280cd2f1149850523fdaf46d39ecb88c2c2f757cceb9883f234bb0e56371084b5895632bdb00ef0f7298f languageName: node linkType: hard @@ -14962,9 +14517,9 @@ __metadata: linkType: hard "pony-cause@npm:^2.1.10": - version: 2.1.10 - resolution: "pony-cause@npm:2.1.10" - checksum: 8b61378f213e61056312dc274a1c79980154e9d864f6ad86e0c8b91a50d3ce900d430995ee24147c9f3caa440dfe7d51c274b488d7f033b65b206522536d7217 + version: 2.1.11 + resolution: "pony-cause@npm:2.1.11" + checksum: 4aaa9ddab8f8225b5cbb32f7329a71b73679074579fa91f9e9d6853d398f3c2872de979519e1525c0c91d53afc82c32fddb76e379d19157e69ef1f7064523dfa languageName: node linkType: hard @@ -15029,12 +14584,12 @@ __metadata: linkType: hard "postcss-selector-parser@npm:^6.0.11": - version: 6.0.15 - resolution: "postcss-selector-parser@npm:6.0.15" + version: 6.1.0 + resolution: "postcss-selector-parser@npm:6.1.0" dependencies: cssesc: ^3.0.0 util-deprecate: ^1.0.2 - checksum: 57decb94152111004f15e27b9c61131eb50ee10a3288e7fcf424cebbb4aba82c2817517ae718f8b5d704ee9e02a638d4a2acff8f47685c295a33ecee4fd31055 + checksum: 449f614e6706421be307d8638183c61ba45bc3b460fe3815df8971dbb4d59c4087181940d879daee4a7a2daf3d86e915db1cce0c006dd68ca75b4087079273bd languageName: node linkType: hard @@ -15057,20 +14612,20 @@ __metadata: linkType: hard "postcss@npm:^8.4.16, postcss@npm:^8.4.23": - version: 8.4.35 - resolution: "postcss@npm:8.4.35" + version: 8.4.38 + resolution: "postcss@npm:8.4.38" dependencies: nanoid: ^3.3.7 picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: cf3c3124d3912a507603f6d9a49b3783f741075e9aa73eb592a6dd9194f9edab9d20a8875d16d137d4f779fe7b6fbd1f5727e39bfd1c3003724980ee4995e1da + source-map-js: ^1.2.0 + checksum: 649f9e60a763ca4b5a7bbec446a069edf07f057f6d780a5a0070576b841538d1ecf7dd888f2fbfd1f76200e26c969e405aeeae66332e6927dbdc8bdcb90b9451 languageName: node linkType: hard "preact@npm:^10.12.0, preact@npm:^10.16.0": - version: 10.19.6 - resolution: "preact@npm:10.19.6" - checksum: fe697a4ed6c79ec9997496ec735600744fa14495110da2ea40fa4e22429ad4e116dfe0ed786ab8c5c4fd233a479d1e4ac21ffb6748895ac80d3279c5d187b4c1 + version: 10.22.0 + resolution: "preact@npm:10.22.0" + checksum: 1b7493abec35d5042094d652e5cb980de00a0ef39e130b2f20485214d273ef0cebafa2000aa9fa4ef9dad952bd4e746ad3714f42206f34b817fd3712d0d70bcd languageName: node linkType: hard @@ -15122,7 +14677,7 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^29.7.0": +"pretty-format@npm:^29.0.0, pretty-format@npm:^29.7.0": version: 29.7.0 resolution: "pretty-format@npm:29.7.0" dependencies: @@ -15142,6 +14697,20 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 02b64e1b3919e63df06f836b98d3af002b5cd92655cab18b5746e37374bfb73e03b84fe305454614b34c25b485cc687a9eebdccf0242cda8fda2475dd2c97e02 + languageName: node + linkType: hard + +"proc-log@npm:^4.2.0": + version: 4.2.0 + resolution: "proc-log@npm:4.2.0" + checksum: 98f6cd012d54b5334144c5255ecb941ee171744f45fca8b43b58ae5a0c1af07352475f481cadd9848e7f0250376ee584f6aa0951a856ff8f021bdfbff4eb33fc + languageName: node + linkType: hard + "process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -15182,7 +14751,7 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.0.1": +"prompts@npm:^2.0.1, prompts@npm:^2.4.2": version: 2.4.2 resolution: "prompts@npm:2.4.2" dependencies: @@ -15290,20 +14859,20 @@ __metadata: linkType: hard "punycode@npm:^2.1.0, punycode@npm:^2.1.1": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 languageName: node linkType: hard "pure-rand@npm:^6.0.0": - version: 6.0.4 - resolution: "pure-rand@npm:6.0.4" - checksum: e1c4e69f8bf7303e5252756d67c3c7551385cd34d94a1f511fe099727ccbab74c898c03a06d4c4a24a89b51858781057b83ebbfe740d984240cdc04fead36068 + version: 6.1.0 + resolution: "pure-rand@npm:6.1.0" + checksum: 8d53bc02bed99eca0b65b505090152ee7e9bd67dd74f8ff32ba1c883b87234067c5bf68d2614759fb217d82594d7a92919e6df80f97885e7b12b42af4bd3316a languageName: node linkType: hard -"pvtsutils@npm:^1.3.2": +"pvtsutils@npm:^1.3.2, pvtsutils@npm:^1.3.5": version: 1.3.5 resolution: "pvtsutils@npm:1.3.5" dependencies: @@ -15342,12 +14911,12 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.4.0, qs@npm:^6.9.4": - version: 6.11.2 - resolution: "qs@npm:6.11.2" +"qs@npm:^6.4.0": + version: 6.12.1 + resolution: "qs@npm:6.12.1" dependencies: - side-channel: ^1.0.4 - checksum: e812f3c590b2262548647d62f1637b6989cc56656dc960b893fe2098d96e1bd633f36576f4cd7564dfbff9db42e17775884db96d846bebe4f37420d073ecdc0b + side-channel: ^1.0.6 + checksum: aa761d99e65b6936ba2dd2187f2d9976afbcda38deb3ff1b3fe331d09b0c578ed79ca2abdde1271164b5be619c521ec7db9b34c23f49a074e5921372d16242d5 languageName: node linkType: hard @@ -15397,9 +14966,9 @@ __metadata: linkType: hard "radix3@npm:^1.1.0": - version: 1.1.0 - resolution: "radix3@npm:1.1.0" - checksum: e5e6ed8fcf68be4d124bca4f7da7ba0fc7c5b6f9e98bc3f4424459c45d50f1f92506c5f7f8421b5cfee5823c524a4a2cef416053e88845813ce9fc9c7086729a + version: 1.1.2 + resolution: "radix3@npm:1.1.2" + checksum: c4d49a3f603b5b7b7704dd907383c8884d12064d6d475f7ca8b05ecc7604d3bd73524b55e0fbcca0f7c9da3a2e9b473a6b4fbc0b639c29c2b0e85020ebda67d3 languageName: node linkType: hard @@ -15472,14 +15041,14 @@ __metadata: linkType: hard "react-dom@npm:^18.2.0": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" dependencies: loose-envify: ^1.1.0 - scheduler: ^0.23.0 + scheduler: ^0.23.2 peerDependencies: - react: ^18.2.0 - checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc + react: ^18.3.1 + checksum: 298954ecd8f78288dcaece05e88b570014d8f6dce5db6f66e6ee91448debeb59dcd31561dddb354eee47e6c1bb234669459060deb238ed0213497146e555a0b9 languageName: node linkType: hard @@ -15503,9 +15072,9 @@ __metadata: linkType: hard "react-is@npm:^18.0.0": - version: 18.2.0 - resolution: "react-is@npm:18.2.0" - checksum: e72d0ba81b5922759e4aff17e0252bd29988f9642ed817f56b25a3e217e13eea8a7f2322af99a06edb779da12d5d636e9fda473d620df9a3da0df2a74141d53e + version: 18.3.1 + resolution: "react-is@npm:18.3.1" + checksum: e20fe84c86ff172fc8d898251b7cc2c43645d108bf96d0b8edf39b98f9a2cae97b40520ee7ed8ee0085ccc94736c4886294456033304151c3f94978cec03df21 languageName: node linkType: hard @@ -15519,8 +15088,8 @@ __metadata: linkType: hard "react-remove-scroll-bar@npm:^2.3.4": - version: 2.3.5 - resolution: "react-remove-scroll-bar@npm:2.3.5" + version: 2.3.6 + resolution: "react-remove-scroll-bar@npm:2.3.6" dependencies: react-style-singleton: ^2.2.1 tslib: ^2.0.0 @@ -15530,7 +15099,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 0b6eee6d338085f0c766dc6d780100041a39377bc1a2a1b99a13444832b91885fc632b7521636a29d26710cf8bb0f9f4177123abe088a358597ac0f0e8e42f45 + checksum: e793fe110e2ea60d5724d0b60f09de1f6cd1b080df00df9e68bb9a1b985895830e703194647059fdc22402a67a89b7673a5260773b89bcd98031fd99bc91aefa languageName: node linkType: hard @@ -15571,11 +15140,11 @@ __metadata: linkType: hard "react@npm:^18.2.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" + version: 18.3.1 + resolution: "react@npm:18.3.1" dependencies: loose-envify: ^1.1.0 - checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b + checksum: a27bcfa8ff7c15a1e50244ad0d0c1cb2ad4375eeffefd266a64889beea6f6b64c4966c9b37d14ee32d6c9fcd5aa6ba183b6988167ab4d127d13e7cb5b386a376 languageName: node linkType: hard @@ -15588,22 +15157,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.0, readable-stream@npm:^2.3.5": - version: 2.3.8 - resolution: "readable-stream@npm: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 - checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 - languageName: node - linkType: hard - -"readable-stream@npm:^3.1.1, readable-stream@npm:^3.6.0": +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.1.1, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -15614,6 +15168,21 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.0, readable-stream@npm:^2.3.5": + version: 2.3.8 + resolution: "readable-stream@npm: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 + checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 + languageName: node + linkType: hard + "readable-stream@npm:~1.0.26-4": version: 1.0.34 resolution: "readable-stream@npm:1.0.34" @@ -15687,22 +15256,6 @@ __metadata: languageName: node linkType: hard -"redis-errors@npm:^1.0.0, redis-errors@npm:^1.2.0": - version: 1.2.0 - resolution: "redis-errors@npm:1.2.0" - checksum: f28ac2692113f6f9c222670735aa58aeae413464fd58ccf3fce3f700cae7262606300840c802c64f2b53f19f65993da24dc918afc277e9e33ac1ff09edb394f4 - languageName: node - linkType: hard - -"redis-parser@npm:^3.0.0": - version: 3.0.0 - resolution: "redis-parser@npm:3.0.0" - dependencies: - redis-errors: ^1.0.0 - checksum: 89290ae530332f2ae37577647fa18208d10308a1a6ba750b9d9a093e7398f5e5253f19855b64c98757f7129cccce958e4af2573fdc33bad41405f87f1943459a - languageName: node - linkType: hard - "reduce-flatten@npm:^2.0.0": version: 2.0.0 resolution: "reduce-flatten@npm:2.0.0" @@ -15711,17 +15264,17 @@ __metadata: linkType: hard "reflect.getprototypeof@npm:^1.0.4": - version: 1.0.5 - resolution: "reflect.getprototypeof@npm:1.0.5" + version: 1.0.6 + resolution: "reflect.getprototypeof@npm:1.0.6" dependencies: - call-bind: ^1.0.5 + call-bind: ^1.0.7 define-properties: ^1.2.1 - es-abstract: ^1.22.3 - es-errors: ^1.0.0 - get-intrinsic: ^1.2.3 + es-abstract: ^1.23.1 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 globalthis: ^1.0.3 which-builtin-type: ^1.1.3 - checksum: c7176be030b89b9e55882f4da3288de5ffd187c528d79870e27d2c8a713a82b3fa058ca2d0c9da25f6d61240e2685c42d7daa32cdf3d431d8207ee1b9ed30993 + checksum: 88e9e65a7eaa0bf8e9a8bbf8ac07571363bc333ba8b6769ed5e013e0042ed7c385e97fae9049510b3b5fe4b42472d8f32de9ce8ce84902bc4297d4bbe3777dba languageName: node linkType: hard @@ -15732,7 +15285,7 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.2": +"regexp.prototype.flags@npm:^1.5.2": version: 1.5.2 resolution: "regexp.prototype.flags@npm:1.5.2" dependencies: @@ -15884,7 +15437,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^2.0.0-next.4": +"resolve@npm:^2.0.0-next.5": version: 2.0.0-next.5 resolution: "resolve@npm:2.0.0-next.5" dependencies: @@ -15926,7 +15479,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^2.0.0-next.4#~builtin": +"resolve@patch:resolve@^2.0.0-next.5#~builtin": version: 2.0.0-next.5 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#~builtin::version=2.0.0-next.5&hash=07638b" dependencies: @@ -15981,9 +15534,9 @@ __metadata: linkType: hard "rfdc@npm:^1.3.0": - version: 1.3.0 - resolution: "rfdc@npm:1.3.0" - checksum: fb2ba8512e43519983b4c61bd3fa77c0f410eff6bae68b08614437bc3f35f91362215f7b4a73cbda6f67330b5746ce07db5dd9850ad3edc91271ad6deea0df32 + version: 1.3.1 + resolution: "rfdc@npm:1.3.1" + checksum: d5d1e930aeac7e0e0a485f97db1356e388bdbeff34906d206fe524dd5ada76e95f186944d2e68307183fdc39a54928d4426bbb6734851692cfe9195efba58b79 languageName: node linkType: hard @@ -15998,7 +15551,7 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": +"rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: @@ -16039,31 +15592,15 @@ __metadata: languageName: node linkType: hard -"rust-verkle-wasm@npm:^0.0.1": - version: 0.0.1 - resolution: "rust-verkle-wasm@npm:0.0.1" - checksum: 24258e935d50b69d25d25d958ba4515b01470458ed7c42466cbc657104e826173827b838501eea1b94c71fd6c01fccd04829f0cc85cbad5d5c5d968c6d6df59e - languageName: node - linkType: hard - -"rustbn-wasm@npm:^0.2.0": - version: 0.2.0 - resolution: "rustbn-wasm@npm:0.2.0" - dependencies: - "@scure/base": ^1.1.1 - checksum: 9cf89ce88a9d161bce8ea2516b3037fe97e1debb2e9b86d6f3cd133e2c120c844644d37c61c27ae00475e49595a397e61559431875a61c5c52a04c40ba658872 - languageName: node - linkType: hard - -"safe-array-concat@npm:^1.1.0": - version: 1.1.0 - resolution: "safe-array-concat@npm:1.1.0" +"safe-array-concat@npm:^1.1.2": + version: 1.1.2 + resolution: "safe-array-concat@npm:1.1.2" dependencies: - call-bind: ^1.0.5 - get-intrinsic: ^1.2.2 + call-bind: ^1.0.7 + get-intrinsic: ^1.2.4 has-symbols: ^1.0.3 isarray: ^2.0.5 - checksum: 5c71eaa999168ee7474929f1cd3aae80f486353a651a094d9968936692cf90aa065224929a6486dcda66334a27dce4250a83612f9e0fef6dced1a925d3ac7296 + checksum: a3b259694754ddfb73ae0663829e396977b99ff21cbe8607f35a469655656da8e271753497e59da8a7575baa94d2e684bea3e10ddd74ba046c0c9b4418ffa0c4 languageName: node linkType: hard @@ -16130,12 +15667,12 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" dependencies: loose-envify: ^1.1.0 - checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a + checksum: 3e82d1f419e240ef6219d794ff29c7ee415fbdc19e038f680a10c067108e06284f1847450a210b29bbaf97b9d8a97ced5f624c31c681248ac84c80d56ad5a2c4 languageName: node linkType: hard @@ -16221,25 +15758,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 - languageName: node - linkType: hard - -"semver@npm:^7.3.8, semver@npm:^7.5.3": - version: 7.6.0 - resolution: "semver@npm:7.6.0" - dependencies: - lru-cache: ^6.0.0 +"semver@npm:^7.0.0, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4": + version: 7.6.2 + resolution: "semver@npm:7.6.2" bin: semver: bin/semver.js - checksum: 7427f05b70786c696640edc29fdd4bc33b2acf3bbe1740b955029044f80575fc664e1a512e4113c3af21e767154a94b4aa214bf6cd6e42a1f6dba5914e0b208c + checksum: 40f6a95101e8d854357a644da1b8dd9d93ce786d5c6a77227bc69dbb17bea83d0d1d1d7c4cd5920a6df909f48e8bd8a5909869535007f90278289f2451d0292d languageName: node linkType: hard @@ -16260,20 +15784,20 @@ __metadata: linkType: hard "set-function-length@npm:^1.2.1": - version: 1.2.1 - resolution: "set-function-length@npm:1.2.1" + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" dependencies: - define-data-property: ^1.1.2 + define-data-property: ^1.1.4 es-errors: ^1.3.0 function-bind: ^1.1.2 - get-intrinsic: ^1.2.3 + get-intrinsic: ^1.2.4 gopd: ^1.0.1 - has-property-descriptors: ^1.0.1 - checksum: 23742476d695f2eae86348c069bd164d4f25fa7c26546a46a2b5f370f1f84b98ec64366d2cd17785d5b41bbf16b95855da4b7eb188e7056fe3b0248d61f6afda + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 languageName: node linkType: hard -"set-function-name@npm:^2.0.0, set-function-name@npm:^2.0.1": +"set-function-name@npm:^2.0.1, set-function-name@npm:^2.0.2": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" dependencies: @@ -16373,14 +15897,15 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" +"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + call-bind: ^1.0.7 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + object-inspect: ^1.13.1 + checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 languageName: node linkType: hard @@ -16447,24 +15972,24 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" +"socks-proxy-agent@npm:^8.0.3": + version: 8.0.3 + resolution: "socks-proxy-agent@npm:8.0.3" dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + agent-base: ^7.1.1 + debug: ^4.3.4 + socks: ^2.7.1 + checksum: 8fab38821c327c190c28f1658087bc520eb065d55bc07b4a0fdf8d1e0e7ad5d115abbb22a95f94f944723ea969dd771ad6416b1e3cde9060c4c71f705c8b85c5 languageName: node linkType: hard -"socks@npm:^2.6.2": - version: 2.7.1 - resolution: "socks@npm:2.7.1" +"socks@npm:^2.7.1": + version: 2.8.3 + resolution: "socks@npm:2.8.3" dependencies: - ip: ^2.0.0 + ip-address: ^9.0.5 smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + checksum: 7a6b7f6eedf7482b9e4597d9a20e09505824208006ea8f2c49b71657427f3c137ca2ae662089baa73e1971c62322d535d9d0cf1c9235cf6f55e315c18203eadd languageName: node linkType: hard @@ -16487,9 +16012,9 @@ __metadata: languageName: node linkType: hard -"solidity-coverage@npm:^0.8.5": - version: 0.8.8 - resolution: "solidity-coverage@npm:0.8.8" +"solidity-coverage@npm:^0.8.1": + version: 0.8.12 + resolution: "solidity-coverage@npm:0.8.12" dependencies: "@ethersproject/abi": ^5.0.9 "@solidity-parser/parser": ^0.18.0 @@ -16501,7 +16026,7 @@ __metadata: global-modules: ^2.0.0 globby: ^10.0.1 jsonschema: ^1.2.4 - lodash: ^4.17.15 + lodash: ^4.17.21 mocha: ^10.2.0 node-emoji: ^1.10.0 pify: ^4.0.1 @@ -16514,7 +16039,7 @@ __metadata: hardhat: ^2.11.0 bin: solidity-coverage: plugins/bin.js - checksum: 81faf2614e32a8759fda0bcb5b64d2ef9475d4e9b8fd956e0b50fc17c603ce0a14ceaf3a46a69199534a2040bec0a58827eab36d6b02e896908cdd53c9a10d7c + checksum: 8839416986fc76d27931dca885d915717fea3d7bae3cd2506f315f8b0583b50e05bd25a0d481262ad6cf2786966f603b6481b1658810e4add5761ce96cf5ffe4 languageName: node linkType: hard @@ -16545,10 +16070,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c +"source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.0": + version: 1.2.0 + resolution: "source-map-js@npm:1.2.0" + checksum: 791a43306d9223792e84293b00458bf102a8946e7188f3db0e4e22d8d530b5f80a4ce468eb5ec0bf585443ad55ebbd630bf379c98db0b1f317fd902500217f97 languageName: node linkType: hard @@ -16618,6 +16143,15 @@ __metadata: languageName: node linkType: hard +"split2@npm:^3.0.0": + version: 3.2.2 + resolution: "split2@npm:3.2.2" + dependencies: + readable-stream: ^3.0.0 + checksum: 8127ddbedd0faf31f232c0e9192fede469913aa8982aa380752e0463b2e31c2359ef6962eb2d24c125bac59eeec76873678d723b1c7ff696216a1cd071e3994a + languageName: node + linkType: hard + "split2@npm:^4.0.0": version: 4.2.0 resolution: "split2@npm:4.2.0" @@ -16625,6 +16159,13 @@ __metadata: languageName: node linkType: hard +"sprintf-js@npm:^1.1.3": + version: 1.1.3 + resolution: "sprintf-js@npm:1.1.3" + checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 + languageName: node + linkType: hard + "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -16633,8 +16174,8 @@ __metadata: linkType: hard "sshpk@npm:^1.7.0": - version: 1.17.0 - resolution: "sshpk@npm:1.17.0" + version: 1.18.0 + resolution: "sshpk@npm:1.18.0" dependencies: asn1: ~0.2.3 assert-plus: ^1.0.0 @@ -16649,16 +16190,16 @@ __metadata: sshpk-conv: bin/sshpk-conv sshpk-sign: bin/sshpk-sign sshpk-verify: bin/sshpk-verify - checksum: ba109f65c8e6c35133b8e6ed5576abeff8aa8d614824b7275ec3ca308f081fef483607c28d97780c1e235818b0f93ed8c8b56d0a5968d5a23fd6af57718c7597 + checksum: 01d43374eee3a7e37b3b82fdbecd5518cbb2e47ccbed27d2ae30f9753f22bd6ffad31225cb8ef013bc3fb7785e686cea619203ee1439a228f965558c367c3cfa languageName: node linkType: hard "ssri@npm:^10.0.0": - version: 10.0.5 - resolution: "ssri@npm:10.0.5" + version: 10.0.6 + resolution: "ssri@npm:10.0.6" dependencies: minipass: ^7.0.3 - checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 + checksum: 4603d53a05bcd44188747d38f1cc43833b9951b5a1ee43ba50535bdfc5fe4a0897472dbe69837570a5417c3c073377ef4f8c1a272683b401857f72738ee57299 languageName: node linkType: hard @@ -16680,13 +16221,6 @@ __metadata: languageName: node linkType: hard -"standard-as-callback@npm:^2.1.0": - version: 2.1.0 - resolution: "standard-as-callback@npm:2.1.0" - checksum: 88bec83ee220687c72d94fd86a98d5272c91d37ec64b66d830dbc0d79b62bfa6e47f53b71646011835fc9ce7fae62739545d13124262b53be4fbb3e2ebad551c - languageName: node - linkType: hard - "stat-mode@npm:0.3.0": version: 0.3.0 resolution: "stat-mode@npm:0.3.0" @@ -16715,7 +16249,7 @@ __metadata: languageName: node linkType: hard -"stream-shift@npm:^1.0.0": +"stream-shift@npm:^1.0.2": version: 1.0.3 resolution: "stream-shift@npm:1.0.3" checksum: a24c0a3f66a8f9024bd1d579a533a53be283b4475d4e6b4b3211b964031447bdf6532dd1f3c2b0ad66752554391b7c62bd7ca4559193381f766534e723d50242 @@ -16821,53 +16355,57 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.8": - version: 4.0.10 - resolution: "string.prototype.matchall@npm:4.0.10" +"string.prototype.matchall@npm:^4.0.11": + version: 4.0.11 + resolution: "string.prototype.matchall@npm:4.0.11" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.4 + gopd: ^1.0.1 has-symbols: ^1.0.3 - internal-slot: ^1.0.5 - regexp.prototype.flags: ^1.5.0 - set-function-name: ^2.0.0 - side-channel: ^1.0.4 - checksum: 3c78bdeff39360c8e435d7c4c6ea19f454aa7a63eda95fa6fadc3a5b984446a2f9f2c02d5c94171ce22268a573524263fbd0c8edbe3ce2e9890d7cc036cdc3ed + internal-slot: ^1.0.7 + regexp.prototype.flags: ^1.5.2 + set-function-name: ^2.0.2 + side-channel: ^1.0.6 + checksum: 6ac6566ed065c0c8489c91156078ca077db8ff64d683fda97ae652d00c52dfa5f39aaab0a710d8243031a857fd2c7c511e38b45524796764d25472d10d7075ae languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.8": - version: 1.2.8 - resolution: "string.prototype.trim@npm:1.2.8" +"string.prototype.trim@npm:^1.2.9": + version: 1.2.9 + resolution: "string.prototype.trim@npm:1.2.9" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 49eb1a862a53aba73c3fb6c2a53f5463173cb1f4512374b623bcd6b43ad49dd559a06fb5789bdec771a40fc4d2a564411c0a75d35fb27e76bbe738c211ecff07 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.0 + es-object-atoms: ^1.0.0 + checksum: ea2df6ec1e914c9d4e2dc856fa08228e8b1be59b59e50b17578c94a66a176888f417264bb763d4aac638ad3b3dad56e7a03d9317086a178078d131aa293ba193 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimend@npm:1.0.7" +"string.prototype.trimend@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimend@npm:1.0.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 2375516272fd1ba75992f4c4aa88a7b5f3c7a9ca308d963bcd5645adf689eba6f8a04ebab80c33e30ec0aefc6554181a3a8416015c38da0aa118e60ec896310c + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: cc3bd2de08d8968a28787deba9a3cb3f17ca5f9f770c91e7e8fa3e7d47f079bad70fadce16f05dda9f261788be2c6e84a942f618c3bed31e42abc5c1084f8dfd languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimstart@npm:1.0.7" +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 13d0c2cb0d5ff9e926fa0bec559158b062eed2b68cd5be777ffba782c96b2b492944e47057274e064549b94dd27cf81f48b27a31fee8af5b574cff253e7eb613 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: df1007a7f580a49d692375d996521dc14fd103acda7f3034b3c558a60b82beeed3a64fa91e494e164581793a8ab0ae2f59578a49896a7af6583c1f20472bce96 languageName: node linkType: hard @@ -17027,9 +16565,9 @@ __metadata: linkType: hard "superstruct@npm:^1.0.3": - version: 1.0.3 - resolution: "superstruct@npm:1.0.3" - checksum: 761790bb111e6e21ddd608299c252f3be35df543263a7ebbc004e840d01fcf8046794c274bcb351bdf3eae4600f79d317d085cdbb19ca05803a4361840cc9bb1 + version: 1.0.4 + resolution: "superstruct@npm:1.0.4" + checksum: 2e070994cc4998a753c3f0215449d6de01ffb8180e4f46527f559ffbc2ebcc40fcf428f545ccd355921ef2920db7d138a96258ae35c788e6c24b2aa8bb1695cb languageName: node linkType: hard @@ -17126,21 +16664,21 @@ __metadata: linkType: hard "table@npm:^6.8.0": - version: 6.8.1 - resolution: "table@npm:6.8.1" + version: 6.8.2 + resolution: "table@npm:6.8.2" 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 - checksum: 08249c7046125d9d0a944a6e96cfe9ec66908d6b8a9db125531be6eb05fa0de047fd5542e9d43b4f987057f00a093b276b8d3e19af162a9c40db2681058fd306 + checksum: 61188652f53a980d1759ca460ca8dea5c5322aece3210457e7084882f053c2b6a870041295e08a82cb1d676e31b056406845d94b0abf3c79a4b104777bec413b languageName: node linkType: hard "tailwindcss@npm:^3.3.3": - version: 3.4.1 - resolution: "tailwindcss@npm:3.4.1" + version: 3.4.3 + resolution: "tailwindcss@npm:3.4.3" dependencies: "@alloc/quick-lru": ^5.2.0 arg: ^5.0.2 @@ -17150,7 +16688,7 @@ __metadata: fast-glob: ^3.3.0 glob-parent: ^6.0.2 is-glob: ^4.0.3 - jiti: ^1.19.1 + jiti: ^1.21.0 lilconfig: ^2.1.0 micromatch: ^4.0.5 normalize-path: ^3.0.0 @@ -17167,7 +16705,7 @@ __metadata: bin: tailwind: lib/cli.js tailwindcss: lib/cli.js - checksum: ef5a587dd32bb4e91e1549ead6162f85f0b78d3e6ffd8b4e8eeb15585b7b886cb3af6ae9df5092ed8ccb7e590608d1b3eec79ca08c862b07cd9ff7e72f73104b + checksum: 7d181a6aafb520c5760d23d0a199444a324dfa36538edd31934daa253ed9a7ac4bde18c4205aaa89c1269bc2ff11781efda04d2e27ded535a9a2547667a344b1 languageName: node linkType: hard @@ -17221,8 +16759,8 @@ __metadata: linkType: hard "tar@npm:^6.1.0, tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.0 - resolution: "tar@npm:6.2.0" + version: 6.2.1 + resolution: "tar@npm:6.2.1" dependencies: chownr: ^2.0.0 fs-minipass: ^2.0.0 @@ -17230,7 +16768,7 @@ __metadata: minizlib: ^2.1.1 mkdirp: ^1.0.3 yallist: ^4.0.0 - checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c + checksum: f1322768c9741a25356c11373bce918483f40fa9a25c69c59410c8a1247632487edef5fe76c5f12ac51a6356d2f1829e96d2bc34098668a2fc34d76050ac2b6c languageName: node linkType: hard @@ -17332,6 +16870,15 @@ __metadata: languageName: node linkType: hard +"through2@npm:^4.0.0": + version: 4.0.2 + resolution: "through2@npm:4.0.2" + dependencies: + readable-stream: 3 + checksum: ac7430bd54ccb7920fd094b1c7ff3e1ad6edd94202e5528331253e5fde0cc56ceaa690e8df9895de2e073148c52dfbe6c4db74cacae812477a35660090960cc0 + languageName: node + linkType: hard + "through@npm:>=2.2.7 <3, through@npm:^2.3.8": version: 2.3.8 resolution: "through@npm:2.3.8" @@ -17399,11 +16946,9 @@ __metadata: linkType: hard "tmp@npm:^0.2.0": - version: 0.2.1 - resolution: "tmp@npm:0.2.1" - dependencies: - rimraf: ^3.0.0 - checksum: 8b1214654182575124498c87ca986ac53dc76ff36e8f0e0b67139a8d221eaecfdec108c0e6ec54d76f49f1f72ab9325500b246f562b926f85bcdfca8bf35df9e + version: 0.2.3 + resolution: "tmp@npm:0.2.3" + checksum: 73b5c96b6e52da7e104d9d44afb5d106bb1e16d9fa7d00dbeb9e6522e61b571fbdb165c756c62164be9a3bbe192b9b268c236d370a2a0955c7689cd2ae377b95 languageName: node linkType: hard @@ -17501,11 +17046,11 @@ __metadata: linkType: hard "ts-api-utils@npm:^1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" + version: 1.3.0 + resolution: "ts-api-utils@npm:1.3.0" peerDependencies: typescript: ">=4.2.0" - checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 + checksum: c746ddabfdffbf16cb0b0db32bb287236a19e583057f8649ee7c49995bb776e1d3ef384685181c11a1a480369e022ca97512cb08c517b2d2bd82c83754c97012 languageName: node linkType: hard @@ -17539,6 +17084,42 @@ __metadata: languageName: node linkType: hard +"ts-jest@npm:^29.1.2": + version: 29.1.4 + resolution: "ts-jest@npm:29.1.4" + dependencies: + bs-logger: 0.x + fast-json-stable-stringify: 2.x + jest-util: ^29.0.0 + json5: ^2.2.3 + lodash.memoize: 4.x + make-error: 1.x + semver: ^7.5.3 + yargs-parser: ^21.0.1 + peerDependencies: + "@babel/core": ">=7.0.0-beta.0 <8" + "@jest/transform": ^29.0.0 + "@jest/types": ^29.0.0 + babel-jest: ^29.0.0 + jest: ^29.0.0 + typescript: ">=4.3 <6" + peerDependenciesMeta: + "@babel/core": + optional: true + "@jest/transform": + optional: true + "@jest/types": + optional: true + babel-jest: + optional: true + esbuild: + optional: true + bin: + ts-jest: cli.js + checksum: e36cba389adbb3700b46422e883c8d25e76febcc01c4a39c801ef15e6edbd6da1695bdd144100153e992f98a754aea4099906955b1b9a83c3c72d77009c3d7e2 + languageName: node + linkType: hard + "ts-morph@npm:12.0.0": version: 12.0.0 resolution: "ts-morph@npm:12.0.0" @@ -17549,7 +17130,7 @@ __metadata: languageName: node linkType: hard -"ts-node@npm:10.9.1, ts-node@npm:^10.9.1": +"ts-node@npm:10.9.1": version: 10.9.1 resolution: "ts-node@npm:10.9.1" dependencies: @@ -17587,6 +17168,44 @@ __metadata: languageName: node linkType: hard +"ts-node@npm:^10.9.1, ts-node@npm:^10.9.2": + version: 10.9.2 + resolution: "ts-node@npm:10.9.2" + 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 + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + bin: + ts-node: dist/bin.js + ts-node-cwd: dist/bin-cwd.js + ts-node-esm: dist/bin-esm.js + ts-node-script: dist/bin-script.js + ts-node-transpile-only: dist/bin-transpile.js + ts-script: dist/bin-script-deprecated.js + checksum: fde256c9073969e234526e2cfead42591b9a2aec5222bac154b0de2fa9e4ceb30efcd717ee8bc785a56f3a119bdd5aa27b333d9dbec94ed254bd26f8944c67ac + languageName: node + linkType: hard + "ts-toolbelt@npm:^6.15.5": version: 6.15.5 resolution: "ts-toolbelt@npm:6.15.5" @@ -17620,7 +17239,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.1": +"tslib@npm:^2.0.0, tslib@npm:^2.1.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.5.0, tslib@npm:^2.6.1, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad @@ -17729,13 +17348,13 @@ __metadata: linkType: hard "type-fest@npm:^4.6.0": - version: 4.10.3 - resolution: "type-fest@npm:4.10.3" - checksum: 37d265d584a6587253fe4ab2ed25ef787bb0650fe1924319f68ac3197bfaf3142b304a72d6499d61b60c38c9aba7e1e8f5e940df0898c974a8e6c4a37339b64e + version: 4.18.3 + resolution: "type-fest@npm:4.18.3" + checksum: 85c258c8a64011a797366bfb442d6d36ec74318ec3ab7c3d65ec156beeac5bcfeae742e8d3bb1bc1df478885388850d1812b30fcee72c14512c74e193dc3bf71 languageName: node linkType: hard -"typechain@npm:^8.1.0": +"typechain@npm:^8.3.0": version: 8.3.2 resolution: "typechain@npm:8.3.2" dependencies: @@ -17757,7 +17376,7 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.1": +"typed-array-buffer@npm:^1.0.2": version: 1.0.2 resolution: "typed-array-buffer@npm:1.0.2" dependencies: @@ -17768,7 +17387,7 @@ __metadata: languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.0": +"typed-array-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "typed-array-byte-length@npm:1.0.1" dependencies: @@ -17781,7 +17400,7 @@ __metadata: languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.0": +"typed-array-byte-offset@npm:^1.0.2": version: 1.0.2 resolution: "typed-array-byte-offset@npm:1.0.2" dependencies: @@ -17795,9 +17414,9 @@ __metadata: languageName: node linkType: hard -"typed-array-length@npm:^1.0.4": - version: 1.0.5 - resolution: "typed-array-length@npm:1.0.5" +"typed-array-length@npm:^1.0.6": + version: 1.0.6 + resolution: "typed-array-length@npm:1.0.6" dependencies: call-bind: ^1.0.7 for-each: ^0.3.3 @@ -17805,7 +17424,7 @@ __metadata: has-proto: ^1.0.3 is-typed-array: ^1.1.13 possible-typed-array-names: ^1.0.0 - checksum: 82f5b666155cff1b345a1f3ab018d3f7667990f525435e4c8448cc094ab0f8ea283bb7cbde4d7bc82ea0b9b1072523bf31e86620d72615951d7fa9ccb4f42dfa + checksum: f0315e5b8f0168c29d390ff410ad13e4d511c78e6006df4a104576844812ee447fcc32daab1f3a76c9ef4f64eff808e134528b5b2439de335586b392e9750e5c languageName: node linkType: hard @@ -17835,23 +17454,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.0.4": - version: 5.2.2 - resolution: "typescript@npm:5.2.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c - languageName: node - linkType: hard - -"typescript@npm:^5.1.6": - version: 5.3.3 - resolution: "typescript@npm:5.3.3" +"typescript@npm:^5.0.4, typescript@npm:^5.1.6, typescript@npm:^5.4.5": + version: 5.4.5 + resolution: "typescript@npm:5.4.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 2007ccb6e51bbbf6fde0a78099efe04dc1c3dfbdff04ca3b6a8bc717991862b39fd6126c0c3ebf2d2d98ac5e960bcaa873826bb2bb241f14277034148f41f6a2 + checksum: 53c879c6fa1e3bcb194b274d4501ba1985894b2c2692fa079db03c5a5a7140587a1e04e1ba03184605d35f439b40192d9e138eb3279ca8eee313c081c8bcd9b0 languageName: node linkType: hard @@ -17865,23 +17474,13 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@^5.0.4#~builtin": - version: 5.2.2 - resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=a1c5e5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 07106822b4305de3f22835cbba949a2b35451cad50888759b6818421290ff95d522b38ef7919e70fb381c5fe9c1c643d7dea22c8b31652a717ddbd57b7f4d554 - languageName: node - linkType: hard - -"typescript@patch:typescript@^5.1.6#~builtin": - version: 5.3.3 - resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=a1c5e5" +"typescript@patch:typescript@^5.0.4#~builtin, typescript@patch:typescript@^5.1.6#~builtin, typescript@patch:typescript@^5.4.5#~builtin": + version: 5.4.5 + resolution: "typescript@patch:typescript@npm%3A5.4.5#~builtin::version=5.4.5&hash=a1c5e5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: f61375590b3162599f0f0d5b8737877ac0a7bc52761dbb585d67e7b8753a3a4c42d9a554c4cc929f591ffcf3a2b0602f65ae3ce74714fd5652623a816862b610 + checksum: 2373c693f3b328f3b2387c3efafe6d257b057a142f9a79291854b14ff4d5367d3d730810aee981726b677ae0fd8329b23309da3b6aaab8263dbdccf1da07a3ba languageName: node linkType: hard @@ -17900,16 +17499,16 @@ __metadata: linkType: hard "ua-parser-js@npm:^1.0.37": - version: 1.0.37 - resolution: "ua-parser-js@npm:1.0.37" - checksum: 4d481c720d523366d7762dc8a46a1b58967d979aacf786f9ceceb1cd767de069f64a4bdffb63956294f1c0696eb465ddb950f28ba90571709e33521b4bd75e07 + version: 1.0.38 + resolution: "ua-parser-js@npm:1.0.38" + checksum: d0772b22b027338d806ab17d1ac2896ee7485bdf9217c526028159f3cd6bb10272bb18f6196d2f94dde83e3b36dc9d2533daf08a414764f6f4f1844842383838 languageName: node linkType: hard -"ufo@npm:^1.3.0, ufo@npm:^1.3.1, ufo@npm:^1.3.2": - version: 1.4.0 - resolution: "ufo@npm:1.4.0" - checksum: 7c7ca3d823ae56a0439bc7038116a26a8c4e95aa9252aef43091f08f104af5557c2d220d990d07891c2771ca7c0589c479e330737ce6d7bbee485bb031046f19 +"ufo@npm:^1.4.0, ufo@npm:^1.5.3": + version: 1.5.3 + resolution: "ufo@npm:1.5.3" + checksum: 2f54fa543b2e689cc4ab341fe2194937afe37c5ee43cd782e6ecc184e36859e84d4197a43ae4cd6e9a56f793ca7c5b950dfff3f16fadaeef9b6b88b05c88c8ef languageName: node linkType: hard @@ -17980,10 +17579,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~5.25.1": - version: 5.25.3 - resolution: "undici-types@npm:5.25.3" - checksum: ec9d2cc36520cbd9fbe3b3b6c682a87fe5be214699e1f57d1e3d9a2cb5be422e62735f06e0067dc325fd3dd7404c697e4d479f9147dc8a804e049e29f357f2ff +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 languageName: node linkType: hard @@ -17997,11 +17596,11 @@ __metadata: linkType: hard "undici@npm:^5.14.0": - version: 5.26.3 - resolution: "undici@npm:5.26.3" + version: 5.28.4 + resolution: "undici@npm:5.28.4" dependencies: "@fastify/busboy": ^2.0.0 - checksum: aaa9aadb712cf80e1a9cea2377e4842670105e00abbc184a21770ea5a8b77e4e2eadc200eac62442e74a1cd3b16a840c6f73b112b9e886bd3c1a125eb22e4f21 + checksum: a8193132d84540e4dc1895ecc8dbaa176e8a49d26084d6fbe48a292e28397cd19ec5d13bc13e604484e76f94f6e334b2bdc740d5f06a6e50c44072818d0c19f9 languageName: node linkType: hard @@ -18044,9 +17643,9 @@ __metadata: linkType: hard "universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: ecd8469fe0db28e7de9e5289d32bd1b6ba8f7183db34f3bfc4ca53c49891c2d6aa05f3fb3936a81285a905cc509fb641a0c3fc131ec786167eff41236ae32e60 languageName: node linkType: hard @@ -18058,33 +17657,33 @@ __metadata: linkType: hard "unstorage@npm:^1.9.0": - version: 1.10.1 - resolution: "unstorage@npm:1.10.1" + version: 1.10.2 + resolution: "unstorage@npm:1.10.2" dependencies: anymatch: ^3.1.3 - chokidar: ^3.5.3 - destr: ^2.0.2 - h3: ^1.8.2 - ioredis: ^5.3.2 - listhen: ^1.5.5 - lru-cache: ^10.0.2 + chokidar: ^3.6.0 + destr: ^2.0.3 + h3: ^1.11.1 + listhen: ^1.7.2 + lru-cache: ^10.2.0 mri: ^1.2.0 - node-fetch-native: ^1.4.1 + node-fetch-native: ^1.6.2 ofetch: ^1.3.3 - ufo: ^1.3.1 + ufo: ^1.4.0 peerDependencies: - "@azure/app-configuration": ^1.4.1 + "@azure/app-configuration": ^1.5.0 "@azure/cosmos": ^4.0.0 "@azure/data-tables": ^13.2.2 - "@azure/identity": ^3.3.2 - "@azure/keyvault-secrets": ^4.7.0 - "@azure/storage-blob": ^12.16.0 - "@capacitor/preferences": ^5.0.6 - "@netlify/blobs": ^6.2.0 - "@planetscale/database": ^1.11.0 - "@upstash/redis": ^1.23.4 - "@vercel/kv": ^0.2.3 + "@azure/identity": ^4.0.1 + "@azure/keyvault-secrets": ^4.8.0 + "@azure/storage-blob": ^12.17.0 + "@capacitor/preferences": ^5.0.7 + "@netlify/blobs": ^6.5.0 || ^7.0.0 + "@planetscale/database": ^1.16.0 + "@upstash/redis": ^1.28.4 + "@vercel/kv": ^1.0.1 idb-keyval: ^6.2.1 + ioredis: ^5.3.2 peerDependenciesMeta: "@azure/app-configuration": optional: true @@ -18110,7 +17709,9 @@ __metadata: optional: true idb-keyval: optional: true - checksum: 59dc9f21d25df2bc8d14e3965235cbb85e3e2e8cb332da70ca471ba4519269a06936eba4012916251f3b88e23176df44b64abb826202a3a3c9d0a185bfe5e500 + ioredis: + optional: true + checksum: dd3dc881fb2724b0e1af069b919682cc8cfe539e9c8fa50cd3fe448744c9608f97c47b092f48c615e4d17736e206e880b76d7479a4520177bc3e197159d49718 languageName: node linkType: hard @@ -18128,16 +17729,16 @@ __metadata: linkType: hard "update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" + version: 1.0.16 + resolution: "update-browserslist-db@npm:1.0.16" dependencies: - escalade: ^3.1.1 - picocolors: ^1.0.0 + escalade: ^3.1.2 + picocolors: ^1.0.1 peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 + checksum: 51b1f7189c9ea5925c80154b0a6fd3ec36106d07858d8f69826427d8edb4735d1801512c69eade38ba0814d7407d11f400d74440bbf3da0309f3d788017f35b2 languageName: node linkType: hard @@ -18148,7 +17749,7 @@ __metadata: languageName: node linkType: hard -"uri-js@npm:^4.2.2": +"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: @@ -18181,8 +17782,8 @@ __metadata: linkType: hard "use-callback-ref@npm:^1.3.0": - version: 1.3.1 - resolution: "use-callback-ref@npm:1.3.1" + version: 1.3.2 + resolution: "use-callback-ref@npm:1.3.2" dependencies: tslib: ^2.0.0 peerDependencies: @@ -18191,7 +17792,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: 6a6a3a8bfe88f466eab982b8a92e5da560a7127b3b38815e89bc4d195d4b33aa9a53dba50d93e8138e7502bcc7e39efe9f2735a07a673212630990c73483e8e9 + checksum: df690f2032d56aabcea0400313a04621429f45bceb4d65d38829b3680cae3856470ce72958cb7224b332189d8faef54662a283c0867dd7c769f9a5beff61787d languageName: node linkType: hard @@ -18220,7 +17821,7 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:1.2.0, use-sync-external-store@npm:^1.2.0": +"use-sync-external-store@npm:1.2.0": version: 1.2.0 resolution: "use-sync-external-store@npm:1.2.0" peerDependencies: @@ -18229,14 +17830,23 @@ __metadata: languageName: node linkType: hard +"use-sync-external-store@npm:^1.2.0": + version: 1.2.2 + resolution: "use-sync-external-store@npm:1.2.2" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + checksum: fe07c071c4da3645f112c38c0e57beb479a8838616ff4e92598256ecce527f2888c08febc7f9b2f0ce2f0e18540ba3cde41eb2035e4fafcb4f52955037098a81 + languageName: node + linkType: hard + "usehooks-ts@npm:^2.13.0": - version: 2.15.1 - resolution: "usehooks-ts@npm:2.15.1" + version: 2.16.0 + resolution: "usehooks-ts@npm:2.16.0" dependencies: lodash.debounce: ^4.0.8 peerDependencies: react: ^16.8.0 || ^17 || ^18 - checksum: fe5f88780ec37cb9c00b5b456831e550e5e0d420031b88aab5e536cc42d927cfeaf39fa209d0829e45e1f8342446c149377ccbf11f0e922ef185b16986de7860 + checksum: 43f23923dd0ea4bf4401cada035301572ea3f251ec045a48640180255437c0c5424edf71a24666ff9ceafbc6adc39b0faf7000eab673e84411868165740f0906 languageName: node linkType: hard @@ -18281,6 +17891,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^9.0.1": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" + bin: + uuid: dist/bin/uuid + checksum: 39931f6da74e307f51c0fb463dc2462807531dc80760a9bff1e35af4316131b4fc3203d16da60ae33f07fdca5b56f3f1dd662da0c99fea9aaeab2004780cc5f4 + languageName: node + linkType: hard + "v8-compile-cache-lib@npm:^3.0.1": version: 3.0.1 resolution: "v8-compile-cache-lib@npm:3.0.1" @@ -18440,9 +18059,9 @@ __metadata: linkType: hard "web-streams-polyfill@npm:^3.2.1": - version: 3.2.1 - resolution: "web-streams-polyfill@npm:3.2.1" - checksum: b119c78574b6d65935e35098c2afdcd752b84268e18746606af149e3c424e15621b6f1ff0b42b2676dc012fc4f0d313f964b41a4b5031e525faa03997457da02 + version: 3.3.3 + resolution: "web-streams-polyfill@npm:3.3.3" + checksum: 21ab5ea08a730a2ef8023736afe16713b4f2023ec1c7085c16c8e293ee17ed085dff63a0ad8722da30c99c4ccbd4ccd1b2e79c861829f7ef2963d7de7004c2cb languageName: node linkType: hard @@ -18479,8 +18098,8 @@ __metadata: linkType: hard "web3-utils@npm:^1.3.6": - version: 1.10.2 - resolution: "web3-utils@npm:1.10.2" + version: 1.10.4 + resolution: "web3-utils@npm:1.10.4" dependencies: "@ethereumjs/util": ^8.1.0 bn.js: ^5.2.1 @@ -18490,20 +18109,20 @@ __metadata: number-to-bn: 1.7.0 randombytes: ^2.1.0 utf8: 3.0.0 - checksum: a5f8db69603fdd5e984aa6407f47f7a4e0dab83af42e10de25a6d9eeaf2e7d4d18fe665b569e364b2e916233fb73b26cc70ff0d730e7909720118c4790dfb043 + checksum: a1535817a4653f1b5cc868aa19305158122379078a41e13642e1ba64803f6f8e5dd2fb8c45c033612b8f52dde42d8008afce85296c0608276fe1513dece66a49 languageName: node linkType: hard -"webcrypto-core@npm:^1.7.7": - version: 1.7.7 - resolution: "webcrypto-core@npm:1.7.7" +"webcrypto-core@npm:^1.8.0": + version: 1.8.0 + resolution: "webcrypto-core@npm:1.8.0" dependencies: - "@peculiar/asn1-schema": ^2.3.6 + "@peculiar/asn1-schema": ^2.3.8 "@peculiar/json-schema": ^1.1.12 asn1js: ^3.0.1 - pvtsutils: ^1.3.2 - tslib: ^2.4.0 - checksum: 1dc5aedb250372dd95e175a671b990ae50e36974f99c4efc85d88e6528c1bc52dd964d44a41b68043c21fb26aabfe8aad4f05a1c39ca28d61de5ca7388413d52 + pvtsutils: ^1.3.5 + tslib: ^2.6.2 + checksum: 4f128f5283b258eda34844ee804b7d4f102b151a7cb3ae5e722309ea7d37db704184c726afb67bf53cc9eb41279379b24626270b6f4ff08ec5be6b420ff70f18 languageName: node linkType: hard @@ -18558,14 +18177,14 @@ __metadata: linkType: hard "which-collection@npm:^1.0.1": - version: 1.0.1 - resolution: "which-collection@npm:1.0.1" + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" dependencies: - is-map: ^2.0.1 - is-set: ^2.0.1 - is-weakmap: ^2.0.1 - is-weakset: ^2.0.1 - checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c + is-map: ^2.0.3 + is-set: ^2.0.3 + is-weakmap: ^2.0.2 + is-weakset: ^2.0.3 + checksum: c51821a331624c8197916598a738fc5aeb9a857f1e00d89f5e4c03dc7c60b4032822b8ec5696d28268bb83326456a8b8216344fb84270d18ff1d7628051879d9 languageName: node linkType: hard @@ -18576,20 +18195,20 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.9": - version: 1.1.14 - resolution: "which-typed-array@npm:1.1.14" +"which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.9": + version: 1.1.15 + resolution: "which-typed-array@npm:1.1.15" dependencies: - available-typed-arrays: ^1.0.6 - call-bind: ^1.0.5 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.7 for-each: ^0.3.3 gopd: ^1.0.1 - has-tostringtag: ^1.0.1 - checksum: efe30c143c58630dde8ab96f9330e20165bacd77ca843c602b510120a415415573bcdef3ccbc30a0e5aaf20f257360cfe24712aea0008f149ce5bb99834c0c0b + has-tostringtag: ^1.0.2 + checksum: 65227dcbfadf5677aacc43ec84356d17b5500cb8b8753059bb4397de5cd0c2de681d24e1a7bd575633f976a95f88233abfd6549c2105ef4ebd58af8aa1807c75 languageName: node linkType: hard -"which@npm:2.0.2, which@npm:^2.0.0, which@npm:^2.0.1, which@npm:^2.0.2": +"which@npm:2.0.2, which@npm:^2.0.0, which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" dependencies: @@ -18611,7 +18230,18 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.2, wide-align@npm:^1.1.5": +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: ^3.1.1 + bin: + node-which: bin/which.js + checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 + languageName: node + linkType: hard + +"wide-align@npm:^1.1.2": version: 1.1.5 resolution: "wide-align@npm:1.1.5" dependencies: @@ -18629,7 +18259,7 @@ __metadata: languageName: node linkType: hard -"word-wrap@npm:~1.2.3": +"word-wrap@npm:^1.2.5, word-wrap@npm:~1.2.3": version: 1.2.5 resolution: "word-wrap@npm:1.2.5" checksum: f93ba3586fc181f94afdaff3a6fef27920b4b6d9eaefed0f428f8e07adea2a7f54a5f2830ce59406c8416f033f86902b91eb824072354645eea687dff3691ccb @@ -18852,9 +18482,11 @@ __metadata: linkType: hard "yaml@npm:^2.3.4": - version: 2.3.4 - resolution: "yaml@npm:2.3.4" - checksum: e6d1dae1c6383bcc8ba11796eef3b8c02d5082911c6723efeeb5ba50fc8e881df18d645e64de68e421b577296000bea9c75d6d9097c2f6699da3ae0406c030d8 + version: 2.4.2 + resolution: "yaml@npm:2.4.2" + bin: + yaml: bin.mjs + checksum: 90dda4485de04367251face9abb5c36927c94e44078f4e958e6468a07e74e7e92f89be20fc49860b6268c51ee5a5fc79ef89197d3f874bf24ef8921cc4ba9013 languageName: node linkType: hard @@ -18892,7 +18524,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^21.1.1": +"yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c @@ -19003,18 +18635,9 @@ __metadata: languageName: node linkType: hard -"zksync-web3@npm:^0.14.3": - version: 0.14.4 - resolution: "zksync-web3@npm:0.14.4" - peerDependencies: - ethers: ^5.7.0 - checksum: f702a3437f48a8d42c4bb35b8dd13671a168aadfc4e23ce723d62959220ccb6bf9c529c60331fe5b91afaa622147c6a37490551474fe3e35c06ac476524b5160 - languageName: node - linkType: hard - "zustand@npm:^4.1.2, zustand@npm:^4.3.1": - version: 4.5.1 - resolution: "zustand@npm:4.5.1" + version: 4.5.2 + resolution: "zustand@npm:4.5.2" dependencies: use-sync-external-store: 1.2.0 peerDependencies: @@ -19028,6 +18651,6 @@ __metadata: optional: true react: optional: true - checksum: 420af9fda3e70536bccf65cf964dd6668cc88baa5e6e0208254f69c2c068963710f49bf580ad05ba3c5c5ae0470a17d2677165b199b749c4fc7228800e7fa705 + checksum: 160052a7faaefbaad1071e890a06e5d7a04f6ff6985def30a7b4471f4ddbdd1d30bb05b3688a2777cd0b717d1f0d98dad24883a5caa3deeb3afb4d83b6dabc55 languageName: node linkType: hard