diff --git a/packages/contracts/contracts/interfaces/IPayoutStrategy.sol b/packages/contracts/contracts/interfaces/IPayoutStrategy.sol new file mode 100644 index 00000000..4a24e41b --- /dev/null +++ b/packages/contracts/contracts/interfaces/IPayoutStrategy.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +/// @title IPayoutStrategy +/// @notice Interface responsible for payout strategy +interface IPayoutStrategy { + /// @notice Strategy initialization params + struct StrategyInit { + /// @notice The cooldown duration for withdrawal extra funds + uint256 cooldownTime; + /// @notice The max contribution amount + uint256 maxContribution; + /// @notice The payout token + address payoutToken; + } + + /// @notice Claim params + struct Claim { + /// @notice The index of the vote option to verify the correctness of the tally + uint256 index; + /// @notice The voice credit options received for recipient + uint256 voiceCreditsPerOption; + /// @notice Corresponding proof of the tally result + uint256[][] tallyResultProof; + /// @notice The respective salt in the results object in the tally.json + uint256 tallyResultSalt; + /// @notice Depth of the vote option tree + uint8 voteOptionTreeDepth; + /// @notice hashLeftRight(number of spent voice credits, spent salt) + uint256 spentVoiceCreditsHash; + /// @notice hashLeftRight(merkle root of the no spent voice + uint256 perVOSpentVoiceCreditsHash; + } + + /// @notice Total deposited amount + function totalAmount() external view returns (uint256); + + /// @notice The cooldown timeout + function cooldown() external view returns (uint256); + + /// @notice Deposit amount + /// @param amount The amount + function deposit(uint256 amount) external; + + /// @notice Withdraw extra amount + /// @param receivers The receivers addresses + /// @param amounts The amounts + function withdrawExtra(address[] calldata receivers, uint256[] calldata amounts) external; + + /// @notice Claim funds for recipient + /// @param params The claim params + function claim(Claim calldata params) external; +} diff --git a/packages/contracts/contracts/interfaces/IPoll.sol b/packages/contracts/contracts/interfaces/IPoll.sol index 04c2696c..fcd3c0d4 100644 --- a/packages/contracts/contracts/interfaces/IPoll.sol +++ b/packages/contracts/contracts/interfaces/IPoll.sol @@ -4,8 +4,9 @@ pragma solidity ^0.8.20; import { IPoll as IPollBase } from "maci-contracts/contracts/interfaces/IPoll.sol"; import { IOwnable } from "./IOwnable.sol"; +import { IRecipientRegistry } from "./IRecipientRegistry.sol"; -/// @title IPollBase +/// @title IPoll /// @notice Poll interface interface IPoll is IPollBase, IOwnable { /// @notice The initialization function. @@ -14,4 +15,8 @@ interface IPoll is IPollBase, IOwnable { /// @notice Set the poll registry. /// @param registryAddress The registry address function setRegistry(address registryAddress) external; + + /// @notice Get the poll registry. + /// @return registry The poll registry + function getRegistry() external returns (IRecipientRegistry); } diff --git a/packages/contracts/contracts/maci/Poll.sol b/packages/contracts/contracts/maci/Poll.sol index 9389234d..f3fe1bfd 100644 --- a/packages/contracts/contracts/maci/Poll.sol +++ b/packages/contracts/contracts/maci/Poll.sol @@ -5,6 +5,7 @@ import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import { Poll as BasePoll } from "maci-contracts/contracts/Poll.sol"; import { ICommon } from "../interfaces/ICommon.sol"; +import { IRecipientRegistry } from "../interfaces/IRecipientRegistry.sol"; /// @title Poll /// @notice A Poll contract allows voters to submit encrypted messages @@ -16,7 +17,7 @@ contract Poll is Ownable, BasePoll, ICommon { address public registry; /// @notice The timestamp of the block at which the Poll was deployed - uint256 internal initTime; + uint256 public initTime; /// @notice events event SetRegistry(address indexed registry); @@ -90,8 +91,7 @@ contract Poll is Ownable, BasePoll, ICommon { _; } - /// @notice A modifier that causes the function to revert if the voting period is - /// over + /// @notice A modifier that causes the function to revert if the voting period is over modifier isWithinVotingDeadline() override { uint256 secondsPassed = block.timestamp - initTime; @@ -110,6 +110,12 @@ contract Poll is Ownable, BasePoll, ICommon { emit SetRegistry(registryAddress); } + /// @notice Get the poll registry. + /// @return registry The poll registry + function getRegistry() public view returns (IRecipientRegistry) { + return IRecipientRegistry(registry); + } + /// @notice The initialization function. function init() public override onlyOwner isRegistryInitialized { initTime = block.timestamp; @@ -118,6 +124,12 @@ contract Poll is Ownable, BasePoll, ICommon { emit PollInit(); } + /// @inheritdoc BasePoll + function getDeployTimeAndDuration() public view override returns (uint256 pollDeployTime, uint256 pollDuration) { + pollDeployTime = initTime; + pollDuration = duration; + } + /// @inheritdoc BasePoll function publishMessage( Message memory message, diff --git a/packages/contracts/contracts/maci/Tally.sol b/packages/contracts/contracts/maci/Tally.sol new file mode 100644 index 00000000..9e80672f --- /dev/null +++ b/packages/contracts/contracts/maci/Tally.sol @@ -0,0 +1,305 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import { Pausable } from "@openzeppelin/contracts/utils/Pausable.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { Tally as TallyBase } from "maci-contracts/contracts/Tally.sol"; + +import { IPoll } from "../interfaces/IPoll.sol"; +import { IPayoutStrategy } from "../interfaces/IPayoutStrategy.sol"; +import { IRecipientRegistry } from "../interfaces/IRecipientRegistry.sol"; + +/// @title Tally - poll tally and payout strategy +/// @notice The Tally contract is used during votes tallying and by users to verify the tally results. +/// @notice Allows users to deposit and claim rewards for recipients +contract Tally is TallyBase, IPayoutStrategy, Pausable { + using SafeERC20 for IERC20; + + /// @notice The max voice credits (MACI allows 2 ** 32 voice credits max) + uint256 private constant MAX_VOICE_CREDITS = 10 ** 9; + + /// @notice The alpha precision (needed for allocated amount calculation) + uint256 private constant ALPHA_PRECISION = 10 ** 18; + + /// @notice The payout token + IERC20 public token; + + /// @notice The poll registry + IRecipientRegistry public registry; + + /// @notice The max contribution amount + uint256 public maxContributionAmount; + + /// @notice The voice credit factor (needed for allocated amount calculation) + uint256 public voiceCreditFactor; + + /// @notice The cooldown duration for withdrawal extra funds + uint256 public cooldown; + + /// @notice The sum of tally result squares + uint256 public totalVotesSquares; + + /// @notice The alpha used in quadratic funding formula + uint256 public alpha; + + /// @notice Fixed recipient count for claim + uint256 public recipientCount; + + /// @notice Track claims + mapping(uint256 => bool) public claimed; + + /// @notice Initialized or not + bool internal initialized; + + /// @notice custom errors + error CooldownPeriodNotOver(); + error InvalidBudget(); + error NoProjectHasMoreThanOneVote(); + error InvalidWithdrawal(); + error AlreadyInitialized(); + error NotInitialized(); + error NotCompletedResults(); + error TooManyResults(); + error AlreadyClaimed(); + + /// @notice Create a new Tally contract + /// @param verifierContract The Verifier contract + /// @param vkRegistryContract The VkRegistry contract + /// @param pollContract The Poll contract + /// @param mpContract The MessageProcessor contract + /// @param tallyOwner The owner of the Tally contract + /// @param pollMode The mode of the poll + constructor( + address verifierContract, + address vkRegistryContract, + address pollContract, + address mpContract, + address tallyOwner, + Mode pollMode + ) payable TallyBase(verifierContract, vkRegistryContract, pollContract, mpContract, tallyOwner, pollMode) {} + + /// @notice A modifier that causes the function to revert if the cooldown period is not over + modifier afterCooldown() { + (uint256 deployTime, uint256 duration) = poll.getDeployTimeAndDuration(); + uint256 secondsPassed = block.timestamp - deployTime; + + if (secondsPassed <= duration + cooldown) { + revert CooldownPeriodNotOver(); + } + + _; + } + + /// @notice A modifier that causes the function to revert if the tallying is not over + modifier afterTallying() { + if (!isTallied() || tallyBatchNum == 0) { + revert VotesNotTallied(); + } + + _; + } + + /// @notice A modifier that causes the function to revert if the strategy is not initialized + modifier isInitialized() { + if (!initialized) { + revert NotInitialized(); + } + + _; + } + + /// @notice Initialize tally with strategy params + /// @param params The strategy initialization params + function init(IPayoutStrategy.StrategyInit calldata params) public onlyOwner { + if (initialized) { + revert AlreadyInitialized(); + } + + initialized = true; + cooldown = params.cooldownTime; + registry = IPoll(address(poll)).getRegistry(); + token = IERC20(params.payoutToken); + maxContributionAmount = params.maxContribution; + voiceCreditFactor = params.maxContribution / MAX_VOICE_CREDITS; + voiceCreditFactor = voiceCreditFactor > 0 ? voiceCreditFactor : 1; + } + + /// @notice Pause contract calls (deposit, claim, withdraw) + function pause() public onlyOwner { + _pause(); + } + + /// @notice Unpause contract calls (deposit, claim, withdraw) + function unpause() public onlyOwner { + _unpause(); + } + + /// @inheritdoc IPayoutStrategy + function deposit(uint256 amount) public isInitialized whenNotPaused afterTallying { + token.safeTransferFrom(msg.sender, address(this), amount); + } + + /// @inheritdoc IPayoutStrategy + function withdrawExtra( + address[] calldata receivers, + uint256[] calldata amounts + ) public override isInitialized onlyOwner whenNotPaused afterCooldown { + uint256 amountLength = amounts.length; + uint256 totalFunds = token.balanceOf(address(this)); + uint256 sum = 0; + + for (uint256 index = 0; index < amountLength; ) { + uint256 amount = amounts[index]; + address receiver = receivers[index]; + sum += amount; + + if (sum > totalFunds) { + revert InvalidWithdrawal(); + } + + if (amount > 0) { + token.safeTransfer(receiver, amount); + } + + unchecked { + index++; + } + } + } + + /// @inheritdoc IPayoutStrategy + function totalAmount() public view override returns (uint256) { + return token.balanceOf(address(this)); + } + + /// @inheritdoc TallyBase + function addTallyResults(TallyBase.AddTallyResultsArgs calldata args) public override isInitialized onlyOwner { + if (recipientCount == 0) { + recipientCount = registry.recipientCount(); + } + + if (recipientCount == totalTallyResults) { + revert TooManyResults(); + } + + super.addTallyResults(args); + + if (recipientCount < totalTallyResults) { + revert TooManyResults(); + } + } + + /// @inheritdoc TallyBase + function addTallyResult( + uint256 voteOptionIndex, + uint256 tallyResult, + uint256[][] calldata tallyResultProof, + uint256 tallyResultSalt, + uint256 spentVoiceCreditsHash, + uint256 perVOSpentVoiceCreditsHash, + uint8 voteOptionTreeDepth + ) internal override { + super.addTallyResult( + voteOptionIndex, + tallyResult, + tallyResultProof, + tallyResultSalt, + spentVoiceCreditsHash, + perVOSpentVoiceCreditsHash, + voteOptionTreeDepth + ); + + totalVotesSquares += tallyResult ** 2; + } + + /// @inheritdoc IPayoutStrategy + function claim(IPayoutStrategy.Claim calldata params) public override isInitialized whenNotPaused afterTallying { + if (alpha == 0) { + alpha = calculateAlpha(totalAmount()); + } + + uint256 tallyResult = tallyResults[params.index].value; + uint256 amount = getAllocatedAmount(params.index, params.voiceCreditsPerOption); + + IRecipientRegistry.Recipient memory recipient = registry.getRecipient(params.index); + + if (claimed[params.index]) { + revert AlreadyClaimed(); + } + + claimed[params.index] = true; + + bool isValid = verifyTallyResult( + params.index, + tallyResult, + params.tallyResultProof, + params.tallyResultSalt, + params.voteOptionTreeDepth, + params.spentVoiceCreditsHash, + params.perVOSpentVoiceCreditsHash + ); + + if (!isValid) { + revert InvalidTallyVotesProof(); + } + + token.safeTransfer(recipient.recipient, amount); + } + + /// @notice Get allocated token amounts (without verification). + /// @param voiceCreditsPerOptions The voice credit options received for recipient + function getAllocatedAmounts( + uint256[] calldata voiceCreditsPerOptions + ) public view afterTallying returns (uint256[] memory amounts) { + uint256 length = voiceCreditsPerOptions.length; + amounts = new uint256[](length); + + for (uint256 index = 0; index < length; ) { + amounts[index] = getAllocatedAmount(index, voiceCreditsPerOptions[index]); + + unchecked { + index++; + } + } + + return amounts; + } + + /// @notice Get allocated token amount (without verification). + /// @param index The vote option index + /// @param voiceCreditsPerOption The voice credit options received for recipient + function getAllocatedAmount( + uint256 index, + uint256 voiceCreditsPerOption + ) public view afterTallying returns (uint256) { + uint256 tallyResult = tallyResults[index].value; + uint256 quadratic = alpha * voiceCreditFactor * tallyResult * tallyResult; + uint256 totalSpentCredits = voiceCreditFactor * voiceCreditsPerOption; + uint256 linearPrecision = ALPHA_PRECISION * totalSpentCredits; + uint256 linearAlpha = alpha * totalSpentCredits; + + return ((quadratic + linearPrecision) - linearAlpha) / ALPHA_PRECISION; + } + + /// @notice Calculate the alpha for the capital constrained quadratic formula + /// @dev page 17 of https://arxiv.org/pdf/1809.06421.pdf + /// @param budget The total budget for the recipients + function calculateAlpha(uint256 budget) public view afterTallying returns (uint256) { + uint256 contributions = totalSpent * voiceCreditFactor; + + if (budget < contributions) { + revert InvalidBudget(); + } + + if (totalVotesSquares <= totalSpent) { + revert NoProjectHasMoreThanOneVote(); + } + + if (recipientCount != totalTallyResults) { + revert NotCompletedResults(); + } + + return ((budget - contributions) * ALPHA_PRECISION) / (voiceCreditFactor * (totalVotesSquares - totalSpent)); + } +} diff --git a/packages/contracts/contracts/maci/TallyFactory.sol b/packages/contracts/contracts/maci/TallyFactory.sol new file mode 100644 index 00000000..57d05f79 --- /dev/null +++ b/packages/contracts/contracts/maci/TallyFactory.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import { TallyFactory as BaseTallyFactory } from "maci-contracts/contracts/TallyFactory.sol"; + +import { Tally } from "./Tally.sol"; + +/// @title TallyFactory +/// @notice A factory contract which deploys Tally contracts. +contract TallyFactory is BaseTallyFactory { + /// @inheritdoc BaseTallyFactory + function deploy( + address verifier, + address vkRegistry, + address poll, + address messageProcessor, + address owner, + Mode mode + ) public virtual override returns (address tallyAddress) { + // deploy Tally for this Poll + Tally tally = new Tally(verifier, vkRegistry, poll, messageProcessor, owner, mode); + tallyAddress = address(tally); + } +} diff --git a/packages/contracts/contracts/mocks/MockERC20.sol b/packages/contracts/contracts/mocks/MockERC20.sol new file mode 100644 index 00000000..62fedec7 --- /dev/null +++ b/packages/contracts/contracts/mocks/MockERC20.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +/// @title MockERC20 +/// @notice A mock ERC20 contract that mints 100,000,000,000,000,000 tokens to the deployer +contract MockERC20 is ERC20 { + constructor(string memory name, string memory symbol) ERC20(name, symbol) { + _mint(msg.sender, 100e21); + } +} diff --git a/packages/contracts/deploy-config-example.json b/packages/contracts/deploy-config-example.json index 2033efde..4b20ccba 100644 --- a/packages/contracts/deploy-config-example.json +++ b/packages/contracts/deploy-config-example.json @@ -74,6 +74,12 @@ "pollDuration": 3600, "coordinatorPubkey": "macipk.9a59264310d95cfd8eb7083aebeba221b5c26e77427f12b7c0f50bc1cc35e621", "useQuadraticVoting": false + }, + "Tally": { + "withPause": true, + "cooldownTime": "4838400", + "maxContribution": "5000000000000000000", + "payoutToken": "0x0000000000000000000000000000000000000000" } }, "scroll_sepolia": { @@ -150,6 +156,12 @@ "pollDuration": 10800, "coordinatorPubkey": "macipk.0a1ce79a43fa676ee3d2882c79d9164a24d4a22bb6190e3d8fa25d97bffc069a", "useQuadraticVoting": false + }, + "Tally": { + "withPause": true, + "cooldownTime": "4838400", + "maxContribution": "5000000000000000000", + "payoutToken": "0x0000000000000000000000000000000000000000" } }, "optimism": { @@ -227,6 +239,12 @@ "pollDuration": 3600, "coordinatorPubkey": "macipk.9a59264310d95cfd8eb7083aebeba221b5c26e77427f12b7c0f50bc1cc35e621", "useQuadraticVoting": false + }, + "Tally": { + "withPause": true, + "cooldownTime": "4838400", + "maxContribution": "5000000000000000000", + "payoutToken": "0x0000000000000000000000000000000000000000" } }, "arbitrum_sepolia": { @@ -304,6 +322,12 @@ "pollDuration": 3600, "coordinatorPubkey": "macipk.9a59264310d95cfd8eb7083aebeba221b5c26e77427f12b7c0f50bc1cc35e621", "useQuadraticVoting": false + }, + "Tally": { + "withPause": true, + "cooldownTime": "4838400", + "maxContribution": "5000000000000000000", + "payoutToken": "0x0000000000000000000000000000000000000000" } }, "localhost": { @@ -381,6 +405,12 @@ "pollDuration": 3600, "coordinatorPubkey": "macipk.9a59264310d95cfd8eb7083aebeba221b5c26e77427f12b7c0f50bc1cc35e621", "useQuadraticVoting": false + }, + "Tally": { + "withPause": true, + "cooldownTime": "4838400", + "maxContribution": "5000000000000000000", + "payoutToken": "0x0000000000000000000000000000000000000000" } }, "base_sepolia": { @@ -458,6 +488,12 @@ "pollDuration": 3600, "coordinatorPubkey": "macipk.9a59264310d95cfd8eb7083aebeba221b5c26e77427f12b7c0f50bc1cc35e621", "useQuadraticVoting": false + }, + "Tally": { + "withPause": true, + "cooldownTime": "4838400", + "maxContribution": "5000000000000000000", + "payoutToken": "0x0000000000000000000000000000000000000000" } }, "optimism_sepolia": { @@ -540,6 +576,12 @@ "pollDuration": 3600, "coordinatorPubkey": "macipk.9a59264310d95cfd8eb7083aebeba221b5c26e77427f12b7c0f50bc1cc35e621", "useQuadraticVoting": false + }, + "Tally": { + "withPause": true, + "cooldownTime": "4838400", + "maxContribution": "5000000000000000000", + "payoutToken": "0x0000000000000000000000000000000000000000" } } } diff --git a/packages/contracts/package.json b/packages/contracts/package.json index 46843b40..47bf6639 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -58,11 +58,12 @@ "@openzeppelin/contracts": "^5.0.2", "circomlibjs": "^0.1.7", "ethers": "^6.13.2", - "hardhat": "^2.22.8", + "hardhat": "^2.22.15", "lowdb": "^1.0.0", - "maci-contracts": "^2.3.0", - "maci-core": "^2.2.0", - "maci-domainobjs": "^2.2.0", + "maci-contracts": "0.0.0-ci.bcae53f", + "maci-core": "^2.4.0", + "maci-crypto": "^2.4.0", + "maci-domainobjs": "^2.4.0", "solidity-docgen": "^0.6.0-beta.36" }, "devDependencies": { diff --git a/packages/contracts/tasks/deploy/maci/07-tallyFactory.ts b/packages/contracts/tasks/deploy/maci/07-tallyFactory.ts new file mode 100644 index 00000000..ca41cacf --- /dev/null +++ b/packages/contracts/tasks/deploy/maci/07-tallyFactory.ts @@ -0,0 +1,53 @@ +import { ContractStorage, Deployment, type IDeployParams } from "maci-contracts"; + +import { EDeploySteps, EContracts } from "../../helpers/constants"; + +const deployment = Deployment.getInstance(); +const storage = ContractStorage.getInstance(); + +/** + * Deploy step registration and task itself + */ +deployment.deployTask(EDeploySteps.TallyFactory, "Deploy tally factory").then((task) => + task.setAction(async ({ incremental }: IDeployParams, hre) => { + deployment.setHre(hre); + const deployer = await deployment.getDeployer(); + + const tallyFactoryContractAddress = storage.getAddress(EContracts.TallyFactory, hre.network.name); + + if (incremental && tallyFactoryContractAddress) { + // eslint-disable-next-line no-console + console.log(`Skipping deployment of the ${EContracts.TallyFactory} contract`); + return; + } + + const poseidonT3ContractAddress = storage.mustGetAddress(EContracts.PoseidonT3, hre.network.name); + const poseidonT4ContractAddress = storage.mustGetAddress(EContracts.PoseidonT4, hre.network.name); + const poseidonT5ContractAddress = storage.mustGetAddress(EContracts.PoseidonT5, hre.network.name); + const poseidonT6ContractAddress = storage.mustGetAddress(EContracts.PoseidonT6, hre.network.name); + + const linkedTallyFactoryContract = await hre.ethers.getContractFactory( + "contracts/maci/TallyFactory.sol:TallyFactory", + { + signer: deployer, + libraries: { + PoseidonT3: poseidonT3ContractAddress, + PoseidonT4: poseidonT4ContractAddress, + PoseidonT5: poseidonT5ContractAddress, + PoseidonT6: poseidonT6ContractAddress, + }, + }, + ); + + const tallyFactoryContract = await deployment.deployContractWithLinkedLibraries({ + contractFactory: linkedTallyFactoryContract, + }); + + await storage.register({ + id: EContracts.TallyFactory, + contract: tallyFactoryContract, + args: [], + network: hre.network.name, + }); + }), +); diff --git a/packages/contracts/tasks/deploy/poll/01-poll.ts b/packages/contracts/tasks/deploy/poll/01-poll.ts index 8677b5a1..367bea74 100644 --- a/packages/contracts/tasks/deploy/poll/01-poll.ts +++ b/packages/contracts/tasks/deploy/poll/01-poll.ts @@ -1,9 +1,17 @@ /* eslint-disable no-console */ -import { ContractStorage, Deployment, EMode } from "maci-contracts"; +import { ZeroAddress } from "ethers"; +import { ContractStorage, Deployment, EMode, MockERC20__factory as MockERC20Factory } from "maci-contracts"; import { PubKey } from "maci-domainobjs"; -import { type Poll, type MACI } from "../../../typechain-types"; -import { EContracts, EDeploySteps, REGISTRY_TYPES, TRegistryManager, TRegistry } from "../../helpers/constants"; +import { type Poll, type MACI, type Tally } from "../../../typechain-types"; +import { + EContracts, + EDeploySteps, + REGISTRY_TYPES, + TRegistryManager, + TRegistry, + ONE_WEEK_IN_SECONDS, +} from "../../helpers/constants"; const deployment = Deployment.getInstance(); const storage = ContractStorage.getInstance(); @@ -31,7 +39,11 @@ deployment.deployTask(EDeploySteps.Poll, "Deploy poll").then((task) => throw new Error("Need to deploy VkRegistry contract first"); } - const { MACI__factory: MACIFactory, Poll__factory: PollFactory } = await import("../../../typechain-types"); + const { + MACI__factory: MACIFactory, + Poll__factory: PollFactory, + Tally__factory: TallyFactory, + } = await import("../../../typechain-types"); const maciContract = await deployment.getContract({ name: EContracts.MACI, abi: MACIFactory.abi }); const pollId = await maciContract.nextPollId(); @@ -72,21 +84,21 @@ deployment.deployTask(EDeploySteps.Poll, "Deploy poll").then((task) => ...registryArgs, ); - const tx = await maciContract.deployPoll( - pollDuration, - { - intStateTreeDepth, - messageTreeSubDepth, - messageTreeDepth, - voteOptionTreeDepth, - }, - unserializedKey.asContractParam(), - verifierContractAddress, - vkRegistryContractAddress, - mode, - ); - - const deployPollReceipt = await tx.wait(); + const deployPollReceipt = await maciContract + .deployPoll( + pollDuration, + { + intStateTreeDepth, + messageTreeSubDepth, + messageTreeDepth, + voteOptionTreeDepth, + }, + unserializedKey.asContractParam(), + verifierContractAddress, + vkRegistryContractAddress, + mode, + ) + .then((tx) => tx.wait()); if (deployPollReceipt?.status !== 1) { throw new Error("Deploy poll transaction is failed"); @@ -113,8 +125,9 @@ deployment.deployTask(EDeploySteps.Poll, "Deploy poll").then((task) => address: messageProcessorContractAddress, }); - const tallyContract = await deployment.getContract({ + const tallyContract = await deployment.getContract({ name: EContracts.Tally, + abi: TallyFactory.abi, address: tallyContractAddress, }); @@ -126,6 +139,47 @@ deployment.deployTask(EDeploySteps.Poll, "Deploy poll").then((task) => // get the empty ballot root const emptyBallotRoot = await pollContract.emptyBallotRoot(); + const cooldownTime = + deployment.getDeployConfigField(EContracts.Tally, "cooldownTime") ?? ONE_WEEK_IN_SECONDS * 8; + const maxContribution = deployment.getDeployConfigField(EContracts.Tally, "maxContribution", true); + const withPause = deployment.getDeployConfigField(EContracts.Tally, "withPause") ?? true; + let payoutToken = deployment.getDeployConfigField(EContracts.Tally, "payoutToken", true); + + if (hre.network.name === "localhost") { + const mockERC20 = await deployment.deployContract( + { name: EContracts.MockERC20, abi: MockERC20Factory.abi }, + "Token", + "TEST", + ); + payoutToken = await mockERC20.getAddress(); + + await storage.register({ + id: EContracts.MockERC20, + key: `poll-${pollId}`, + contract: mockERC20, + args: ["Token", "TEST"], + network: hre.network.name, + }); + } + + if (payoutToken === ZeroAddress) { + throw new Error("Payout token is a zero address"); + } + + await tallyContract + .init({ + cooldownTime, + maxContribution, + payoutToken, + }) + .then((tx) => tx.wait()); + + // Need to pause deposits/withdrawals/claims for now + // When feature is ready, this code can be removed + if (withPause) { + await tallyContract.pause().then((tx) => tx.wait()); + } + await Promise.all([ storage.register({ id: EContracts.Poll, diff --git a/packages/contracts/tasks/helpers/constants/index.ts b/packages/contracts/tasks/helpers/constants/index.ts index 11fe988b..0db9d195 100644 --- a/packages/contracts/tasks/helpers/constants/index.ts +++ b/packages/contracts/tasks/helpers/constants/index.ts @@ -23,6 +23,7 @@ export enum EPlatformContracts { RegistryManager = "RegistryManager", EASRegistry = "EASRegistry", SimpleRegistry = "SimpleRegistry", + MockERC20 = "MockERC20", } /** @@ -129,3 +130,5 @@ export const getEtherscanApiKeys = (): Record { [owner, user] = await getSigners(); const contracts = await deployTestContracts({ - initialVoiceCreditBalance, + initialVoiceCreditBalance: INITIAL_VOICE_CREDIT_BALANCE, stateTreeDepth: STATE_TREE_DEPTH, signer: owner, }); @@ -46,7 +46,7 @@ describe("Maci", () => { // deploy on chain poll const tx = await maciContract.deployPoll( - duration, + DURATION, treeDepths, coordinator.pubKey.asContractParam(), verifierContract, @@ -66,7 +66,7 @@ describe("Maci", () => { pollContract = PollFactory.connect(pollContracts.poll, owner); // deploy local poll - const p = maciState.deployPoll(BigInt(deployTime + duration), treeDepths, messageBatchSize, coordinator); + const p = maciState.deployPoll(BigInt(deployTime + DURATION), treeDepths, MESSAGE_BATCH_SIZE, coordinator); expect(p.toString()).to.eq(pollId.toString()); // publish the NOTHING_UP_MY_SLEEVE message const messageData = [NOTHING_UP_MY_SLEEVE]; diff --git a/packages/contracts/tests/Poll.test.ts b/packages/contracts/tests/Poll.test.ts index 299a4406..75580e26 100644 --- a/packages/contracts/tests/Poll.test.ts +++ b/packages/contracts/tests/Poll.test.ts @@ -1,24 +1,20 @@ import { expect } from "chai"; import { encodeBytes32String, ZeroAddress, type Signer } from "ethers"; -import hardhat from "hardhat"; -import { deployContract, Deployment, deployPoseidonContracts, genEmptyBallotRoots, getSigners } from "maci-contracts"; +import { deployContract, genEmptyBallotRoots, getSigners } from "maci-contracts"; import { Keypair, Message, PubKey } from "maci-domainobjs"; -import { type Poll, Poll__factory as PollFactory, PollFactory as PollFactoryContract } from "../typechain-types"; +import type { Poll } from "../typechain-types"; import { DEFAULT_SR_QUEUE_OPS, STATE_TREE_DEPTH, treeDepths } from "./constants"; -import { timeTravel } from "./utils"; +import { deployTestPoll, timeTravel } from "./utils"; describe("Poll", () => { - let pollFactory: PollFactoryContract; let pollContract: Poll; let owner: Signer; let user: Signer; const { pubKey: coordinatorPubKey } = new Keypair(); - const deployment = Deployment.getInstance(hardhat); - const emptyBallotRoots = genEmptyBallotRoots(STATE_TREE_DEPTH); const emptyBallotRoot = emptyBallotRoots[treeDepths.voteOptionTreeDepth]; const duration = 100; @@ -32,34 +28,8 @@ describe("Poll", () => { before(async () => { [owner, user] = await getSigners(); - const { PoseidonT3Contract, PoseidonT4Contract, PoseidonT5Contract, PoseidonT6Contract } = - await deployPoseidonContracts(owner); - - const contractFactory = await hardhat.ethers.getContractFactory("contracts/maci/PollFactory.sol:PollFactory", { - signer: owner, - libraries: { - PoseidonT3: PoseidonT3Contract, - PoseidonT4: PoseidonT4Contract, - PoseidonT5: PoseidonT5Contract, - PoseidonT6: PoseidonT6Contract, - }, - }); - - pollFactory = await deployment.deployContractWithLinkedLibraries({ contractFactory, signer: owner }); - - const pollAddress = await pollFactory.deploy.staticCall( - duration, - treeDepths, - coordinatorPubKey.asContractParam(), - await owner.getAddress(), - emptyBallotRoot, - ); - await pollFactory - .deploy("100", treeDepths, coordinatorPubKey.asContractParam(), await owner.getAddress(), emptyBallotRoot) - .then((tx) => tx.wait()); - - pollContract = PollFactory.connect(pollAddress, owner); + pollContract = await deployTestPoll({ signer: owner, emptyBallotRoot, treeDepths, duration, coordinatorPubKey }); }); it("should fail if unauthorized user tries to set the poll registry", async () => { @@ -105,6 +75,8 @@ describe("Poll", () => { .to.emit(pollContract, "SetRegistry") .withArgs(address); + expect(await pollContract.getRegistry()).to.equal(address); + await expect(pollContract.connect(owner).setRegistry(address)).to.be.revertedWithCustomError( pollContract, "RegistryAlreadyInitialized", diff --git a/packages/contracts/tests/Tally.test.ts b/packages/contracts/tests/Tally.test.ts new file mode 100644 index 00000000..fb8bf7e1 --- /dev/null +++ b/packages/contracts/tests/Tally.test.ts @@ -0,0 +1,597 @@ +import { expect } from "chai"; +import { encodeBytes32String, parseUnits, Signer } from "ethers"; +import { + getSigners, + deployContract, + EMode, + MessageProcessor, + MockVerifier, + VkRegistry, + MessageProcessor__factory as MessageProcessorFactory, + IVerifyingKeyStruct, +} from "maci-contracts"; +import { genTreeProof } from "maci-crypto"; +import { Keypair, Message, PCommand, PubKey } from "maci-domainobjs"; + +import { + Tally, + ERC20, + Poll, + IRecipientRegistry, + MACI, + Poll__factory as PollFactory, + Tally__factory as TallyFactory, +} from "../typechain-types"; + +import { + INITIAL_VOICE_CREDIT_BALANCE, + MESSAGE_BATCH_SIZE, + PER_VO_SPENT_VOICE_CREDITS, + STATE_TREE_DEPTH, + TALLY_RESULTS, + TEST_PROCESS_VK, + TEST_TALLY_VK, + TOTAL_SPENT_VOICE_CREDITS, + treeDepths, +} from "./constants"; +import { deployTestContracts, timeTravel } from "./utils"; + +describe("Tally", () => { + let payoutToken: ERC20; + let poll: Poll; + let tally: Tally; + let maci: MACI; + let messageProcessor: MessageProcessor; + let registry: IRecipientRegistry; + let verifier: MockVerifier; + let vkRegistry: VkRegistry; + let owner: Signer; + let user: Signer; + let project: Signer; + + let ownerAddress: string; + let projectAddress: string; + + const maxRecipients = TALLY_RESULTS.tally.length; + + const cooldownTime = 1_000; + const metadataUrl = encodeBytes32String("url"); + const maxContribution = parseUnits("5", 18); + const duration = 100; + const keypair = new Keypair(); + + const emptyClaimParams = { + index: 0, + voiceCreditsPerOption: 0, + tallyResult: 0, + totalSpent: 0, + tallyResultProof: [], + tallyResultSalt: 0, + voteOptionTreeDepth: 0, + spentVoiceCreditsHash: 0, + perVOSpentVoiceCreditsHash: 0, + }; + + before(async () => { + [owner, user, project] = await getSigners(); + [ownerAddress, , projectAddress] = await Promise.all([owner.getAddress(), user.getAddress(), project.getAddress()]); + + payoutToken = await deployContract("MockERC20", owner, true, "Payout token", "PT"); + + const contracts = await deployTestContracts({ + initialVoiceCreditBalance: INITIAL_VOICE_CREDIT_BALANCE, + stateTreeDepth: STATE_TREE_DEPTH, + signer: owner, + }); + maci = contracts.maciContract; + verifier = contracts.mockVerifierContract; + vkRegistry = contracts.vkRegistryContract; + + await vkRegistry.setVerifyingKeys( + STATE_TREE_DEPTH, + treeDepths.intStateTreeDepth, + treeDepths.messageTreeDepth, + treeDepths.voteOptionTreeDepth, + MESSAGE_BATCH_SIZE, + EMode.QV, + TEST_PROCESS_VK.asContractParam() as IVerifyingKeyStruct, + TEST_TALLY_VK.asContractParam() as IVerifyingKeyStruct, + ); + + await maci + .deployPoll(duration, treeDepths, keypair.pubKey.asContractParam(), verifier, vkRegistry, EMode.QV) + .then((tx) => tx.wait()); + + registry = await deployContract("SimpleRegistry", owner, true, maxRecipients, metadataUrl, ownerAddress); + + await maci.setPollRegistry(0n, registry).then((tx) => tx.wait()); + await maci.initPoll(0n).then((tx) => tx.wait()); + + const pollContracts = await maci.getPoll(0n); + poll = PollFactory.connect(pollContracts.poll, owner); + tally = TallyFactory.connect(pollContracts.tally, owner); + messageProcessor = MessageProcessorFactory.connect(pollContracts.messageProcessor, owner); + + const messages: [Message, PubKey][] = []; + for (let i = 0; i < 2; i += 1) { + const command = new PCommand(1n, keypair.pubKey, 0n, 9n, 1n, 0n, BigInt(i)); + const signature = command.sign(keypair.privKey); + const sharedKey = Keypair.genEcdhSharedKey(keypair.privKey, keypair.pubKey); + const message = command.encrypt(signature, sharedKey); + messages.push([message, keypair.pubKey]); + } + + await maci + .signUp( + keypair.pubKey.asContractParam(), + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000000000000000000000000000000000000000000000", + ) + .then((tx) => tx.wait()); + + await poll + .publishMessageBatch( + messages.map(([m]) => m.asContractParam()), + messages.map(([, k]) => k.asContractParam()), + ) + .then((tx) => tx.wait()); + }); + + it("should deploy and initialize with small contribution amount properly", async () => { + await maci + .deployPoll(duration, treeDepths, keypair.pubKey.asContractParam(), verifier, vkRegistry, EMode.QV) + .then((tx) => tx.wait()); + + await maci.setPollRegistry(1n, registry).then((tx) => tx.wait()); + await maci.initPoll(1n).then((tx) => tx.wait()); + + const pollContracts = await maci.getPoll(1n); + const tallyContract = TallyFactory.connect(pollContracts.tally, owner); + + const receipt = await tallyContract + .init({ + cooldownTime, + maxContribution: 1, + payoutToken, + }) + .then((tx) => tx.wait()); + + expect(receipt?.status).to.equal(1); + expect(await tallyContract.voiceCreditFactor()).to.equal(1n); + }); + + it("should not allow to deposit/claim/withdraw/addTallyResults before initialization", async () => { + await expect(tally.deposit(1n)).to.be.revertedWithCustomError(tally, "NotInitialized"); + await expect(tally.withdrawExtra([], [])).to.be.revertedWithCustomError(tally, "NotInitialized"); + await expect(tally.claim(emptyClaimParams)).to.be.revertedWithCustomError(tally, "NotInitialized"); + await expect( + tally.addTallyResults({ + voteOptionIndices: [], + tallyResults: [], + tallyResultProofs: [], + totalSpent: TOTAL_SPENT_VOICE_CREDITS.spent, + totalSpentSalt: TOTAL_SPENT_VOICE_CREDITS.salt, + tallyResultSalt: TALLY_RESULTS.salt, + newResultsCommitment: TALLY_RESULTS.commitment, + spentVoiceCreditsHash: TOTAL_SPENT_VOICE_CREDITS.commitment, + perVOSpentVoiceCreditsHash: PER_VO_SPENT_VOICE_CREDITS.commitment, + }), + ).to.be.revertedWithCustomError(tally, "NotInitialized"); + }); + + it("should not allow non-owner to initialize tally", async () => { + await expect( + tally.connect(user).init({ + cooldownTime, + maxContribution: parseUnits("5", await payoutToken.decimals()), + payoutToken, + }), + ).to.be.revertedWithCustomError(tally, "OwnableUnauthorizedAccount"); + }); + + it("should initialize tally properly", async () => { + const receipt = await tally + .init({ + cooldownTime, + maxContribution: parseUnits("5", await payoutToken.decimals()), + payoutToken, + }) + .then((tx) => tx.wait()); + + expect(receipt?.status).to.equal(1); + }); + + it("should not allow to initialize tally twice", async () => { + await expect( + tally.init({ + cooldownTime, + maxContribution: parseUnits("5", await payoutToken.decimals()), + payoutToken, + }), + ).to.be.revertedWithCustomError(tally, "AlreadyInitialized"); + }); + + it("should not withdraw extra if cooldown period is not over", async () => { + await expect(tally.withdrawExtra([owner, user], [1n])).to.be.revertedWithCustomError( + tally, + "CooldownPeriodNotOver", + ); + }); + + it("should not allow non-owner to withdraw funds", async () => { + await expect(tally.connect(user).withdrawExtra([owner, user], [1n])).to.be.revertedWithCustomError( + tally, + "OwnableUnauthorizedAccount", + ); + }); + + it("should not allow non-owner to pause/unpause", async () => { + await expect(tally.connect(user).pause()).to.be.revertedWithCustomError(tally, "OwnableUnauthorizedAccount"); + + await expect(tally.connect(user).unpause()).to.be.revertedWithCustomError(tally, "OwnableUnauthorizedAccount"); + }); + + it("should not allow to call functions if contract is paused", async () => { + try { + await tally.pause().then((tx) => tx.wait()); + + await expect(tally.deposit(1n)).to.be.revertedWithCustomError(tally, "EnforcedPause"); + + await expect(tally.withdrawExtra([owner, user], [1n])).to.be.revertedWithCustomError(tally, "EnforcedPause"); + + await expect(tally.claim(emptyClaimParams)).to.be.revertedWithCustomError(tally, "EnforcedPause"); + } finally { + await tally.unpause().then((tx) => tx.wait()); + } + }); + + it("should not allow non-owner to add tally results", async () => { + await expect( + tally.connect(user).addTallyResults({ + voteOptionIndices: [], + tallyResults: [], + tallyResultProofs: [], + totalSpent: TOTAL_SPENT_VOICE_CREDITS.spent, + totalSpentSalt: TOTAL_SPENT_VOICE_CREDITS.salt, + tallyResultSalt: TALLY_RESULTS.salt, + newResultsCommitment: TALLY_RESULTS.commitment, + spentVoiceCreditsHash: TOTAL_SPENT_VOICE_CREDITS.commitment, + perVOSpentVoiceCreditsHash: PER_VO_SPENT_VOICE_CREDITS.commitment, + }), + ).to.be.revertedWithCustomError(tally, "OwnableUnauthorizedAccount"); + }); + + it("should not deposit before votes are not tallied", async () => { + await expect(tally.deposit(1n)).to.be.revertedWithCustomError(tally, "VotesNotTallied"); + }); + + it("should not allow to claim before tallying", async () => { + await expect(tally.claim(emptyClaimParams)).to.be.revertedWithCustomError(tally, "VotesNotTallied"); + }); + + it("should not allow to calculate amount if votes are not tallied", async () => { + await expect(tally.getAllocatedAmounts([])).to.be.revertedWithCustomError(tally, "VotesNotTallied"); + await expect(tally.getAllocatedAmount(0, 0)).to.be.revertedWithCustomError(tally, "VotesNotTallied"); + await expect(tally.calculateAlpha(0)).to.be.revertedWithCustomError(tally, "VotesNotTallied"); + }); + + it("should merge properly", async () => { + await timeTravel(cooldownTime + duration, owner); + + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let index = 0; index < TALLY_RESULTS.tally.length; index += 1) { + // eslint-disable-next-line no-await-in-loop + await registry + .addRecipient({ + id: encodeBytes32String(index.toString()), + metadataUrl, + recipient: projectAddress, + }) + .then((tx) => tx.wait()); + } + + await poll.mergeMaciState().then((tx) => tx.wait()); + await poll.mergeMessageAqSubRoots(4).then((tx) => tx.wait()); + await poll.mergeMessageAq().then((tx) => tx.wait()); + + const [numSignups, numMessages] = await poll.numSignUpsAndMessages(); + + expect(numSignups).to.equal(2); + expect(numMessages).to.equal(3); + }); + + it("should not deposit before votes are not tallied without results", async () => { + await expect(tally.deposit(1n)).to.be.revertedWithCustomError(tally, "VotesNotTallied"); + }); + + it("should not allow to claim before tallying without results", async () => { + await expect(tally.claim(emptyClaimParams)).to.be.revertedWithCustomError(tally, "VotesNotTallied"); + }); + + it("should not allow to calculate amount if votes are not tallied without results", async () => { + await expect(tally.getAllocatedAmounts([])).to.be.revertedWithCustomError(tally, "VotesNotTallied"); + await expect(tally.getAllocatedAmount(0, 0)).to.be.revertedWithCustomError(tally, "VotesNotTallied"); + await expect(tally.calculateAlpha(0)).to.be.revertedWithCustomError(tally, "VotesNotTallied"); + }); + + it("should add tally results properly", async () => { + await messageProcessor.processMessages(0n, [0, 0, 0, 0, 0, 0, 0, 0]); + await tally.tallyVotes( + 16314492373388736967790160553643622877652062027311228078826397128502181670780n, + [0, 0, 0, 0, 0, 0, 0, 0], + ); + + const tallyResults = TALLY_RESULTS.tally.map((x) => BigInt(x)); + const indices = TALLY_RESULTS.tally.map((_, index) => index); + const tallyResultProofs = TALLY_RESULTS.tally.map((_, index) => + genTreeProof(index, tallyResults, Number(treeDepths.voteOptionTreeDepth)), + ); + const invalidProof = [ + [0n, 0n, 0n, 0n], + [0n, 0n, 0n, 0n], + [0n, 0n, 0n, 0n], + ]; + + await expect( + tally.addTallyResults({ + voteOptionIndices: [0], + tallyResults: [TALLY_RESULTS.tally[0]], + tallyResultProofs: [invalidProof], + totalSpent: TOTAL_SPENT_VOICE_CREDITS.spent, + totalSpentSalt: TOTAL_SPENT_VOICE_CREDITS.salt, + tallyResultSalt: TALLY_RESULTS.salt, + newResultsCommitment: TALLY_RESULTS.commitment, + spentVoiceCreditsHash: TOTAL_SPENT_VOICE_CREDITS.commitment, + perVOSpentVoiceCreditsHash: PER_VO_SPENT_VOICE_CREDITS.commitment, + }), + ).to.be.revertedWithCustomError(tally, "InvalidTallyVotesProof"); + + await expect(tally.calculateAlpha(TOTAL_SPENT_VOICE_CREDITS.spent)).to.be.revertedWithCustomError( + tally, + "NoProjectHasMoreThanOneVote", + ); + + const firstReceipt = await tally + .addTallyResults({ + voteOptionIndices: indices.slice(1), + tallyResults: tallyResults.slice(1), + tallyResultProofs: tallyResultProofs.slice(1), + totalSpent: TOTAL_SPENT_VOICE_CREDITS.spent, + totalSpentSalt: TOTAL_SPENT_VOICE_CREDITS.salt, + tallyResultSalt: TALLY_RESULTS.salt, + newResultsCommitment: TALLY_RESULTS.commitment, + spentVoiceCreditsHash: TOTAL_SPENT_VOICE_CREDITS.commitment, + perVOSpentVoiceCreditsHash: PER_VO_SPENT_VOICE_CREDITS.commitment, + }) + .then((tx) => tx.wait()); + + expect(firstReceipt?.status).to.equal(1); + + const voiceCreditFactor = await tally.voiceCreditFactor(); + + await expect( + tally.calculateAlpha(BigInt(TOTAL_SPENT_VOICE_CREDITS.spent) * voiceCreditFactor), + ).to.be.revertedWithCustomError(tally, "NotCompletedResults"); + + const additionalProof = genTreeProof(tallyResults.length, tallyResults.concat(0n), treeDepths.voteOptionTreeDepth); + + await expect( + tally.addTallyResults({ + voteOptionIndices: [indices[0], tallyResults.length], + tallyResults: [tallyResults[0], 0n], + tallyResultProofs: [tallyResultProofs[0], additionalProof], + totalSpent: TOTAL_SPENT_VOICE_CREDITS.spent, + totalSpentSalt: TOTAL_SPENT_VOICE_CREDITS.salt, + tallyResultSalt: TALLY_RESULTS.salt, + newResultsCommitment: TALLY_RESULTS.commitment, + spentVoiceCreditsHash: TOTAL_SPENT_VOICE_CREDITS.commitment, + perVOSpentVoiceCreditsHash: PER_VO_SPENT_VOICE_CREDITS.commitment, + }), + ).to.be.revertedWithCustomError(tally, "TooManyResults"); + + const lastReceipt = await tally + .addTallyResults({ + voteOptionIndices: indices.slice(0, 1), + tallyResults: tallyResults.slice(0, 1), + tallyResultProofs: tallyResultProofs.slice(0, 1), + totalSpent: TOTAL_SPENT_VOICE_CREDITS.spent, + totalSpentSalt: TOTAL_SPENT_VOICE_CREDITS.salt, + tallyResultSalt: TALLY_RESULTS.salt, + newResultsCommitment: TALLY_RESULTS.commitment, + spentVoiceCreditsHash: TOTAL_SPENT_VOICE_CREDITS.commitment, + perVOSpentVoiceCreditsHash: PER_VO_SPENT_VOICE_CREDITS.commitment, + }) + .then((tx) => tx.wait()); + + expect(lastReceipt?.status).to.equal(1); + }); + + it("should deposit funds properly", async () => { + const [decimals, initialBalance] = await Promise.all([payoutToken.decimals(), payoutToken.balanceOf(owner)]); + const ownerAmount = parseUnits(TOTAL_SPENT_VOICE_CREDITS.spent, decimals); + const userAmount = parseUnits("2", decimals); + + await payoutToken.approve(user, userAmount).then((tx) => tx.wait()); + await payoutToken.transfer(user, userAmount); + + await payoutToken.approve(tally, ownerAmount).then((tx) => tx.wait()); + await tally.deposit(ownerAmount).then((tx) => tx.wait()); + + await payoutToken + .connect(user) + .approve(tally, userAmount) + .then((tx) => tx.wait()); + await tally + .connect(user) + .deposit(userAmount) + .then((tx) => tx.wait()); + + const [tokenBalance, totalAmount] = await Promise.all([payoutToken.balanceOf(tally), tally.totalAmount()]); + + expect(totalAmount).to.equal(tokenBalance); + expect(initialBalance - tokenBalance).to.equal(initialBalance - ownerAmount - userAmount); + }); + + it("should not allow to add tally results twice", async () => { + const invalidProof = [ + [0n, 0n, 0n, 0n], + [0n, 0n, 0n, 0n], + [0n, 0n, 0n, 0n], + ]; + + await expect( + tally.addTallyResults({ + voteOptionIndices: [0], + tallyResults: [TALLY_RESULTS.tally[0]], + tallyResultProofs: [invalidProof], + totalSpent: TOTAL_SPENT_VOICE_CREDITS.spent, + totalSpentSalt: TOTAL_SPENT_VOICE_CREDITS.salt, + tallyResultSalt: TALLY_RESULTS.salt, + newResultsCommitment: TALLY_RESULTS.commitment, + spentVoiceCreditsHash: TOTAL_SPENT_VOICE_CREDITS.commitment, + perVOSpentVoiceCreditsHash: PER_VO_SPENT_VOICE_CREDITS.commitment, + }), + ).to.be.revertedWithCustomError(tally, "TooManyResults"); + }); + + it("should not allow to calculate alpha funds if there are not enough funds", async () => { + await expect(tally.calculateAlpha(0n)).to.be.revertedWithCustomError(tally, "InvalidBudget"); + }); + + it("should not claim funds for the project if proof generation is failed", async () => { + const voteOptionTreeDepth = 3; + const invalidProof = [ + [0n, 0n, 0n, 0n], + [0n, 0n, 0n, 0n], + [0n, 0n, 0n, 0n], + ]; + + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let index = 0; index < TALLY_RESULTS.tally.length; index += 1) { + const params = { + index, + voiceCreditsPerOption: PER_VO_SPENT_VOICE_CREDITS.tally[index], + tallyResult: TALLY_RESULTS.tally[index], + totalSpent: TOTAL_SPENT_VOICE_CREDITS.spent, + tallyResultProof: invalidProof, + tallyResultSalt: TALLY_RESULTS.salt, + voteOptionTreeDepth, + spentVoiceCreditsHash: TOTAL_SPENT_VOICE_CREDITS.commitment, + perVOSpentVoiceCreditsHash: PER_VO_SPENT_VOICE_CREDITS.commitment, + }; + + // eslint-disable-next-line no-await-in-loop + await expect(tally.claim(params)).to.be.revertedWithCustomError(tally, "InvalidTallyVotesProof"); + } + }); + + it("should calculate rewards per project", async () => { + const voiceCreditsPerOptions = PER_VO_SPENT_VOICE_CREDITS.tally.map((x) => BigInt(x)); + + const expectedRewards = [ + 430000000000n, + 7295000000000n, + 15195000000000n, + 2935000000000n, + 680000000000n, + 2455000000000n, + 3135000000000n, + 395000000000n, + 8220000000000n, + 14580000000000n, + 3605000000000n, + 3030000000000n, + 0n, + ]; + + const amounts = await tally.getAllocatedAmounts(voiceCreditsPerOptions); + + for (let index = 0; index < amounts.length; index += 1) { + // eslint-disable-next-line no-await-in-loop + const amount = await tally.getAllocatedAmount(index, voiceCreditsPerOptions[index]); + + expect(amounts[index].toString()).to.equal(amount.toString()); + expect(amount).to.equal(expectedRewards[index]); + } + }); + + it("should claim funds properly for the project", async () => { + const tallyResults = TALLY_RESULTS.tally.map((x) => BigInt(x)); + const tallyResultProofs = TALLY_RESULTS.tally.map((_, index) => + genTreeProof(index, tallyResults, Number(treeDepths.voteOptionTreeDepth)), + ); + + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let index = 0; index < TALLY_RESULTS.tally.length; index += 1) { + const tallyResultProof = tallyResultProofs[index]; + + const params = { + index, + voiceCreditsPerOption: PER_VO_SPENT_VOICE_CREDITS.tally[index], + tallyResult: tallyResults[index], + totalSpent: TOTAL_SPENT_VOICE_CREDITS.spent, + tallyResultProof, + tallyResultSalt: TALLY_RESULTS.salt, + voteOptionTreeDepth: treeDepths.voteOptionTreeDepth, + spentVoiceCreditsHash: TOTAL_SPENT_VOICE_CREDITS.commitment, + perVOSpentVoiceCreditsHash: PER_VO_SPENT_VOICE_CREDITS.commitment, + }; + + // eslint-disable-next-line no-await-in-loop + await tally.claim(params).then((tx) => tx.wait()); + } + }); + + it("should not claim funds for the project if funds are already claimed", async () => { + const tallyResults = TALLY_RESULTS.tally.map((x) => BigInt(x)); + const tallyResultProofs = TALLY_RESULTS.tally.map((_, index) => + genTreeProof(index, tallyResults, Number(treeDepths.voteOptionTreeDepth)), + ); + + // eslint-disable-next-line @typescript-eslint/prefer-for-of + for (let index = 0; index < TALLY_RESULTS.tally.length; index += 1) { + const params = { + index, + voiceCreditsPerOption: PER_VO_SPENT_VOICE_CREDITS.tally[index], + tallyResult: TALLY_RESULTS.tally[index], + totalSpent: TOTAL_SPENT_VOICE_CREDITS.spent, + tallyResultProof: tallyResultProofs[index], + tallyResultSalt: TALLY_RESULTS.salt, + voteOptionTreeDepth: treeDepths.voteOptionTreeDepth, + spentVoiceCreditsHash: TOTAL_SPENT_VOICE_CREDITS.commitment, + perVOSpentVoiceCreditsHash: PER_VO_SPENT_VOICE_CREDITS.commitment, + }; + + // eslint-disable-next-line no-await-in-loop + await expect(tally.claim(params)).to.be.revertedWithCustomError(tally, "AlreadyClaimed"); + } + }); + + it("should withdraw extra after cooldown properly", async () => { + const [contractBalance, initialOwnerBalance, totalAmount] = await Promise.all([ + payoutToken.balanceOf(tally), + payoutToken.balanceOf(owner), + tally.totalAmount(), + ]); + + await tally.withdrawExtra([owner, user], [totalAmount, 0]).then((tx) => tx.wait()); + + const [balance, ownerBalance, totalExtraFunds] = await Promise.all([ + payoutToken.balanceOf(tally), + payoutToken.balanceOf(owner), + tally.totalAmount(), + ]); + + expect(balance).to.equal(0n); + expect(totalExtraFunds).to.equal(0n); + expect(initialOwnerBalance + totalAmount).to.equal(ownerBalance); + expect(contractBalance).to.equal(totalAmount); + }); + + it("should not withdraw extra if there is no enough funds", async () => { + await expect(tally.withdrawExtra([owner], [maxContribution])).to.be.revertedWithCustomError( + tally, + "InvalidWithdrawal", + ); + }); +}); diff --git a/packages/contracts/tests/constants.ts b/packages/contracts/tests/constants.ts index 821c0bd2..c93fc05e 100644 --- a/packages/contracts/tests/constants.ts +++ b/packages/contracts/tests/constants.ts @@ -1,21 +1,54 @@ -import { TreeDepths, STATE_TREE_ARITY, MESSAGE_TREE_ARITY } from "maci-core"; - -export const duration = 2_000; +import { TreeDepths, MESSAGE_TREE_ARITY } from "maci-core"; +import { G1Point, G2Point } from "maci-crypto"; +import { VerifyingKey } from "maci-domainobjs"; export const STATE_TREE_DEPTH = 10; export const MESSAGE_TREE_DEPTH = 2; export const MESSAGE_TREE_SUBDEPTH = 1; -export const messageBatchSize = MESSAGE_TREE_ARITY ** MESSAGE_TREE_SUBDEPTH; +export const MESSAGE_BATCH_SIZE = MESSAGE_TREE_ARITY ** MESSAGE_TREE_SUBDEPTH; export const NOTHING_UP_MY_SLEEVE = 8370432830353022751713833565135785980866757267633941821328460903436894336785n; export const DEFAULT_SR_QUEUE_OPS = 4; -export const initialVoiceCreditBalance = 100; +export const DURATION = 2_000; +export const INITIAL_VOICE_CREDIT_BALANCE = 1000; + +export const TEST_PROCESS_VK = new VerifyingKey( + new G1Point(BigInt(0), BigInt(1)), + new G2Point([BigInt(2), BigInt(3)], [BigInt(4), BigInt(5)]), + new G2Point([BigInt(6), BigInt(7)], [BigInt(8), BigInt(9)]), + new G2Point([BigInt(10), BigInt(11)], [BigInt(12), BigInt(13)]), + [new G1Point(BigInt(14), BigInt(15)), new G1Point(BigInt(16), BigInt(17))], +); + +export const TEST_TALLY_VK = new VerifyingKey( + new G1Point(BigInt(0), BigInt(1)), + new G2Point([BigInt(2), BigInt(3)], [BigInt(4), BigInt(5)]), + new G2Point([BigInt(6), BigInt(7)], [BigInt(8), BigInt(9)]), + new G2Point([BigInt(10), BigInt(11)], [BigInt(12), BigInt(13)]), + [new G1Point(BigInt(14), BigInt(15)), new G1Point(BigInt(16), BigInt(17))], +); export const treeDepths: TreeDepths = { intStateTreeDepth: 1, messageTreeDepth: MESSAGE_TREE_DEPTH, messageTreeSubDepth: MESSAGE_TREE_SUBDEPTH, - voteOptionTreeDepth: 2, + voteOptionTreeDepth: 3, +}; + +export const TALLY_RESULTS = { + tally: ["12", "107", "159", "67", "26", "35", "53", "17", "114", "158", "65", "60", "0"], + salt: "0xed6956a31ec7a8d7c71e4d9bb90f70281e45e7977644268af3cc061c384feae", + commitment: "0x1f6ebdc3299a1c2eef28cfa14822c4a1e0a607a4044f6aa4434b1b80f1b79ef7", +}; + +export const TOTAL_SPENT_VOICE_CREDITS = { + spent: "12391", + salt: "0x269f6c1a1a34bc13d7369fb93323590504f37edf41d952d5f9e8cf814381c475", + commitment: "0x1f5c444c5dbc821ad8eb76bcfd8966468eca73c08b98cf1504d312751d61b908", }; -export const tallyBatchSize = STATE_TREE_ARITY ** treeDepths.intStateTreeDepth; +export const PER_VO_SPENT_VOICE_CREDITS = { + tally: ["86", "1459", "3039", "587", "136", "491", "627", "79", "1644", "2916", "721", "606", "0"], + salt: "0x1f31c9ed6fb5f2beb54c32edbc922a87d467c31d0178c8427fbb7d978048ade7", + commitment: "0xdf601b181267173f055d90e5fb286637634317c29aa57478800077a0f9bc839", +}; diff --git a/packages/contracts/tests/utils.ts b/packages/contracts/tests/utils.ts index de1ecbc3..097edac3 100644 --- a/packages/contracts/tests/utils.ts +++ b/packages/contracts/tests/utils.ts @@ -3,6 +3,7 @@ import { deployConstantInitialVoiceCreditProxy, deployFreeForAllSignUpGatekeeper, deployMaci, + Deployment, deployMockVerifier, deployPoseidonContracts, deployVkRegistry, @@ -13,8 +14,10 @@ import { } from "maci-contracts"; import type { ContractFactory, Signer, JsonRpcProvider } from "ethers"; +import type { TreeDepths } from "maci-core"; +import type { PubKey } from "maci-domainobjs"; -import { type MACI } from "../typechain-types"; +import { Poll, PollFactory as PollFactoryContract, Poll__factory as PollFactory, type MACI } from "../typechain-types"; /** * An interface that represents argument for deployment test contracts @@ -94,7 +97,7 @@ export const deployTestContracts = async ({ "contracts/maci/MACI.sol:MACI", "contracts/maci/PollFactory.sol:PollFactory", "MessageProcessorFactory", - "TallyFactory", + "contracts/maci/TallyFactory.sol:TallyFactory", ].map((factory) => ethers.getContractFactory(factory, { libraries: { @@ -126,6 +129,68 @@ export const deployTestContracts = async ({ }; }; +/** + * An interface that represents arguments for test poll deployment + */ +export interface IDeployTestPollArgs { + signer: Signer; + emptyBallotRoot: bigint | number; + treeDepths: TreeDepths; + duration: bigint | number; + coordinatorPubKey: PubKey; +} + +/** + * Deploy a test poll using poll factory. + * + * @param signer - the signer to use + * @param emptyBallotRoot - the empty ballot root + * @param treeDepths - the tree depths + * @param duration - the poll duration + * @param coordinatorPubKey - the coordinator public key + * @returns the deployed poll contract + */ +export const deployTestPoll = async ({ + signer, + emptyBallotRoot, + treeDepths, + duration, + coordinatorPubKey, +}: IDeployTestPollArgs): Promise => { + const { PoseidonT3Contract, PoseidonT4Contract, PoseidonT5Contract, PoseidonT6Contract } = + await deployPoseidonContracts(signer); + + const contractFactory = await ethers.getContractFactory("contracts/maci/PollFactory.sol:PollFactory", { + signer, + libraries: { + PoseidonT3: PoseidonT3Contract, + PoseidonT4: PoseidonT4Contract, + PoseidonT5: PoseidonT5Contract, + PoseidonT6: PoseidonT6Contract, + }, + }); + + const deployment = Deployment.getInstance(); + const pollFactory = await deployment.deployContractWithLinkedLibraries({ + contractFactory, + signer, + }); + + const pollAddress = await pollFactory.deploy.staticCall( + duration, + treeDepths, + coordinatorPubKey.asContractParam(), + await signer.getAddress(), + emptyBallotRoot, + ); + + await pollFactory + .deploy("100", treeDepths, coordinatorPubKey.asContractParam(), await signer.getAddress(), emptyBallotRoot) + .then((tx) => tx.wait()); + + return PollFactory.connect(pollAddress, signer); +}; + /** * Utility to travel in time when using a local blockchain * @param seconds - the number of seconds to travel in time diff --git a/packages/coordinator/package.json b/packages/coordinator/package.json index 816c9fd7..4cb8ad05 100644 --- a/packages/coordinator/package.json +++ b/packages/coordinator/package.json @@ -48,7 +48,7 @@ "class-validator": "^0.14.1", "dotenv": "^16.4.5", "ethers": "^6.13.1", - "hardhat": "^2.22.8", + "hardhat": "^2.22.15", "helmet": "^7.1.0", "lowdb": "^1.0.0", "maci-circuits": "^2.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7828d27d..22e35c20 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,10 +85,10 @@ importers: dependencies: '@nomicfoundation/hardhat-ethers': specifier: ^3.0.8 - version: 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(6zbd34p7xszhw7fs5zk33ckexe) + version: 5.0.0(5hcoewoicyqjaeyzmsdiwbznwm) '@openzeppelin/contracts': specifier: ^5.0.2 version: 5.0.2 @@ -99,23 +99,26 @@ importers: specifier: ^6.13.2 version: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) hardhat: - specifier: ^2.22.8 - version: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + specifier: ^2.22.15 + version: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lowdb: specifier: ^1.0.0 version: 1.0.0 maci-contracts: - specifier: ^2.3.0 - version: 2.3.0(scbmzgron6bryzn5ew3pd77ohu) + specifier: 0.0.0-ci.bcae53f + version: 0.0.0-ci.bcae53f(kfwqmkj2ry5s56bzzks6nz6zpa) maci-core: - specifier: ^2.2.0 - version: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + specifier: ^2.4.0 + version: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-crypto: + specifier: ^2.4.0 + version: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) maci-domainobjs: - specifier: ^2.2.0 - version: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + specifier: ^2.4.0 + version: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) solidity-docgen: specifier: ^0.6.0-beta.36 - version: 0.6.0-beta.36(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 0.6.0-beta.36(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) devDependencies: '@types/chai': specifier: ^4.3.11 @@ -146,10 +149,10 @@ importers: version: 16.4.5 hardhat-artifactor: specifier: ^0.2.0 - version: 0.2.0(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 0.2.0(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) hardhat-contract-sizer: specifier: ^2.10.0 - version: 2.10.0(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 2.10.0(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) sol2uml: specifier: ^2.5.20 version: 2.5.20(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) @@ -188,10 +191,10 @@ importers: version: 10.4.4(@nestjs/common@10.3.10(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.10)(@nestjs/platform-socket.io@10.3.10)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.8 - version: 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + version: 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-toolbox': specifier: ^5.0.0 - version: 5.0.0(hke34ef7km4fdyz52h5gry5opq) + version: 5.0.0(zqnw56ks5kobpn6zvih5wdraji) '@vercel/blob': specifier: ^0.25.0 version: 0.25.0 @@ -223,8 +226,8 @@ importers: specifier: ^6.13.1 version: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) hardhat: - specifier: ^2.22.8 - version: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + specifier: ^2.22.15 + version: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) helmet: specifier: ^7.1.0 version: 7.1.0 @@ -236,16 +239,16 @@ importers: version: 2.3.0(@types/snarkjs@0.7.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10) maci-cli: specifier: ^2.3.0 - version: 2.3.0(lp6vtumj75id37mjloxk62tgee) + version: 2.3.0(wl7cpub6o46bb3fuuvhfrz27gu) maci-contracts: specifier: ^2.3.0 - version: 2.3.0(g3d4wepazdznljietc42e5anoy) + version: 2.3.0(5lzeznpmj6umthpxvhbbqb4d4m) maci-domainobjs: specifier: ^2.0.0 version: 2.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) maci-subgraph: specifier: ^2.3.0 - version: 2.3.0(jqbxnb2fveugzmo4mmcj7czc2y) + version: 2.3.0(367vzyu6xr5wn3zp3dg6xp66uy) mustache: specifier: ^4.2.0 version: 4.2.0 @@ -2449,6 +2452,10 @@ packages: resolution: {integrity: sha512-Gm4wOPKhbDjGTIRyFA2QUAPfCXA1AHxYOKt3yLSGJkQkdy9a5WW+qtqKeEKHc/+4wpJSLtsGQfpzyIzggFfo/A==} engines: {node: '>= 18'} + '@nomicfoundation/edr-darwin-arm64@0.6.4': + resolution: {integrity: sha512-QNQErISLgssV9+qia8sIjRANqtbW8snSDvjspixT/kSQ5ZSGxxctTg7x72wPSrcu8+EBEveIe5uqENIp5GH8HQ==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-darwin-x64@0.3.8': resolution: {integrity: sha512-JksVCS1N5ClwVF14EvO25HCQ+Laljh/KRfHERMVAC9ZwPbTuAd/9BtKvToCBi29uCHWqsXMI4lxCApYQv2nznw==} engines: {node: '>= 18'} @@ -2457,6 +2464,10 @@ packages: resolution: {integrity: sha512-ClyABq2dFCsrYEED3/UIO0c7p4H1/4vvlswFlqUyBpOkJccr75qIYvahOSJRM62WgUFRhbSS0OJXFRwc/PwmVg==} engines: {node: '>= 18'} + '@nomicfoundation/edr-darwin-x64@0.6.4': + resolution: {integrity: sha512-cjVmREiwByyc9+oGfvAh49IAw+oVJHF9WWYRD+Tm/ZlSpnEVWxrGNBak2bd/JSYjn+mZE7gmWS4SMRi4nKaLUg==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-gnu@0.3.8': resolution: {integrity: sha512-raCE+fOeNXhVBLUo87cgsHSGvYYRB6arih4eG6B9KGACWK5Veebtm9xtKeiD8YCsdUlUfat6F7ibpeNm91fpsA==} engines: {node: '>= 18'} @@ -2465,6 +2476,10 @@ packages: resolution: {integrity: sha512-HWMTVk1iOabfvU2RvrKLDgtFjJZTC42CpHiw2h6rfpsgRqMahvIlx2jdjWYzFNy1jZKPTN1AStQ/91MRrg5KnA==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-gnu@0.6.4': + resolution: {integrity: sha512-96o9kRIVD6W5VkgKvUOGpWyUGInVQ5BRlME2Fa36YoNsRQMaKtmYJEU0ACosYES6ZTpYC8U5sjMulvPtVoEfOA==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-musl@0.3.8': resolution: {integrity: sha512-PwiDp4wBZWMCIy29eKkv8moTKRrpiSDlrc+GQMSZLhOAm8T33JKKXPwD/2EbplbhCygJDGXZdtEKl9x9PaH66A==} engines: {node: '>= 18'} @@ -2473,6 +2488,10 @@ packages: resolution: {integrity: sha512-CwsQ10xFx/QAD5y3/g5alm9+jFVuhc7uYMhrZAu9UVF+KtVjeCvafj0PaVsZ8qyijjqVuVsJ8hD1x5ob7SMcGg==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-arm64-musl@0.6.4': + resolution: {integrity: sha512-+JVEW9e5plHrUfQlSgkEj/UONrIU6rADTEk+Yp9pbe+mzNkJdfJYhs5JYiLQRP4OjxH4QOrXI97bKU6FcEbt5Q==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-gnu@0.3.8': resolution: {integrity: sha512-6AcvA/XKoipGap5jJmQ9Y6yT7Uf39D9lu2hBcDCXnXbMcXaDGw4mn1/L4R63D+9VGZyu1PqlcJixCUZlGGIWlg==} engines: {node: '>= 18'} @@ -2481,6 +2500,10 @@ packages: resolution: {integrity: sha512-CWVCEdhWJ3fmUpzWHCRnC0/VLBDbqtqTGTR6yyY1Ep3S3BOrHEAvt7h5gx85r2vLcztisu2vlDq51auie4IU1A==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-gnu@0.6.4': + resolution: {integrity: sha512-nzYWW+fO3EZItOeP4CrdMgDXfaGBIBkKg0Y/7ySpUxLqzut40O4Mb0/+quqLAFkacUSWMlFp8nsmypJfOH5zoA==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-musl@0.3.8': resolution: {integrity: sha512-cxb0sEmZjlwhYWO28sPsV64VDx31ekskhC1IsDXU1p9ntjHSJRmW4KEIqJ2O3QwJap/kLKfMS6TckvY10gjc6w==} engines: {node: '>= 18'} @@ -2489,6 +2512,10 @@ packages: resolution: {integrity: sha512-+aJDfwhkddy2pP5u1ISg3IZVAm0dO836tRlDTFWtvvSMQ5hRGqPcWwlsbobhDQsIxhPJyT7phL0orCg5W3WMeA==} engines: {node: '>= 18'} + '@nomicfoundation/edr-linux-x64-musl@0.6.4': + resolution: {integrity: sha512-QFRoE9qSQ2boRrVeQ1HdzU+XN7NUgwZ1SIy5DQt4d7jCP+5qTNsq8LBNcqhRBOATgO63nsweNUhxX/Suj5r1Sw==} + engines: {node: '>= 18'} + '@nomicfoundation/edr-win32-x64-msvc@0.3.8': resolution: {integrity: sha512-yVuVPqRRNLZk7TbBMkKw7lzCvI8XO8fNTPTYxymGadjr9rEGRuNTU1yBXjfJ59I1jJU/X2TSkRk1OFX0P5tpZQ==} engines: {node: '>= 18'} @@ -2497,6 +2524,10 @@ packages: resolution: {integrity: sha512-CcvvuA3sAv7liFNPsIR/68YlH6rrybKzYttLlMr80d4GKJjwJ5OKb3YgE6FdZZnOfP19HEHhsLcE0DPLtY3r0w==} engines: {node: '>= 18'} + '@nomicfoundation/edr-win32-x64-msvc@0.6.4': + resolution: {integrity: sha512-2yopjelNkkCvIjUgBGhrn153IBPLwnsDeNiq6oA0WkeM8tGmQi4td+PGi9jAriUDAkc59Yoi2q9hYA6efiY7Zw==} + engines: {node: '>= 18'} + '@nomicfoundation/edr@0.3.8': resolution: {integrity: sha512-u2UJ5QpznSHVkZRh6ePWoeVb6kmPrrqh08gCnZ9FHlJV9CITqlrTQHJkacd+INH31jx88pTAJnxePE4XAiH5qg==} engines: {node: '>= 18'} @@ -2505,6 +2536,10 @@ packages: resolution: {integrity: sha512-hW/iLvUQZNTVjFyX/I40rtKvvDOqUEyIi96T28YaLfmPL+3LW2lxmYLUXEJ6MI14HzqxDqrLyhf6IbjAa2r3Dw==} engines: {node: '>= 18'} + '@nomicfoundation/edr@0.6.4': + resolution: {integrity: sha512-YgrSuT3yo5ZQkbvBGqQ7hG+RDvz3YygSkddg4tb1Z0Y6pLXFzwrcEwWaJCFAVeeZxdxGfCgGMUYgRVneK+WXkw==} + engines: {node: '>= 18'} + '@nomicfoundation/ethereumjs-common@4.0.4': resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} @@ -4705,6 +4740,9 @@ packages: '@zk-kit/poseidon-cipher@0.3.1': resolution: {integrity: sha512-3plpr4Dk0EADSRPJ0NLNt7x+QG8zlJhT264zVGRxgl4yhraE2C/wAxrclUx1mcw8I04hYoXf1BTd0noAIwd5/A==} + '@zk-kit/poseidon-cipher@0.3.2': + resolution: {integrity: sha512-Ezz1e0mj/GRDlHdU5m0uhj5iHY72zWJU0BP8DsCCvPubU7LPI2tVaPpxrAjT4JQqatbVRQHLIhixW7F7BPzaFg==} + '@zk-kit/utils@1.0.0': resolution: {integrity: sha512-v5UjrZiaRNAN2UJmTFHvlMktaA2Efc2qN1Mwd4060ExX12yRhY8ZhzdlDODhnuHkvW5zPukuBHgQhHMScNP3Pg==} @@ -5630,6 +5668,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -5687,6 +5729,14 @@ packages: '@types/snarkjs': ^0.7.x snarkjs: ^0.7.x + circomkit@0.3.1: + resolution: {integrity: sha512-beZ3yB7ymcf1VqFt5JmdjQGZku/rwpJKY/EpEhCRJPFH+ThhZajiJO1k/wFwwUl4VyGBme8iNCC2a3CIoqnaEQ==} + engines: {node: '>=12.0.0'} + hasBin: true + peerDependencies: + '@types/snarkjs': ^0.7.x + snarkjs: ^0.7.x + circomlib@2.0.5: resolution: {integrity: sha512-O7NQ8OS+J4eshBuoy36z/TwQU0YHw8W3zxZcs4hVwpEll3e4hDm3mgkIPqItN8FDeLEKZFK3YeT/+k8TiLF3/A==} @@ -8043,8 +8093,8 @@ packages: typescript: optional: true - hardhat@2.22.7: - resolution: {integrity: sha512-nrXQAl+qUr75TsCLDo8P41YXLc+5U7qQMMCIrbbmy1/uQaVPncdjDrD5BR0CENvHRj7EBqO+JkofpozXoIfJKg==} + hardhat@2.22.15: + resolution: {integrity: sha512-BpTGa9PE/sKAaHi4s/S1e9WGv63DR1m7Lzfd60C8gSEchDPfAJssVRSq0MZ2v2k76ig9m0kHAwVLf5teYwu/Mw==} hasBin: true peerDependencies: ts-node: '*' @@ -8055,8 +8105,8 @@ packages: typescript: optional: true - hardhat@2.22.8: - resolution: {integrity: sha512-hPh2feBGRswkXkoXUFW6NbxgiYtEzp/3uvVFjYROy6fA9LH8BobUyxStlyhSKj4+v1Y23ZoUBOVWL84IcLACrA==} + hardhat@2.22.7: + resolution: {integrity: sha512-nrXQAl+qUr75TsCLDo8P41YXLc+5U7qQMMCIrbbmy1/uQaVPncdjDrD5BR0CENvHRj7EBqO+JkofpozXoIfJKg==} hasBin: true peerDependencies: ts-node: '*' @@ -9203,6 +9253,10 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stream-stringify@3.1.6: + resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} + engines: {node: '>=7.10.1'} + json-stringify-nice@1.1.4: resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} @@ -9625,6 +9679,9 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + maci-circuits@0.0.0-ci.bcae53f: + resolution: {integrity: sha512-c60xKOWTrTXZO4jMwVEnhsbaMbNiiMkeD7qOCZaQ3FGkWtu53IfmGp/RuCVMBBacasb6yQr6FM03svZKicMd0w==} + maci-circuits@2.3.0: resolution: {integrity: sha512-dq7pwfK9b8+VPbJ++ytLnMoZIZZYQ2ENRBC5rHEAlcyViEhNhj44k3/MmcfGBNbKYsu8y9GG+esdN8hyLt4jAw==} @@ -9639,6 +9696,10 @@ packages: resolution: {integrity: sha512-G7W4VGTqv96Zf808wyTZbwXRKtWTCRsxkagof4Cedup4AL0ywcDVzQumhVo/Nur3Jn9rYdfa+9FtjOSax5xU/w==} hasBin: true + maci-contracts@0.0.0-ci.bcae53f: + resolution: {integrity: sha512-LFWA5dTqHLjk/rrJW3OiDJT2THJd0w1BgCCESslLdWQfS8Et4Aveu+2XRnfghkK3Dt9ad3reytY2AfPcBnwB4A==} + hasBin: true + maci-contracts@2.3.0: resolution: {integrity: sha512-9G/aEA3CpdKgBhzGcqCVfJqI6Tjeo6r9MXaAKMejFFoobIPWqjE8m/g+IKI+QbhLjI5PTNLaja5ji4ZuOfB8Yg==} hasBin: true @@ -9647,27 +9708,24 @@ packages: resolution: {integrity: sha512-BTjP8Ml0NfZco24LIGXwPCZC8m06D9g0yKnRYZmuTplY69KqBNyPwxM0z5B8niZv+Tid+IrOteJVKYlX+AQsQg==} hasBin: true - maci-core@2.2.0: - resolution: {integrity: sha512-jHS40/uGJZMYvslfDls3LUPXK8gAijVrc8L8o51SJQX44iocgR3aWpWycD8df9rBCGBxScZPbtn04CmtFT0lhQ==} + maci-core@0.0.0-ci.bcae53f: + resolution: {integrity: sha512-kxOFXzZOtOa2z0i00k78mDlzHzQeU45e1vlgVR20enc0EFv253+RZzl02Kb+8pkQek7toRszLd+Qa9cmW/4P+w==} maci-core@2.4.0: resolution: {integrity: sha512-+x2rUL5h1uHtjogLRA3AMveQ7pv4P8gCy4Er25Stmj1yJF77dI53bozb6jgqmPS9sNDsViFcCDUBiTebwo5bSg==} - maci-crypto@2.0.0: - resolution: {integrity: sha512-bkgOoDA1ABG49MXDzzsQPsFVEijAkLk8ocJKGyeNQS7YpNhC3YEVVz/SE4g0td+N4xJhD3PbXsyHeaTM3ApIjw==} - - maci-crypto@2.2.0: - resolution: {integrity: sha512-kSbWfuAdDWOdtQsEyofvgDIdAE//+iRjFdYjluDpvXnk7//x4t+/U4VEQJlE0kJ3TbCVjmsAaGNcbkmwmU977Q==} + maci-crypto@0.0.0-ci.bcae53f: + resolution: {integrity: sha512-4IYIRODTfNzzX16vREilXINM2hbu8B2aSC2jISL96LlgQqghi9U6ynf5gxEbaULH7k/TabyYPzKhORB77sVC4g==} maci-crypto@2.4.0: resolution: {integrity: sha512-fQiq7Q/liWzifduQ7ARGJRhA0L2jfPdfQbiiMlQ8R4RdYqU5aSL1BYNkAhfEUEo8g9uPXChu3NIL3sKzszZClA==} + maci-domainobjs@0.0.0-ci.bcae53f: + resolution: {integrity: sha512-XHGGBS3xM4FRJvXk2YxniSerQPSfBc0PABKHopWiPmX/MMo9hep0o75iHuGfbiypczUU/WzyHA3f1owBcNF1cA==} + maci-domainobjs@2.0.0: resolution: {integrity: sha512-FmQdIC1omsWR/98wt8WvEJj0SDfnVTl9/2FMDp3N4WwUy1lzmmlVjUGKSFKj2+dj2Rx26DmBWsmKhbTIQeoPOQ==} - maci-domainobjs@2.2.0: - resolution: {integrity: sha512-pPHqtdIHaPPvMGmWnmx7zXcXQM5+Q8ZGObeSEXgmH60ZKJTQgdoh5z+hs0TfLWEfoWmwWcetLl94EEfZQj0+vg==} - maci-domainobjs@2.4.0: resolution: {integrity: sha512-jwTaJDXmsrjL+xILb2xwfUVTE/ePKmmm4DORfDk63OopRv2zW1M+OPCqItz5oWLeus/eUEz4/HHKJwpqTOpDcw==} @@ -11515,6 +11573,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} @@ -16520,30 +16582,44 @@ snapshots: '@nomicfoundation/edr-darwin-arm64@0.5.2': {} + '@nomicfoundation/edr-darwin-arm64@0.6.4': {} + '@nomicfoundation/edr-darwin-x64@0.3.8': {} '@nomicfoundation/edr-darwin-x64@0.5.2': {} + '@nomicfoundation/edr-darwin-x64@0.6.4': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.3.8': {} '@nomicfoundation/edr-linux-arm64-gnu@0.5.2': {} + '@nomicfoundation/edr-linux-arm64-gnu@0.6.4': {} + '@nomicfoundation/edr-linux-arm64-musl@0.3.8': {} '@nomicfoundation/edr-linux-arm64-musl@0.5.2': {} + '@nomicfoundation/edr-linux-arm64-musl@0.6.4': {} + '@nomicfoundation/edr-linux-x64-gnu@0.3.8': {} '@nomicfoundation/edr-linux-x64-gnu@0.5.2': {} + '@nomicfoundation/edr-linux-x64-gnu@0.6.4': {} + '@nomicfoundation/edr-linux-x64-musl@0.3.8': {} '@nomicfoundation/edr-linux-x64-musl@0.5.2': {} + '@nomicfoundation/edr-linux-x64-musl@0.6.4': {} + '@nomicfoundation/edr-win32-x64-msvc@0.3.8': {} '@nomicfoundation/edr-win32-x64-msvc@0.5.2': {} + '@nomicfoundation/edr-win32-x64-msvc@0.6.4': {} + '@nomicfoundation/edr@0.3.8': dependencies: '@nomicfoundation/edr-darwin-arm64': 0.3.8 @@ -16564,6 +16640,16 @@ snapshots: '@nomicfoundation/edr-linux-x64-musl': 0.5.2 '@nomicfoundation/edr-win32-x64-msvc': 0.5.2 + '@nomicfoundation/edr@0.6.4': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.6.4 + '@nomicfoundation/edr-darwin-x64': 0.6.4 + '@nomicfoundation/edr-linux-arm64-gnu': 0.6.4 + '@nomicfoundation/edr-linux-arm64-musl': 0.6.4 + '@nomicfoundation/edr-linux-x64-gnu': 0.6.4 + '@nomicfoundation/edr-linux-x64-musl': 0.6.4 + '@nomicfoundation/edr-win32-x64-msvc': 0.6.4 + '@nomicfoundation/ethereumjs-common@4.0.4': dependencies: '@nomicfoundation/ethereumjs-util': 9.0.4 @@ -16584,145 +16670,175 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.2(chai@4.5.0) deep-eql: 4.1.4 ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: debug: 4.3.6(supports-color@8.1.1) ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: debug: 4.3.6(supports-color@8.1.1) ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - '@nomicfoundation/ignition-core': 0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) + debug: 4.3.6(supports-color@8.1.1) ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color - '@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) '@nomicfoundation/ignition-core': 0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/ignition-core': 0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + + '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + dependencies: + '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.5 chalk: 4.1.2 debug: 4.3.6(supports-color@8.1.1) fs-extra: 10.1.0 - hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) prompts: 2.4.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.5 chalk: 4.1.2 debug: 4.3.6(supports-color@8.1.1) fs-extra: 10.1.0 - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) prompts: 2.4.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': dependencies: - '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/ignition-core': 0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@nomicfoundation/ignition-ui': 0.15.5 chalk: 4.1.2 debug: 4.3.6(supports-color@8.1.1) fs-extra: 10.1.0 - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) prompts: 2.4.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.11(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - '@nomicfoundation/hardhat-toolbox@5.0.0(4lzaewf5vhmhgkr3zdkxldxwse)': + '@nomicfoundation/hardhat-toolbox@5.0.0(5hcoewoicyqjaeyzmsdiwbznwm)': + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + '@types/chai': 4.3.17 + '@types/mocha': 10.0.7 + '@types/node': 22.2.0 + chai: 4.5.0 + ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.12(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@types/node@22.2.0)(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + typescript: 5.5.4 + + '@nomicfoundation/hardhat-toolbox@5.0.0(lebr4ezuwymlkaqin6fyaszwsm)': dependencies: '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) @@ -16733,63 +16849,63 @@ snapshots: '@types/node': 20.14.14 chai: 4.5.0 ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) solidity-coverage: 0.8.12(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) ts-node: 10.9.2(@types/node@20.14.14)(typescript@5.5.4) typechain: 8.3.2(typescript@5.5.4) typescript: 5.5.4 - '@nomicfoundation/hardhat-toolbox@5.0.0(6zbd34p7xszhw7fs5zk33ckexe)': + '@nomicfoundation/hardhat-toolbox@5.0.0(pam5r4nxnwtpychkxfx6stqox4)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': 0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) '@types/chai': 4.3.17 '@types/mocha': 10.0.7 - '@types/node': 22.2.0 + '@types/node': 20.14.14 chai: 4.5.0 ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.12(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - ts-node: 10.9.2(@types/node@22.2.0)(typescript@5.5.4) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.12(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@types/node@20.14.14)(typescript@5.5.4) typechain: 8.3.2(typescript@5.5.4) typescript: 5.5.4 - '@nomicfoundation/hardhat-toolbox@5.0.0(hke34ef7km4fdyz52h5gry5opq)': + '@nomicfoundation/hardhat-toolbox@5.0.0(zqnw56ks5kobpn6zvih5wdraji)': dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.5(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-network-helpers': 1.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) '@typechain/ethers-v6': 0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4)) '@types/chai': 4.3.17 '@types/mocha': 10.0.7 '@types/node': 20.14.14 chai: 4.5.0 ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) - solidity-coverage: 0.8.12(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.12(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) ts-node: 10.9.2(@types/node@20.14.14)(typescript@5.5.4) typechain: 8.3.2(typescript@5.5.4) typescript: 5.5.4 - '@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 debug: 4.3.6(supports-color@8.1.1) - hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 semver: 6.3.1 table: 6.8.2 @@ -16797,14 +16913,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 debug: 4.3.6(supports-color@8.1.1) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 semver: 6.3.1 table: 6.8.2 @@ -16812,14 +16928,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.7.0 cbor: 8.1.0 chalk: 2.4.2 debug: 4.3.6(supports-color@8.1.1) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 semver: 6.3.1 table: 6.8.2 @@ -17571,7 +17687,7 @@ snapshots: '@semaphore-protocol/identity': 3.15.2 '@types/json-bigint': 1.0.4 '@zk-kit/eddsa-poseidon': 1.0.3 - '@zk-kit/utils': 1.2.1 + '@zk-kit/utils': 1.2.0 js-sha256: 0.11.0 json-bigint: 1.0.0 poseidon-lite: 0.3.0 @@ -18914,28 +19030,28 @@ snapshots: typechain: 8.3.2(typescript@5.5.4) typescript: 5.5.4 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.5.4) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.5.4) - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))': dependencies: '@typechain/ethers-v6': 0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) fs-extra: 9.1.0 - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) typechain: 8.3.2(typescript@5.5.4) '@types/aria-query@4.2.2': {} @@ -20133,6 +20249,11 @@ snapshots: '@zk-kit/baby-jubjub': 1.0.1 '@zk-kit/utils': 1.0.0 + '@zk-kit/poseidon-cipher@0.3.2': + dependencies: + '@zk-kit/baby-jubjub': 1.0.3 + '@zk-kit/utils': 1.2.1 + '@zk-kit/utils@1.0.0': dependencies: buffer: 6.0.3 @@ -21187,6 +21308,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.1: + dependencies: + readdirp: 4.0.2 + chownr@1.1.4: {} chownr@2.0.0: {} @@ -21246,6 +21371,14 @@ snapshots: loglevel: 1.9.1 snarkjs: 0.7.4 + circomkit@0.3.1(@types/snarkjs@0.7.8)(snarkjs@0.7.4): + dependencies: + '@types/snarkjs': 0.7.8 + circom_tester: 0.0.19 + commander: 12.1.0 + loglevel: 1.9.1 + snarkjs: 0.7.4 + circomlib@2.0.5: {} circomlibjs@0.1.7(bufferutil@4.0.8)(utf-8-validate@5.0.10): @@ -24370,22 +24503,22 @@ snapshots: hard-rejection@2.1.0: {} - hardhat-artifactor@0.2.0(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): + hardhat-artifactor@0.2.0(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) - hardhat-contract-sizer@2.10.0(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): + hardhat-contract-sizer@2.10.0(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: chalk: 4.1.2 cli-table3: 0.6.5 - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) strip-ansi: 6.0.1 - hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -24393,11 +24526,11 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -24405,11 +24538,11 @@ snapshots: - debug - utf-8-validate - hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -24471,11 +24604,11 @@ snapshots: - supports-color - utf-8-validate - hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): + hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.5.2 + '@nomicfoundation/edr': 0.6.4 '@nomicfoundation/ethereumjs-common': 4.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 @@ -24488,7 +24621,7 @@ snapshots: ansi-escapes: 4.3.2 boxen: 5.1.2 chalk: 2.4.2 - chokidar: 3.6.0 + chokidar: 4.0.1 ci-info: 2.0.0 debug: 4.3.6(supports-color@8.1.1) enquirer: 2.4.1 @@ -24501,6 +24634,7 @@ snapshots: glob: 7.2.0 immutable: 4.3.7 io-ts: 1.10.4 + json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 mnemonist: 0.38.5 @@ -24525,11 +24659,11 @@ snapshots: - supports-color - utf-8-validate - hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): + hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.5.2 + '@nomicfoundation/edr': 0.6.4 '@nomicfoundation/ethereumjs-common': 4.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 @@ -24542,7 +24676,7 @@ snapshots: ansi-escapes: 4.3.2 boxen: 5.1.2 chalk: 2.4.2 - chokidar: 3.6.0 + chokidar: 4.0.1 ci-info: 2.0.0 debug: 4.3.6(supports-color@8.1.1) enquirer: 2.4.1 @@ -24555,6 +24689,7 @@ snapshots: glob: 7.2.0 immutable: 4.3.7 io-ts: 1.10.4 + json-stream-stringify: 3.1.6 keccak: 3.0.4 lodash: 4.17.21 mnemonist: 0.38.5 @@ -24571,7 +24706,7 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@types/node@20.14.14)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@22.2.0)(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - bufferutil @@ -24579,7 +24714,7 @@ snapshots: - supports-color - utf-8-validate - hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): + hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 @@ -24625,7 +24760,7 @@ snapshots: uuid: 8.3.2 ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) optionalDependencies: - ts-node: 10.9.2(@types/node@22.2.0)(typescript@5.5.4) + ts-node: 10.9.2(@types/node@20.14.14)(typescript@5.5.4) typescript: 5.5.4 transitivePeerDependencies: - bufferutil @@ -26135,6 +26270,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stream-stringify@3.1.6: {} + json-stringify-nice@1.1.4: {} json-stringify-safe@5.0.1: {} @@ -26665,14 +26802,28 @@ snapshots: lz-string@1.5.0: {} + maci-circuits@0.0.0-ci.bcae53f(@types/snarkjs@0.7.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@zk-kit/circuits': 0.4.0 + circomkit: 0.3.1(@types/snarkjs@0.7.8)(snarkjs@0.7.4) + circomlib: 2.0.5 + maci-core: 0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-crypto: 0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-domainobjs: 0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10) + snarkjs: 0.7.4 + transitivePeerDependencies: + - '@types/snarkjs' + - bufferutil + - utf-8-validate + maci-circuits@2.3.0(@types/snarkjs@0.7.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@zk-kit/circuits': 0.4.0 circomkit: 0.2.1(@types/snarkjs@0.7.8)(snarkjs@0.7.4) circomlib: 2.0.5 - maci-core: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-crypto: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-domainobjs: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-core: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-crypto: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-domainobjs: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) snarkjs: 0.7.4 transitivePeerDependencies: - '@types/snarkjs' @@ -26693,19 +26844,19 @@ snapshots: - bufferutil - utf-8-validate - maci-cli@2.3.0(lp6vtumj75id37mjloxk62tgee): + maci-cli@2.3.0(wl7cpub6o46bb3fuuvhfrz27gu): dependencies: '@commander-js/extra-typings': 12.1.0(commander@12.1.0) - '@nomicfoundation/hardhat-toolbox': 5.0.0(hke34ef7km4fdyz52h5gry5opq) + '@nomicfoundation/hardhat-toolbox': 5.0.0(zqnw56ks5kobpn6zvih5wdraji) commander: 12.1.0 dotenv: 16.4.5 ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) maci-circuits: 2.3.0(@types/snarkjs@0.7.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-contracts: 2.3.0(g3d4wepazdznljietc42e5anoy) - maci-core: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-crypto: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-domainobjs: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-contracts: 2.4.0(5lzeznpmj6umthpxvhbbqb4d4m) + maci-core: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-crypto: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-domainobjs: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) prompt: 1.3.0 transitivePeerDependencies: - '@nomicfoundation/hardhat-chai-matchers' @@ -26733,11 +26884,11 @@ snapshots: maci-cli@2.4.0(ajppvhbj75go4cdbr4h4vhruha): dependencies: '@commander-js/extra-typings': 12.1.0(commander@12.1.0) - '@nomicfoundation/hardhat-toolbox': 5.0.0(4lzaewf5vhmhgkr3zdkxldxwse) + '@nomicfoundation/hardhat-toolbox': 5.0.0(pam5r4nxnwtpychkxfx6stqox4) commander: 12.1.0 dotenv: 16.4.5 ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) maci-circuits: 2.4.0(@types/snarkjs@0.7.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10) maci-contracts: 2.4.0(tnqgnvgpfdbm2nfzhwjuiounlm) maci-core: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -26767,20 +26918,21 @@ snapshots: - typescript - utf-8-validate - maci-contracts@2.3.0(g3d4wepazdznljietc42e5anoy): + maci-contracts@0.0.0-ci.bcae53f(kfwqmkj2ry5s56bzzks6nz6zpa): dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-toolbox': 5.0.0(hke34ef7km4fdyz52h5gry5opq) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-toolbox': 5.0.0(5hcoewoicyqjaeyzmsdiwbznwm) '@openzeppelin/contracts': 5.0.2 + '@openzeppelin/merkle-tree': 1.0.7 circomlibjs: 0.1.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lowdb: 1.0.0 - maci-circuits: 2.3.0(@types/snarkjs@0.7.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-core: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-crypto: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-domainobjs: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - solidity-docgen: 0.6.0-beta.36(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + maci-circuits: 0.0.0-ci.bcae53f(@types/snarkjs@0.7.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-core: 0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-crypto: 0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-domainobjs: 0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10) + solidity-docgen: 0.6.0-beta.36(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) uuid: 10.0.0 transitivePeerDependencies: - '@nomicfoundation/hardhat-chai-matchers' @@ -26804,20 +26956,20 @@ snapshots: - typescript - utf-8-validate - maci-contracts@2.3.0(scbmzgron6bryzn5ew3pd77ohu): + maci-contracts@2.3.0(5lzeznpmj6umthpxvhbbqb4d4m): dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-toolbox': 5.0.0(6zbd34p7xszhw7fs5zk33ckexe) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-toolbox': 5.0.0(zqnw56ks5kobpn6zvih5wdraji) '@openzeppelin/contracts': 5.0.2 circomlibjs: 0.1.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lowdb: 1.0.0 maci-circuits: 2.3.0(@types/snarkjs@0.7.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-core: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-crypto: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-domainobjs: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - solidity-docgen: 0.6.0-beta.36(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + maci-core: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-crypto: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-domainobjs: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + solidity-docgen: 0.6.0-beta.36(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) uuid: 10.0.0 transitivePeerDependencies: - '@nomicfoundation/hardhat-chai-matchers' @@ -26841,21 +26993,21 @@ snapshots: - typescript - utf-8-validate - maci-contracts@2.4.0(tnqgnvgpfdbm2nfzhwjuiounlm): + maci-contracts@2.4.0(5lzeznpmj6umthpxvhbbqb4d4m): dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) - '@nomicfoundation/hardhat-toolbox': 5.0.0(4lzaewf5vhmhgkr3zdkxldxwse) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-toolbox': 5.0.0(zqnw56ks5kobpn6zvih5wdraji) '@openzeppelin/contracts': 5.0.2 '@openzeppelin/merkle-tree': 1.0.7 circomlibjs: 0.1.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) lowdb: 1.0.0 maci-circuits: 2.4.0(@types/snarkjs@0.7.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10) maci-core: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) maci-crypto: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) maci-domainobjs: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - solidity-docgen: 0.6.0-beta.36(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + solidity-docgen: 0.6.0-beta.36(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) uuid: 10.0.0 transitivePeerDependencies: - '@nomicfoundation/hardhat-chai-matchers' @@ -26879,37 +27031,65 @@ snapshots: - typescript - utf-8-validate - maci-core@2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + maci-contracts@2.4.0(tnqgnvgpfdbm2nfzhwjuiounlm): dependencies: - maci-crypto: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-domainobjs: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-toolbox': 5.0.0(lebr4ezuwymlkaqin6fyaszwsm) + '@openzeppelin/contracts': 5.0.2 + '@openzeppelin/merkle-tree': 1.0.7 + circomlibjs: 0.1.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + lowdb: 1.0.0 + maci-circuits: 2.4.0(@types/snarkjs@0.7.8)(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-core: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-crypto: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-domainobjs: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + solidity-docgen: 0.6.0-beta.36(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)) + uuid: 10.0.0 transitivePeerDependencies: + - '@nomicfoundation/hardhat-chai-matchers' + - '@nomicfoundation/hardhat-ignition-ethers' + - '@nomicfoundation/hardhat-network-helpers' + - '@nomicfoundation/hardhat-verify' + - '@typechain/ethers-v6' + - '@typechain/hardhat' + - '@types/chai' + - '@types/mocha' + - '@types/node' + - '@types/snarkjs' - bufferutil + - c-kzg + - chai + - hardhat-gas-reporter + - solidity-coverage + - supports-color + - ts-node + - typechain + - typescript - utf-8-validate - maci-core@2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + maci-core@0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - maci-crypto: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - maci-domainobjs: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-crypto: 0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-domainobjs: 0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - maci-crypto@2.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + maci-core@2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - '@zk-kit/baby-jubjub': 1.0.1 - '@zk-kit/eddsa-poseidon': 1.0.2 - '@zk-kit/poseidon-cipher': 0.3.1 - ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-crypto: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-domainobjs: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - maci-crypto@2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + maci-crypto@0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - '@zk-kit/baby-jubjub': 1.0.1 - '@zk-kit/eddsa-poseidon': 1.0.2 - '@zk-kit/poseidon-cipher': 0.3.1 + '@zk-kit/baby-jubjub': 1.0.3 + '@zk-kit/eddsa-poseidon': 1.0.3 + '@zk-kit/poseidon-cipher': 0.3.2 ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil @@ -26925,16 +27105,16 @@ snapshots: - bufferutil - utf-8-validate - maci-domainobjs@2.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + maci-domainobjs@0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - maci-crypto: 2.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-crypto: 0.0.0-ci.bcae53f(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - maci-domainobjs@2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + maci-domainobjs@2.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - maci-crypto: 2.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + maci-crypto: 2.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -26946,11 +27126,11 @@ snapshots: - bufferutil - utf-8-validate - maci-subgraph@2.3.0(jqbxnb2fveugzmo4mmcj7czc2y): + maci-subgraph@2.3.0(367vzyu6xr5wn3zp3dg6xp66uy): dependencies: '@graphprotocol/graph-cli': 0.80.0(@types/node@20.14.14)(bufferutil@4.0.8)(encoding@0.1.13)(node-fetch@2.7.0(encoding@0.1.13))(typescript@5.5.4)(utf-8-validate@5.0.10) '@graphprotocol/graph-ts': 0.35.1 - maci-contracts: 2.3.0(g3d4wepazdznljietc42e5anoy) + maci-contracts: 2.4.0(5lzeznpmj6umthpxvhbbqb4d4m) transitivePeerDependencies: - '@nomicfoundation/hardhat-chai-matchers' - '@nomicfoundation/hardhat-ignition-ethers' @@ -29255,6 +29435,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.0.2: {} + readline@1.3.0: {} real-require@0.1.0: {} @@ -29979,7 +30161,7 @@ snapshots: dependencies: array.prototype.findlast: 1.2.5 - solidity-coverage@0.8.12(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.12(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.7.0 '@solidity-parser/parser': 0.18.0 @@ -29990,7 +30172,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) jsonschema: 1.4.1 lodash: 4.17.21 mocha: 10.7.0 @@ -30002,7 +30184,7 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.12(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.12(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.7.0 '@solidity-parser/parser': 0.18.0 @@ -30013,7 +30195,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) jsonschema: 1.4.1 lodash: 4.17.21 mocha: 10.7.0 @@ -30025,7 +30207,7 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-coverage@0.8.12(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): + solidity-coverage@0.8.12(hardhat@2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: '@ethersproject/abi': 5.7.0 '@solidity-parser/parser': 0.18.0 @@ -30036,7 +30218,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.7(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) jsonschema: 1.4.1 lodash: 4.17.21 mocha: 10.7.0 @@ -30048,16 +30230,16 @@ snapshots: shelljs: 0.8.5 web3-utils: 1.10.4 - solidity-docgen@0.6.0-beta.36(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): + solidity-docgen@0.6.0-beta.36(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: handlebars: 4.7.8 - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.14)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) solidity-ast: 0.4.56 - solidity-docgen@0.6.0-beta.36(hardhat@2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): + solidity-docgen@0.6.0-beta.36(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10)): dependencies: handlebars: 4.7.8 - hardhat: 2.22.8(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)(utf-8-validate@5.0.10) solidity-ast: 0.4.56 sonic-boom@2.8.0: