From a22e2b801015eea6d089232ccb5a2b4ce1db849e Mon Sep 17 00:00:00 2001 From: parketh Date: Thu, 16 Oct 2025 22:13:08 +0100 Subject: [PATCH 01/41] add openzeppelin libs --- .gitmodules | 3 ++ foundry.lock | 8 +++++ lib/openzeppelin-contracts | 1 + src/Errors.sol | 6 ++++ src/contracts/ERC20PrivateBank.sol | 50 ++++++++++++++++++++++++++++++ src/contracts/PrivateBank.sol | 9 +++--- 6 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 .gitmodules create mode 100644 foundry.lock create mode 160000 lib/openzeppelin-contracts create mode 100644 src/contracts/ERC20PrivateBank.sol diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..140ea9e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/openzeppelin-contracts"] + path = lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts diff --git a/foundry.lock b/foundry.lock new file mode 100644 index 0000000..b071289 --- /dev/null +++ b/foundry.lock @@ -0,0 +1,8 @@ +{ + "lib/openzeppelin-contracts": { + "tag": { + "name": "v5.4.0", + "rev": "c64a1edb67b6e3f4a15cca8909c9482ad33a02b0" + } + } +} \ No newline at end of file diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts new file mode 160000 index 0000000..c64a1ed --- /dev/null +++ b/lib/openzeppelin-contracts @@ -0,0 +1 @@ +Subproject commit c64a1edb67b6e3f4a15cca8909c9482ad33a02b0 diff --git a/src/Errors.sol b/src/Errors.sol index 3a7a3a8..8f0c534 100644 --- a/src/Errors.sol +++ b/src/Errors.sol @@ -45,3 +45,9 @@ error WithdrawFailed(); /// @notice Withdraw relayer fee payment to relayer failed error RelayerFeePaymentFailed(); + +/// @notice Refund is provided for an ETH deposit +error ETHTransferredForERC20Deposit(); + +/// @notice Received refund amount is incorrect +error IncorrectRefundAmount(uint256 actual, uint256 expected); diff --git a/src/contracts/ERC20PrivateBank.sol b/src/contracts/ERC20PrivateBank.sol new file mode 100644 index 0000000..92af737 --- /dev/null +++ b/src/contracts/ERC20PrivateBank.sol @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; +import { SafeERC20 } from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; +import { PrivateBank } from './PrivateBank.sol'; +import { ETHTransferredForERC20Deposit, IncorrectRefundAmount } from '../Errors.sol'; +import { IVerifier } from '../interfaces/IVerifier.sol'; +import { IHasher } from '../interfaces/IHasher.sol'; + +contract ERC20PrivateBank is PrivateBank { + using SafeERC20 for IERC20; + IERC20 public token; + + constructor( + IVerifier _verifier, + IHasher _hasher, + uint32 _height, + uint256 _depositAmount, + IERC20 _token + ) PrivateBank(_verifier, _hasher, _height, _depositAmount) { + token = _token; + } + + function processDeposit() internal override { + if (msg.value != 0) { + revert ETHTransferredForERC20Deposit(); + } + token.safeTransferFrom(msg.sender, address(this), depositAmount); + } + + function processWithdraw(Inputs memory inputs) internal override { + if (msg.value != inputs.gasRefund) { + revert IncorrectRefundAmount(msg.value, inputs.gasRefund); + } + + token.safeTransfer(inputs.recipient, depositAmount - inputs.relayerFee); + if (inputs.relayerFee > 0) { + token.safeTransfer(inputs.relayer, inputs.relayerFee); + } + + if (inputs.gasRefund > 0) { + (bool success, ) = inputs.recipient.call{ value: inputs.gasRefund }(''); + if (!success) { + // return refund back to relayer if transfer unsuccessful + inputs.relayer.transfer(inputs.gasRefund); + } + } + } +} diff --git a/src/contracts/PrivateBank.sol b/src/contracts/PrivateBank.sol index 8257bd4..b3478a4 100644 --- a/src/contracts/PrivateBank.sol +++ b/src/contracts/PrivateBank.sol @@ -1,14 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; +import { ReentrancyGuard } from '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import { MerkleTree } from './MerkleTree.sol'; import { IHasher } from '../interfaces/IHasher.sol'; import { IVerifier } from '../interfaces/IVerifier.sol'; import { DepositAmountZero, InvalidCaller, InvalidMerkleRoot, AlreadySpent, DuplicateCommitment, FeeExceedsTransferValue, InvalidProof } from '../Errors.sol'; -// TODO: add back `nonReentrant` to `deposit` and `withdraw` - -abstract contract PrivateBank is MerkleTree { +abstract contract PrivateBank is MerkleTree, ReentrancyGuard { /// STATE /// SNARK verifier contract IVerifier public verifier; @@ -78,7 +77,7 @@ abstract contract PrivateBank is MerkleTree { /// @dev Deposit funds into the contract /// @param commitment commitment of (nullifier + secret) signed with user's registered public key - function deposit(bytes32 commitment) external payable { + function deposit(bytes32 commitment) external payable nonReentrant { // validity check if (commitments[commitment]) { revert DuplicateCommitment(); @@ -102,7 +101,7 @@ abstract contract PrivateBank is MerkleTree { /// @dev Withdraw a deposit by proving ownership of commmitment /// @param proof SNARK proof data /// @param inputs circuit public inputs - function withdraw(bytes calldata proof, Inputs memory inputs) external payable { + function withdraw(bytes calldata proof, Inputs memory inputs) external payable nonReentrant { // validity checks if (inputs.relayerFee > depositAmount) { revert FeeExceedsTransferValue(); From a2303a28b306ccfa5ee5907ddc00843dd6039c01 Mon Sep 17 00:00:00 2001 From: parketh Date: Thu, 16 Oct 2025 22:13:26 +0100 Subject: [PATCH 02/41] chore: forge fmt --- src/contracts/ERC20PrivateBank.sol | 70 ++++---- src/contracts/ETHPrivateBank.sol | 67 +++---- src/contracts/MerkleTree.sol | 182 +++++++++---------- src/contracts/PrivateBank.sol | 272 ++++++++++++++--------------- src/interfaces/IHasher.sol | 4 +- src/interfaces/IVerifier.sol | 2 +- 6 files changed, 297 insertions(+), 300 deletions(-) diff --git a/src/contracts/ERC20PrivateBank.sol b/src/contracts/ERC20PrivateBank.sol index 92af737..6164d4a 100644 --- a/src/contracts/ERC20PrivateBank.sol +++ b/src/contracts/ERC20PrivateBank.sol @@ -1,50 +1,46 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; -import { SafeERC20 } from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; -import { PrivateBank } from './PrivateBank.sol'; -import { ETHTransferredForERC20Deposit, IncorrectRefundAmount } from '../Errors.sol'; -import { IVerifier } from '../interfaces/IVerifier.sol'; -import { IHasher } from '../interfaces/IHasher.sol'; +import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import {PrivateBank} from "./PrivateBank.sol"; +import {ETHTransferredForERC20Deposit, IncorrectRefundAmount} from "../Errors.sol"; +import {IVerifier} from "../interfaces/IVerifier.sol"; +import {IHasher} from "../interfaces/IHasher.sol"; contract ERC20PrivateBank is PrivateBank { - using SafeERC20 for IERC20; - IERC20 public token; + using SafeERC20 for IERC20; + IERC20 public token; - constructor( - IVerifier _verifier, - IHasher _hasher, - uint32 _height, - uint256 _depositAmount, - IERC20 _token - ) PrivateBank(_verifier, _hasher, _height, _depositAmount) { - token = _token; - } - - function processDeposit() internal override { - if (msg.value != 0) { - revert ETHTransferredForERC20Deposit(); + constructor(IVerifier _verifier, IHasher _hasher, uint32 _height, uint256 _depositAmount, IERC20 _token) + PrivateBank(_verifier, _hasher, _height, _depositAmount) + { + token = _token; } - token.safeTransferFrom(msg.sender, address(this), depositAmount); - } - function processWithdraw(Inputs memory inputs) internal override { - if (msg.value != inputs.gasRefund) { - revert IncorrectRefundAmount(msg.value, inputs.gasRefund); + function processDeposit() internal override { + if (msg.value != 0) { + revert ETHTransferredForERC20Deposit(); + } + token.safeTransferFrom(msg.sender, address(this), depositAmount); } - token.safeTransfer(inputs.recipient, depositAmount - inputs.relayerFee); - if (inputs.relayerFee > 0) { - token.safeTransfer(inputs.relayer, inputs.relayerFee); - } + function processWithdraw(Inputs memory inputs) internal override { + if (msg.value != inputs.gasRefund) { + revert IncorrectRefundAmount(msg.value, inputs.gasRefund); + } + + token.safeTransfer(inputs.recipient, depositAmount - inputs.relayerFee); + if (inputs.relayerFee > 0) { + token.safeTransfer(inputs.relayer, inputs.relayerFee); + } - if (inputs.gasRefund > 0) { - (bool success, ) = inputs.recipient.call{ value: inputs.gasRefund }(''); - if (!success) { - // return refund back to relayer if transfer unsuccessful - inputs.relayer.transfer(inputs.gasRefund); - } + if (inputs.gasRefund > 0) { + (bool success,) = inputs.recipient.call{value: inputs.gasRefund}(""); + if (!success) { + // return refund back to relayer if transfer unsuccessful + inputs.relayer.transfer(inputs.gasRefund); + } + } } - } } diff --git a/src/contracts/ETHPrivateBank.sol b/src/contracts/ETHPrivateBank.sol index 1e34007..f1501ab 100644 --- a/src/contracts/ETHPrivateBank.sol +++ b/src/contracts/ETHPrivateBank.sol @@ -1,43 +1,46 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { PrivateBank } from './PrivateBank.sol'; -import { IVerifier } from '../interfaces/IVerifier.sol'; -import { IHasher } from '../interfaces/IHasher.sol'; -import { WrongAmountTransferred, EthReceivedForWithdraw, GasRefundReceivedForEthWithdraw, WithdrawFailed, RelayerFeePaymentFailed } from '../Errors.sol'; +import {PrivateBank} from "./PrivateBank.sol"; +import {IVerifier} from "../interfaces/IVerifier.sol"; +import {IHasher} from "../interfaces/IHasher.sol"; +import { + WrongAmountTransferred, + EthReceivedForWithdraw, + GasRefundReceivedForEthWithdraw, + WithdrawFailed, + RelayerFeePaymentFailed +} from "../Errors.sol"; contract ETHPrivateBank is PrivateBank { - constructor( - IVerifier _verifier, - IHasher _hasher, - uint32 _height, - uint256 _depositAmount - ) PrivateBank(_verifier, _hasher, _height, _depositAmount) {} + constructor(IVerifier _verifier, IHasher _hasher, uint32 _height, uint256 _depositAmount) + PrivateBank(_verifier, _hasher, _height, _depositAmount) + {} - function processDeposit() internal override { - if (msg.value != depositAmount) { - revert WrongAmountTransferred(msg.value, depositAmount); + function processDeposit() internal override { + if (msg.value != depositAmount) { + revert WrongAmountTransferred(msg.value, depositAmount); + } } - } - function processWithdraw(Inputs memory inputs) internal override { - // sanity checks - if (msg.value != 0) { - revert EthReceivedForWithdraw(); - } - if (inputs.gasRefund != 0) { - revert GasRefundReceivedForEthWithdraw(); - } + function processWithdraw(Inputs memory inputs) internal override { + // sanity checks + if (msg.value != 0) { + revert EthReceivedForWithdraw(); + } + if (inputs.gasRefund != 0) { + revert GasRefundReceivedForEthWithdraw(); + } - (bool success, ) = inputs.recipient.call{ value: depositAmount - inputs.relayerFee }(''); - if (!success) { - revert WithdrawFailed(); - } - if (inputs.relayerFee > 0) { - (success, ) = inputs.relayer.call{ value: inputs.relayerFee }(''); - if (!success) { - revert RelayerFeePaymentFailed(); - } + (bool success,) = inputs.recipient.call{value: depositAmount - inputs.relayerFee}(""); + if (!success) { + revert WithdrawFailed(); + } + if (inputs.relayerFee > 0) { + (success,) = inputs.relayer.call{value: inputs.relayerFee}(""); + if (!success) { + revert RelayerFeePaymentFailed(); + } + } } - } } diff --git a/src/contracts/MerkleTree.sol b/src/contracts/MerkleTree.sol index bb9f140..fe7395f 100644 --- a/src/contracts/MerkleTree.sol +++ b/src/contracts/MerkleTree.sol @@ -3,109 +3,109 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { IHasher } from '../interfaces/IHasher.sol'; -import { TreeHeightZero, TreeHeightOverflow, MerkleTreeFull } from '../Errors.sol'; +import {IHasher} from "../interfaces/IHasher.sol"; +import {TreeHeightZero, TreeHeightOverflow, MerkleTreeFull} from "../Errors.sol"; contract MerkleTree { - /// CONSTANTS - /// max height of merkle tree - /// TODO: consider if there is a hard limit to the max height - uint32 public constant MAX_HEIGHT = 32; - /// size of buffer for storing recent roots - uint32 public constant ROOT_HISTORY_SIZE = 30; + /// CONSTANTS + /// max height of merkle tree + /// TODO: consider if there is a hard limit to the max height + uint32 public constant MAX_HEIGHT = 32; + /// size of buffer for storing recent roots + uint32 public constant ROOT_HISTORY_SIZE = 30; - /// STATE - /// hasher contract - IHasher public hasher; - /// height of tree - uint32 public height; - /// circular buffer of most recent valid roots - mapping(uint256 => bytes32) public roots; - /// cursor for position in `roots` buffer - uint32 public currRootIndex = 0; - /// mapping of level of tree to latest inserted hash - mapping(uint256 => bytes32) public latestHashAtHeight; - /// cursor at which next leaf is inserted - uint32 public nextLeafIndex = 0; + /// STATE + /// hasher contract + IHasher public hasher; + /// height of tree + uint32 public height; + /// circular buffer of most recent valid roots + mapping(uint256 => bytes32) public roots; + /// cursor for position in `roots` buffer + uint32 public currRootIndex = 0; + /// mapping of level of tree to latest inserted hash + mapping(uint256 => bytes32) public latestHashAtHeight; + /// cursor at which next leaf is inserted + uint32 public nextLeafIndex = 0; - constructor(uint32 _height, IHasher _hasher) { - // validity checks - if (_height == 0) { - revert TreeHeightZero(); - } - if (_height > MAX_HEIGHT) { - revert TreeHeightOverflow(_height, MAX_HEIGHT); - } + constructor(uint32 _height, IHasher _hasher) { + // validity checks + if (_height == 0) { + revert TreeHeightZero(); + } + if (_height > MAX_HEIGHT) { + revert TreeHeightOverflow(_height, MAX_HEIGHT); + } - // init state - height = _height; - hasher = _hasher; - roots[0] = hasher.zeros(_height - 1); - for (uint32 i = 0; i < _height; i++) { - latestHashAtHeight[i] = hasher.zeros(i); + // init state + height = _height; + hasher = _hasher; + roots[0] = hasher.zeros(_height - 1); + for (uint32 i = 0; i < _height; i++) { + latestHashAtHeight[i] = hasher.zeros(i); + } } - } - /// @dev Insert leaf to merkle tree and update roots - /// @param leaf leaf to insert - /// @return index position at which leaf was inserted to tree - function insert(bytes32 leaf) internal returns (uint32 index) { - // validity check - uint32 cachedNextLeafIndex = nextLeafIndex; - if (cachedNextLeafIndex == uint32(2) ** height) { - revert MerkleTreeFull(); - } + /// @dev Insert leaf to merkle tree and update roots + /// @param leaf leaf to insert + /// @return index position at which leaf was inserted to tree + function insert(bytes32 leaf) internal returns (uint32 index) { + // validity check + uint32 cachedNextLeafIndex = nextLeafIndex; + if (cachedNextLeafIndex == uint32(2) ** height) { + revert MerkleTreeFull(); + } - // insert leaf and tree at each - uint32 currLeafIndex = cachedNextLeafIndex; - bytes32 latestHash = leaf; - bytes32 left; - bytes32 right; - for (uint32 h = 0; h < height; h++) { - if (currLeafIndex % 2 == 0) { - left = latestHash; - right = hasher.zeros(h); - latestHashAtHeight[h] = latestHash; - } else { - left = latestHashAtHeight[h]; - right = latestHash; - } - latestHash = hasher.hash(left, right); - currLeafIndex /= 2; - } + // insert leaf and tree at each + uint32 currLeafIndex = cachedNextLeafIndex; + bytes32 latestHash = leaf; + bytes32 left; + bytes32 right; + for (uint32 h = 0; h < height; h++) { + if (currLeafIndex % 2 == 0) { + left = latestHash; + right = hasher.zeros(h); + latestHashAtHeight[h] = latestHash; + } else { + left = latestHashAtHeight[h]; + right = latestHash; + } + latestHash = hasher.hash(left, right); + currLeafIndex /= 2; + } - // insert new root to circular buffer - uint32 newRootIndex = (currRootIndex + 1) % ROOT_HISTORY_SIZE; - currRootIndex = newRootIndex; - roots[newRootIndex] = latestHash; + // insert new root to circular buffer + uint32 newRootIndex = (currRootIndex + 1) % ROOT_HISTORY_SIZE; + currRootIndex = newRootIndex; + roots[newRootIndex] = latestHash; - // advance cursor - nextLeafIndex = cachedNextLeafIndex + 1; + // advance cursor + nextLeafIndex = cachedNextLeafIndex + 1; - return cachedNextLeafIndex; - } + return cachedNextLeafIndex; + } - /// @dev Whether the root exists in buffer - function isKnownRoot(bytes32 root) public view returns (bool) { - if (root == 0) { - return false; + /// @dev Whether the root exists in buffer + function isKnownRoot(bytes32 root) public view returns (bool) { + if (root == 0) { + return false; + } + uint32 cachedCurrRootIndex = currRootIndex; + uint32 i = cachedCurrRootIndex; + do { + if (root == roots[i]) { + return true; + } + if (i == 0) { + i = ROOT_HISTORY_SIZE; + } + i--; + } while (i != cachedCurrRootIndex); + return false; } - uint32 cachedCurrRootIndex = currRootIndex; - uint32 i = cachedCurrRootIndex; - do { - if (root == roots[i]) { - return true; - } - if (i == 0) { - i = ROOT_HISTORY_SIZE; - } - i--; - } while (i != cachedCurrRootIndex); - return false; - } - /// @dev Return current root - function getLastRoot() public view returns (bytes32) { - return roots[currRootIndex]; - } + /// @dev Return current root + function getLastRoot() public view returns (bytes32) { + return roots[currRootIndex]; + } } diff --git a/src/contracts/PrivateBank.sol b/src/contracts/PrivateBank.sol index b3478a4..c552a63 100644 --- a/src/contracts/PrivateBank.sol +++ b/src/contracts/PrivateBank.sol @@ -1,161 +1,159 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { ReentrancyGuard } from '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; -import { MerkleTree } from './MerkleTree.sol'; -import { IHasher } from '../interfaces/IHasher.sol'; -import { IVerifier } from '../interfaces/IVerifier.sol'; -import { DepositAmountZero, InvalidCaller, InvalidMerkleRoot, AlreadySpent, DuplicateCommitment, FeeExceedsTransferValue, InvalidProof } from '../Errors.sol'; +import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import {MerkleTree} from "./MerkleTree.sol"; +import {IHasher} from "../interfaces/IHasher.sol"; +import {IVerifier} from "../interfaces/IVerifier.sol"; +import { + DepositAmountZero, + InvalidCaller, + InvalidMerkleRoot, + AlreadySpent, + DuplicateCommitment, + FeeExceedsTransferValue, + InvalidProof +} from "../Errors.sol"; abstract contract PrivateBank is MerkleTree, ReentrancyGuard { - /// STATE - /// SNARK verifier contract - IVerifier public verifier; - /// fixed deposit amount - uint256 public depositAmount; - /// deposit commitments - mapping(bytes32 => bool) public commitments; - /// spent nullifier hashes (to prevent double spend) - mapping(bytes32 => bool) public nullifierHashes; - - /// TYPES - struct Inputs { - /// merkle root - bytes32 root; - /// hash of deposit nullifier (to prevent double spend) - bytes32 nullifierHash; - /// recipient of withdrawn funds - address payable recipient; - /// relayer submitting tx on behalf of user - address payable relayer; - /// fee paid to relayer, denominated in same token as depositAmount - uint256 relayerFee; - /// ETH refunded by relayer to recipient for excess gas paid - uint256 gasRefund; - } - - /// EVENTS - event Register(address indexed user, bytes publicKey); - event Deposit(address indexed user, bytes32 indexed commitment, uint32 index, uint256 timestamp); - event Withdraw( - address indexed recipient, - address indexed relayer, - bytes32 nullifierHash, - uint256 fee - ); - - /// @dev Constructor - /// @param _verifier address of SNARK verifier contract - /// @param _hasher the address of hasher contract - /// @param _height height of merkle tree - /// @param _depositAmount fixed deposit amount - constructor( - IVerifier _verifier, - IHasher _hasher, - uint32 _height, - uint256 _depositAmount - ) MerkleTree(_height, _hasher) { - if (_depositAmount == 0) { - revert DepositAmountZero(); + /// STATE + /// SNARK verifier contract + IVerifier public verifier; + /// fixed deposit amount + uint256 public depositAmount; + /// deposit commitments + mapping(bytes32 => bool) public commitments; + /// spent nullifier hashes (to prevent double spend) + mapping(bytes32 => bool) public nullifierHashes; + + /// TYPES + struct Inputs { + /// merkle root + bytes32 root; + /// hash of deposit nullifier (to prevent double spend) + bytes32 nullifierHash; + /// recipient of withdrawn funds + address payable recipient; + /// relayer submitting tx on behalf of user + address payable relayer; + /// fee paid to relayer, denominated in same token as depositAmount + uint256 relayerFee; + /// ETH refunded by relayer to recipient for excess gas paid + uint256 gasRefund; } - verifier = _verifier; - depositAmount = _depositAmount; - } - - /// @dev Register public key used to sign commitments for user - /// @param user depositing user - /// @param publicKey public key of keypair used to sign commitments - function register(address user, bytes memory publicKey) public { - if (user != msg.sender) { - revert InvalidCaller(); + + /// EVENTS + event Register(address indexed user, bytes publicKey); + event Deposit(address indexed user, bytes32 indexed commitment, uint32 index, uint256 timestamp); + event Withdraw(address indexed recipient, address indexed relayer, bytes32 nullifierHash, uint256 fee); + + /// @dev Constructor + /// @param _verifier address of SNARK verifier contract + /// @param _hasher the address of hasher contract + /// @param _height height of merkle tree + /// @param _depositAmount fixed deposit amount + constructor(IVerifier _verifier, IHasher _hasher, uint32 _height, uint256 _depositAmount) + MerkleTree(_height, _hasher) + { + if (_depositAmount == 0) { + revert DepositAmountZero(); + } + verifier = _verifier; + depositAmount = _depositAmount; } - // TODO: consider if useful to store mapping publicKey -> user + /// @dev Register public key used to sign commitments for user + /// @param user depositing user + /// @param publicKey public key of keypair used to sign commitments + function register(address user, bytes memory publicKey) public { + if (user != msg.sender) { + revert InvalidCaller(); + } - emit Register(user, publicKey); - } + // TODO: consider if useful to store mapping publicKey -> user - /// @dev Deposit funds into the contract - /// @param commitment commitment of (nullifier + secret) signed with user's registered public key - function deposit(bytes32 commitment) external payable nonReentrant { - // validity check - if (commitments[commitment]) { - revert DuplicateCommitment(); + emit Register(user, publicKey); } - // transfer ETH or tokens to contract - processDeposit(); - - // insert commitment to tree - uint32 index = insert(commitment); + /// @dev Deposit funds into the contract + /// @param commitment commitment of (nullifier + secret) signed with user's registered public key + function deposit(bytes32 commitment) external payable nonReentrant { + // validity check + if (commitments[commitment]) { + revert DuplicateCommitment(); + } - commitments[commitment] = true; + // transfer ETH or tokens to contract + processDeposit(); - // emit event - emit Deposit(msg.sender, commitment, index, block.timestamp); - } + // insert commitment to tree + uint32 index = insert(commitment); - /// @dev Implemented by child contract - function processDeposit() internal virtual; + commitments[commitment] = true; - /// @dev Withdraw a deposit by proving ownership of commmitment - /// @param proof SNARK proof data - /// @param inputs circuit public inputs - function withdraw(bytes calldata proof, Inputs memory inputs) external payable nonReentrant { - // validity checks - if (inputs.relayerFee > depositAmount) { - revert FeeExceedsTransferValue(); - } - if (nullifierHashes[inputs.nullifierHash]) { - revert AlreadySpent(); - } - if (!isKnownRoot(inputs.root)) { - revert InvalidMerkleRoot(); + // emit event + emit Deposit(msg.sender, commitment, index, block.timestamp); } - // verify proof - if ( - !verifier.verifyProof( - proof, - [ - uint256(inputs.root), - uint256(inputs.nullifierHash), - uint256(uint160(address(inputs.recipient))), - uint256(uint160(address(inputs.relayer))), - inputs.relayerFee, - inputs.gasRefund - ] - ) - ) { - revert InvalidProof(); + /// @dev Implemented by child contract + function processDeposit() internal virtual; + + /// @dev Withdraw a deposit by proving ownership of commmitment + /// @param proof SNARK proof data + /// @param inputs circuit public inputs + function withdraw(bytes calldata proof, Inputs memory inputs) external payable nonReentrant { + // validity checks + if (inputs.relayerFee > depositAmount) { + revert FeeExceedsTransferValue(); + } + if (nullifierHashes[inputs.nullifierHash]) { + revert AlreadySpent(); + } + if (!isKnownRoot(inputs.root)) { + revert InvalidMerkleRoot(); + } + + // verify proof + if (!verifier.verifyProof( + proof, + [ + uint256(inputs.root), + uint256(inputs.nullifierHash), + uint256(uint160(address(inputs.recipient))), + uint256(uint160(address(inputs.relayer))), + inputs.relayerFee, + inputs.gasRefund + ] + )) { + revert InvalidProof(); + } + + nullifierHashes[inputs.nullifierHash] = true; + + // transfer ETH or tokens to recipient + processWithdraw(inputs); + + // emit event + emit Withdraw(inputs.recipient, inputs.relayer, inputs.nullifierHash, inputs.relayerFee); } - nullifierHashes[inputs.nullifierHash] = true; + /// @dev Implemented by child contract + function processWithdraw(Inputs memory inputs) internal virtual; - // transfer ETH or tokens to recipient - processWithdraw(inputs); - - // emit event - emit Withdraw(inputs.recipient, inputs.relayer, inputs.nullifierHash, inputs.relayerFee); - } - - /// @dev Implemented by child contract - function processWithdraw(Inputs memory inputs) internal virtual; - - /// @dev Whether a deposit has already been spent - function isSpent(bytes32 nullifierHash) public view returns (bool) { - return nullifierHashes[nullifierHash]; - } + /// @dev Whether a deposit has already been spent + function isSpent(bytes32 nullifierHash) public view returns (bool) { + return nullifierHashes[nullifierHash]; + } - /** @dev whether an list of deposits has already spent */ - function isSpentArray( - bytes32[] calldata nullifierHashArray - ) external view returns (bool[] memory spent) { - spent = new bool[](nullifierHashArray.length); - for (uint256 i = 0; i < nullifierHashArray.length; i++) { - if (isSpent(nullifierHashArray[i])) { - spent[i] = true; - } + /** + * @dev whether an list of deposits has already spent + */ + function isSpentArray(bytes32[] calldata nullifierHashArray) external view returns (bool[] memory spent) { + spent = new bool[](nullifierHashArray.length); + for (uint256 i = 0; i < nullifierHashArray.length; i++) { + if (isSpent(nullifierHashArray[i])) { + spent[i] = true; + } + } } - } } diff --git a/src/interfaces/IHasher.sol b/src/interfaces/IHasher.sol index 243624c..1f894a0 100644 --- a/src/interfaces/IHasher.sol +++ b/src/interfaces/IHasher.sol @@ -2,6 +2,6 @@ pragma solidity ^0.8.24; interface IHasher { - function hash(bytes32 a, bytes32 b) external pure returns (bytes32); - function zeros(uint256 i) external pure returns (bytes32); + function hash(bytes32 a, bytes32 b) external pure returns (bytes32); + function zeros(uint256 i) external pure returns (bytes32); } diff --git a/src/interfaces/IVerifier.sol b/src/interfaces/IVerifier.sol index 744ea1a..d2b484f 100644 --- a/src/interfaces/IVerifier.sol +++ b/src/interfaces/IVerifier.sol @@ -2,5 +2,5 @@ pragma solidity ^0.8.24; interface IVerifier { - function verifyProof(bytes memory _proof, uint256[6] memory _input) external returns (bool); + function verifyProof(bytes memory _proof, uint256[6] memory _input) external returns (bool); } From 195f159ce32a78fb4c00bee3eec92ebeab3ffb99 Mon Sep 17 00:00:00 2001 From: parketh Date: Mon, 20 Oct 2025 10:02:37 +0100 Subject: [PATCH 03/41] fmt + inline comments --- foundry.toml | 5 + src/contracts/ERC20PrivateBank.sol | 70 +++---- src/contracts/ETHPrivateBank.sol | 66 +++---- src/contracts/MerkleTree.sol | 194 ++++++++++---------- src/contracts/PrivateBank.sol | 285 +++++++++++++++-------------- src/interfaces/IHasher.sol | 4 +- src/interfaces/IVerifier.sol | 2 +- 7 files changed, 329 insertions(+), 297 deletions(-) diff --git a/foundry.toml b/foundry.toml index 25b918f..e1ac33f 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,4 +3,9 @@ src = "src" out = "out" libs = ["lib"] +[fmt] +tab_width = 2 +bracket_spacing = true +line_length = 100 + # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/src/contracts/ERC20PrivateBank.sol b/src/contracts/ERC20PrivateBank.sol index 6164d4a..97dc0ee 100644 --- a/src/contracts/ERC20PrivateBank.sol +++ b/src/contracts/ERC20PrivateBank.sol @@ -1,46 +1,50 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import {PrivateBank} from "./PrivateBank.sol"; -import {ETHTransferredForERC20Deposit, IncorrectRefundAmount} from "../Errors.sol"; -import {IVerifier} from "../interfaces/IVerifier.sol"; -import {IHasher} from "../interfaces/IHasher.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { PrivateBank } from "./PrivateBank.sol"; +import { ETHTransferredForERC20Deposit, IncorrectRefundAmount } from "../Errors.sol"; +import { IVerifier } from "../interfaces/IVerifier.sol"; +import { IHasher } from "../interfaces/IHasher.sol"; contract ERC20PrivateBank is PrivateBank { - using SafeERC20 for IERC20; - IERC20 public token; + using SafeERC20 for IERC20; + IERC20 public token; - constructor(IVerifier _verifier, IHasher _hasher, uint32 _height, uint256 _depositAmount, IERC20 _token) - PrivateBank(_verifier, _hasher, _height, _depositAmount) - { - token = _token; - } + constructor( + IVerifier _verifier, + IHasher _hasher, + uint32 _height, + uint256 _depositAmount, + IERC20 _token + ) PrivateBank(_verifier, _hasher, _height, _depositAmount) { + token = _token; + } - function processDeposit() internal override { - if (msg.value != 0) { - revert ETHTransferredForERC20Deposit(); - } - token.safeTransferFrom(msg.sender, address(this), depositAmount); + function processDeposit() internal override { + if (msg.value != 0) { + revert ETHTransferredForERC20Deposit(); } + token.safeTransferFrom(msg.sender, address(this), depositAmount); + } - function processWithdraw(Inputs memory inputs) internal override { - if (msg.value != inputs.gasRefund) { - revert IncorrectRefundAmount(msg.value, inputs.gasRefund); - } + function processWithdraw(Inputs memory inputs) internal override { + if (msg.value != inputs.gasRefund) { + revert IncorrectRefundAmount(msg.value, inputs.gasRefund); + } - token.safeTransfer(inputs.recipient, depositAmount - inputs.relayerFee); - if (inputs.relayerFee > 0) { - token.safeTransfer(inputs.relayer, inputs.relayerFee); - } + token.safeTransfer(inputs.recipient, depositAmount - inputs.relayerFee); + if (inputs.relayerFee > 0) { + token.safeTransfer(inputs.relayer, inputs.relayerFee); + } - if (inputs.gasRefund > 0) { - (bool success,) = inputs.recipient.call{value: inputs.gasRefund}(""); - if (!success) { - // return refund back to relayer if transfer unsuccessful - inputs.relayer.transfer(inputs.gasRefund); - } - } + if (inputs.gasRefund > 0) { + (bool success,) = inputs.recipient.call{ value: inputs.gasRefund }(""); + if (!success) { + // return refund back to relayer if transfer unsuccessful + inputs.relayer.transfer(inputs.gasRefund); + } } + } } diff --git a/src/contracts/ETHPrivateBank.sol b/src/contracts/ETHPrivateBank.sol index f1501ab..4100b85 100644 --- a/src/contracts/ETHPrivateBank.sol +++ b/src/contracts/ETHPrivateBank.sol @@ -1,46 +1,46 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {PrivateBank} from "./PrivateBank.sol"; -import {IVerifier} from "../interfaces/IVerifier.sol"; -import {IHasher} from "../interfaces/IHasher.sol"; +import { PrivateBank } from "./PrivateBank.sol"; +import { IVerifier } from "../interfaces/IVerifier.sol"; +import { IHasher } from "../interfaces/IHasher.sol"; import { - WrongAmountTransferred, - EthReceivedForWithdraw, - GasRefundReceivedForEthWithdraw, - WithdrawFailed, - RelayerFeePaymentFailed + WrongAmountTransferred, + EthReceivedForWithdraw, + GasRefundReceivedForEthWithdraw, + WithdrawFailed, + RelayerFeePaymentFailed } from "../Errors.sol"; contract ETHPrivateBank is PrivateBank { - constructor(IVerifier _verifier, IHasher _hasher, uint32 _height, uint256 _depositAmount) - PrivateBank(_verifier, _hasher, _height, _depositAmount) - {} + constructor(IVerifier _verifier, IHasher _hasher, uint32 _height, uint256 _depositAmount) + PrivateBank(_verifier, _hasher, _height, _depositAmount) + { } - function processDeposit() internal override { - if (msg.value != depositAmount) { - revert WrongAmountTransferred(msg.value, depositAmount); - } + function processDeposit() internal override { + if (msg.value != depositAmount) { + revert WrongAmountTransferred(msg.value, depositAmount); } + } - function processWithdraw(Inputs memory inputs) internal override { - // sanity checks - if (msg.value != 0) { - revert EthReceivedForWithdraw(); - } - if (inputs.gasRefund != 0) { - revert GasRefundReceivedForEthWithdraw(); - } + function processWithdraw(Inputs memory inputs) internal override { + // sanity checks + if (msg.value != 0) { + revert EthReceivedForWithdraw(); + } + if (inputs.gasRefund != 0) { + revert GasRefundReceivedForEthWithdraw(); + } - (bool success,) = inputs.recipient.call{value: depositAmount - inputs.relayerFee}(""); - if (!success) { - revert WithdrawFailed(); - } - if (inputs.relayerFee > 0) { - (success,) = inputs.relayer.call{value: inputs.relayerFee}(""); - if (!success) { - revert RelayerFeePaymentFailed(); - } - } + (bool success,) = inputs.recipient.call{ value: depositAmount - inputs.relayerFee }(""); + if (!success) { + revert WithdrawFailed(); + } + if (inputs.relayerFee > 0) { + (success,) = inputs.relayer.call{ value: inputs.relayerFee }(""); + if (!success) { + revert RelayerFeePaymentFailed(); + } } + } } diff --git a/src/contracts/MerkleTree.sol b/src/contracts/MerkleTree.sol index fe7395f..038aabe 100644 --- a/src/contracts/MerkleTree.sol +++ b/src/contracts/MerkleTree.sol @@ -1,111 +1,119 @@ -// Adapted from Tornado Cash implementation - // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {IHasher} from "../interfaces/IHasher.sol"; -import {TreeHeightZero, TreeHeightOverflow, MerkleTreeFull} from "../Errors.sol"; +import { IHasher } from '../interfaces/IHasher.sol'; +import { TreeHeightZero, TreeHeightOverflow, MerkleTreeFull } from '../Errors.sol'; contract MerkleTree { - /// CONSTANTS - /// max height of merkle tree - /// TODO: consider if there is a hard limit to the max height - uint32 public constant MAX_HEIGHT = 32; - /// size of buffer for storing recent roots - uint32 public constant ROOT_HISTORY_SIZE = 30; - - /// STATE - /// hasher contract - IHasher public hasher; - /// height of tree - uint32 public height; - /// circular buffer of most recent valid roots - mapping(uint256 => bytes32) public roots; - /// cursor for position in `roots` buffer - uint32 public currRootIndex = 0; - /// mapping of level of tree to latest inserted hash - mapping(uint256 => bytes32) public latestHashAtHeight; - /// cursor at which next leaf is inserted - uint32 public nextLeafIndex = 0; + /////////////////////////// + // CONSTANTS + /////////////////////////// - constructor(uint32 _height, IHasher _hasher) { - // validity checks - if (_height == 0) { - revert TreeHeightZero(); - } - if (_height > MAX_HEIGHT) { - revert TreeHeightOverflow(_height, MAX_HEIGHT); - } + /// max height of merkle tree + /// TODO: consider if there is a hard limit to the max height + uint32 public constant MAX_HEIGHT = 32; + /// size of buffer for storing recent roots + uint32 public constant ROOT_HISTORY_SIZE = 30; - // init state - height = _height; - hasher = _hasher; - roots[0] = hasher.zeros(_height - 1); - for (uint32 i = 0; i < _height; i++) { - latestHashAtHeight[i] = hasher.zeros(i); - } - } + /////////////////////////// + // STATE + /////////////////////////// - /// @dev Insert leaf to merkle tree and update roots - /// @param leaf leaf to insert - /// @return index position at which leaf was inserted to tree - function insert(bytes32 leaf) internal returns (uint32 index) { - // validity check - uint32 cachedNextLeafIndex = nextLeafIndex; - if (cachedNextLeafIndex == uint32(2) ** height) { - revert MerkleTreeFull(); - } + /// hasher contract + IHasher public hasher; + /// height of tree + uint32 public height; + /// circular buffer of most recent valid roots + mapping(uint256 => bytes32) public roots; + /// cursor for position in `roots` buffer + uint32 public currRootIndex = 0; + /// mapping of level of tree to latest inserted hash + mapping(uint256 => bytes32) public latestHashAtHeight; + /// cursor at which next leaf is inserted + uint32 public nextLeafIndex = 0; - // insert leaf and tree at each - uint32 currLeafIndex = cachedNextLeafIndex; - bytes32 latestHash = leaf; - bytes32 left; - bytes32 right; - for (uint32 h = 0; h < height; h++) { - if (currLeafIndex % 2 == 0) { - left = latestHash; - right = hasher.zeros(h); - latestHashAtHeight[h] = latestHash; - } else { - left = latestHashAtHeight[h]; - right = latestHash; - } - latestHash = hasher.hash(left, right); - currLeafIndex /= 2; - } + /////////////////////////// + // FUNCTIONS + /////////////////////////// - // insert new root to circular buffer - uint32 newRootIndex = (currRootIndex + 1) % ROOT_HISTORY_SIZE; - currRootIndex = newRootIndex; - roots[newRootIndex] = latestHash; + constructor(uint32 _height, IHasher _hasher) { + // validity checks + if (_height == 0) { + revert TreeHeightZero(); + } + if (_height > MAX_HEIGHT) { + revert TreeHeightOverflow(_height, MAX_HEIGHT); + } - // advance cursor - nextLeafIndex = cachedNextLeafIndex + 1; + // init state + height = _height; + hasher = _hasher; + roots[0] = hasher.zeros(_height - 1); + for (uint32 i = 0; i < _height; i++) { + latestHashAtHeight[i] = hasher.zeros(i); + } + } - return cachedNextLeafIndex; + /// @dev Insert leaf to merkle tree and update roots + /// @param leaf leaf to insert + /// @return index position at which leaf was inserted to tree + function insert(bytes32 leaf) internal returns (uint32 index) { + // validity check + uint32 cachedNextLeafIndex = nextLeafIndex; + if (cachedNextLeafIndex == uint32(2) ** height) { + revert MerkleTreeFull(); } - /// @dev Whether the root exists in buffer - function isKnownRoot(bytes32 root) public view returns (bool) { - if (root == 0) { - return false; - } - uint32 cachedCurrRootIndex = currRootIndex; - uint32 i = cachedCurrRootIndex; - do { - if (root == roots[i]) { - return true; - } - if (i == 0) { - i = ROOT_HISTORY_SIZE; - } - i--; - } while (i != cachedCurrRootIndex); - return false; + // insert leaf and tree at each + uint32 currLeafIndex = cachedNextLeafIndex; + bytes32 latestHash = leaf; + bytes32 left; + bytes32 right; + for (uint32 h = 0; h < height; h++) { + if (currLeafIndex % 2 == 0) { + left = latestHash; + right = hasher.zeros(h); + latestHashAtHeight[h] = latestHash; + } else { + left = latestHashAtHeight[h]; + right = latestHash; + } + latestHash = hasher.hash(left, right); + currLeafIndex /= 2; } - /// @dev Return current root - function getLastRoot() public view returns (bytes32) { - return roots[currRootIndex]; + // insert new root to circular buffer + uint32 newRootIndex = (currRootIndex + 1) % ROOT_HISTORY_SIZE; + currRootIndex = newRootIndex; + roots[newRootIndex] = latestHash; + + // advance cursor + nextLeafIndex = cachedNextLeafIndex + 1; + + return cachedNextLeafIndex; + } + + /// @dev Whether the root exists in buffer + function isKnownRoot(bytes32 root) public view returns (bool) { + if (root == 0) { + return false; } + uint32 cachedCurrRootIndex = currRootIndex; + uint32 i = cachedCurrRootIndex; + do { + if (root == roots[i]) { + return true; + } + if (i == 0) { + i = ROOT_HISTORY_SIZE; + } + i--; + } while (i != cachedCurrRootIndex); + return false; + } + + /// @dev Return current root + function getLastRoot() public view returns (bytes32) { + return roots[currRootIndex]; + } } diff --git a/src/contracts/PrivateBank.sol b/src/contracts/PrivateBank.sol index c552a63..78c17d6 100644 --- a/src/contracts/PrivateBank.sol +++ b/src/contracts/PrivateBank.sol @@ -1,159 +1,174 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; -import {MerkleTree} from "./MerkleTree.sol"; -import {IHasher} from "../interfaces/IHasher.sol"; -import {IVerifier} from "../interfaces/IVerifier.sol"; -import { - DepositAmountZero, - InvalidCaller, - InvalidMerkleRoot, - AlreadySpent, - DuplicateCommitment, - FeeExceedsTransferValue, - InvalidProof -} from "../Errors.sol"; +import { ReentrancyGuard } from '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; +import { MerkleTree } from './MerkleTree.sol'; +import { IHasher } from '../interfaces/IHasher.sol'; +import { IVerifier } from '../interfaces/IVerifier.sol'; +import { DepositAmountZero, InvalidCaller, InvalidMerkleRoot, AlreadySpent, DuplicateCommitment, FeeExceedsTransferValue, InvalidProof } from '../Errors.sol'; abstract contract PrivateBank is MerkleTree, ReentrancyGuard { - /// STATE - /// SNARK verifier contract - IVerifier public verifier; - /// fixed deposit amount - uint256 public depositAmount; - /// deposit commitments - mapping(bytes32 => bool) public commitments; - /// spent nullifier hashes (to prevent double spend) - mapping(bytes32 => bool) public nullifierHashes; - - /// TYPES - struct Inputs { - /// merkle root - bytes32 root; - /// hash of deposit nullifier (to prevent double spend) - bytes32 nullifierHash; - /// recipient of withdrawn funds - address payable recipient; - /// relayer submitting tx on behalf of user - address payable relayer; - /// fee paid to relayer, denominated in same token as depositAmount - uint256 relayerFee; - /// ETH refunded by relayer to recipient for excess gas paid - uint256 gasRefund; + /////////////////////////// + // STATE + /////////////////////////// + + /// SNARK verifier contract + IVerifier public verifier; + /// fixed deposit amount + uint256 public depositAmount; + /// deposit commitments + mapping(bytes32 => bool) public commitments; + /// spent nullifier hashes (to prevent double spend) + mapping(bytes32 => bool) public nullifierHashes; + + /////////////////////////// + // TYPES + /////////////////////////// + + struct Inputs { + /// merkle root + bytes32 root; + /// hash of deposit nullifier (to prevent double spend) + bytes32 nullifierHash; + /// recipient of withdrawn funds + address payable recipient; + /// relayer submitting tx on behalf of user + address payable relayer; + /// fee paid to relayer, denominated in same token as depositAmount + uint256 relayerFee; + /// ETH refunded by relayer to recipient for excess gas paid + uint256 gasRefund; + } + + /////////////////////////// + // EVENTS + /////////////////////////// + + event Register(address indexed user, bytes publicKey); + event Deposit(address indexed user, bytes32 indexed commitment, uint32 index, uint256 timestamp); + event Withdraw( + address indexed recipient, + address indexed relayer, + bytes32 nullifierHash, + uint256 fee + ); + + /////////////////////////// + // METHODS + /////////////////////////// + + /// @dev Constructor + /// @param _verifier address of SNARK verifier contract + /// @param _hasher the address of hasher contract + /// @param _height height of merkle tree + /// @param _depositAmount fixed deposit amount + constructor( + IVerifier _verifier, + IHasher _hasher, + uint32 _height, + uint256 _depositAmount + ) MerkleTree(_height, _hasher) { + if (_depositAmount == 0) { + revert DepositAmountZero(); } - - /// EVENTS - event Register(address indexed user, bytes publicKey); - event Deposit(address indexed user, bytes32 indexed commitment, uint32 index, uint256 timestamp); - event Withdraw(address indexed recipient, address indexed relayer, bytes32 nullifierHash, uint256 fee); - - /// @dev Constructor - /// @param _verifier address of SNARK verifier contract - /// @param _hasher the address of hasher contract - /// @param _height height of merkle tree - /// @param _depositAmount fixed deposit amount - constructor(IVerifier _verifier, IHasher _hasher, uint32 _height, uint256 _depositAmount) - MerkleTree(_height, _hasher) - { - if (_depositAmount == 0) { - revert DepositAmountZero(); - } - verifier = _verifier; - depositAmount = _depositAmount; + verifier = _verifier; + depositAmount = _depositAmount; + } + + /// @dev Register public key used to sign commitments for user + /// @param user depositing user + /// @param publicKey public key of keypair used to sign commitments + function register(address user, bytes memory publicKey) public { + if (user != msg.sender) { + revert InvalidCaller(); } - /// @dev Register public key used to sign commitments for user - /// @param user depositing user - /// @param publicKey public key of keypair used to sign commitments - function register(address user, bytes memory publicKey) public { - if (user != msg.sender) { - revert InvalidCaller(); - } + // TODO: consider if useful to store mapping publicKey -> user - // TODO: consider if useful to store mapping publicKey -> user + emit Register(user, publicKey); + } - emit Register(user, publicKey); + /// @dev Deposit funds into the contract + /// @param commitment commitment of (nullifier + secret) signed with user's registered public key + function deposit(bytes32 commitment) external payable nonReentrant { + // validity check + if (commitments[commitment]) { + revert DuplicateCommitment(); } - /// @dev Deposit funds into the contract - /// @param commitment commitment of (nullifier + secret) signed with user's registered public key - function deposit(bytes32 commitment) external payable nonReentrant { - // validity check - if (commitments[commitment]) { - revert DuplicateCommitment(); - } + // transfer ETH or tokens to contract + processDeposit(); + + // insert commitment to tree + uint32 index = insert(commitment); - // transfer ETH or tokens to contract - processDeposit(); + commitments[commitment] = true; - // insert commitment to tree - uint32 index = insert(commitment); + // emit event + emit Deposit(msg.sender, commitment, index, block.timestamp); + } - commitments[commitment] = true; + /// @dev Implemented by child contract + function processDeposit() internal virtual; - // emit event - emit Deposit(msg.sender, commitment, index, block.timestamp); + /// @dev Withdraw a deposit by proving ownership of commmitment + /// @param proof SNARK proof data + /// @param inputs circuit public inputs + function withdraw(bytes calldata proof, Inputs memory inputs) external payable nonReentrant { + // validity checks + if (inputs.relayerFee > depositAmount) { + revert FeeExceedsTransferValue(); + } + if (nullifierHashes[inputs.nullifierHash]) { + revert AlreadySpent(); + } + if (!isKnownRoot(inputs.root)) { + revert InvalidMerkleRoot(); } - /// @dev Implemented by child contract - function processDeposit() internal virtual; - - /// @dev Withdraw a deposit by proving ownership of commmitment - /// @param proof SNARK proof data - /// @param inputs circuit public inputs - function withdraw(bytes calldata proof, Inputs memory inputs) external payable nonReentrant { - // validity checks - if (inputs.relayerFee > depositAmount) { - revert FeeExceedsTransferValue(); - } - if (nullifierHashes[inputs.nullifierHash]) { - revert AlreadySpent(); - } - if (!isKnownRoot(inputs.root)) { - revert InvalidMerkleRoot(); - } - - // verify proof - if (!verifier.verifyProof( - proof, - [ - uint256(inputs.root), - uint256(inputs.nullifierHash), - uint256(uint160(address(inputs.recipient))), - uint256(uint160(address(inputs.relayer))), - inputs.relayerFee, - inputs.gasRefund - ] - )) { - revert InvalidProof(); - } - - nullifierHashes[inputs.nullifierHash] = true; - - // transfer ETH or tokens to recipient - processWithdraw(inputs); - - // emit event - emit Withdraw(inputs.recipient, inputs.relayer, inputs.nullifierHash, inputs.relayerFee); + // verify proof + if ( + !verifier.verifyProof( + proof, + [ + uint256(inputs.root), + uint256(inputs.nullifierHash), + uint256(uint160(address(inputs.recipient))), + uint256(uint160(address(inputs.relayer))), + inputs.relayerFee, + inputs.gasRefund + ] + ) + ) { + revert InvalidProof(); } - /// @dev Implemented by child contract - function processWithdraw(Inputs memory inputs) internal virtual; + nullifierHashes[inputs.nullifierHash] = true; - /// @dev Whether a deposit has already been spent - function isSpent(bytes32 nullifierHash) public view returns (bool) { - return nullifierHashes[nullifierHash]; - } + // transfer ETH or tokens to recipient + processWithdraw(inputs); + + // emit event + emit Withdraw(inputs.recipient, inputs.relayer, inputs.nullifierHash, inputs.relayerFee); + } + + /// @dev Implemented by child contract + function processWithdraw(Inputs memory inputs) internal virtual; + + /// @dev Whether a deposit has already been spent + function isSpent(bytes32 nullifierHash) public view returns (bool) { + return nullifierHashes[nullifierHash]; + } - /** - * @dev whether an list of deposits has already spent - */ - function isSpentArray(bytes32[] calldata nullifierHashArray) external view returns (bool[] memory spent) { - spent = new bool[](nullifierHashArray.length); - for (uint256 i = 0; i < nullifierHashArray.length; i++) { - if (isSpent(nullifierHashArray[i])) { - spent[i] = true; - } - } + /// @dev Whether a list of deposit has already been spent + function isSpentArray( + bytes32[] calldata nullifierHashArray + ) external view returns (bool[] memory spent) { + spent = new bool[](nullifierHashArray.length); + for (uint256 i = 0; i < nullifierHashArray.length; i++) { + if (isSpent(nullifierHashArray[i])) { + spent[i] = true; + } } + } } diff --git a/src/interfaces/IHasher.sol b/src/interfaces/IHasher.sol index 1f894a0..243624c 100644 --- a/src/interfaces/IHasher.sol +++ b/src/interfaces/IHasher.sol @@ -2,6 +2,6 @@ pragma solidity ^0.8.24; interface IHasher { - function hash(bytes32 a, bytes32 b) external pure returns (bytes32); - function zeros(uint256 i) external pure returns (bytes32); + function hash(bytes32 a, bytes32 b) external pure returns (bytes32); + function zeros(uint256 i) external pure returns (bytes32); } diff --git a/src/interfaces/IVerifier.sol b/src/interfaces/IVerifier.sol index d2b484f..744ea1a 100644 --- a/src/interfaces/IVerifier.sol +++ b/src/interfaces/IVerifier.sol @@ -2,5 +2,5 @@ pragma solidity ^0.8.24; interface IVerifier { - function verifyProof(bytes memory _proof, uint256[6] memory _input) external returns (bool); + function verifyProof(bytes memory _proof, uint256[6] memory _input) external returns (bool); } From afd8ca864bc64fd874da0e8787376f798cbde3c4 Mon Sep 17 00:00:00 2001 From: parketh Date: Mon, 20 Oct 2025 10:20:01 +0100 Subject: [PATCH 04/41] chore: add remappings --- remappings.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 remappings.txt diff --git a/remappings.txt b/remappings.txt new file mode 100644 index 0000000..6fdbafd --- /dev/null +++ b/remappings.txt @@ -0,0 +1 @@ +@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/ From b2506eb9f8fe4bd4a1a1d3887e532cf67a4eee2e Mon Sep 17 00:00:00 2001 From: parketh Date: Mon, 20 Oct 2025 17:28:10 +0100 Subject: [PATCH 05/41] feat: Hasher lib --- .gitignore | 4 + hardhat.config.ts | 23 + package.json | 15 + script/keccak.ts | 19 + src/contracts/ERC20PrivateBank.sol | 16 +- src/contracts/ETHPrivateBank.sol | 25 +- src/contracts/MerkleTree.sol | 15 +- src/contracts/PrivateBank.sol | 9 +- src/contracts/mocks/MockHasher.sol | 14 + src/interfaces/IHasher.sol | 7 - src/libraries/Hasher.sol | 1640 +++++++++++++++++++++++ test/HasherLib.test.ts | 30 + tsconfig.json | 13 + types/circomlibjs.d.ts | 11 + yarn.lock | 1974 ++++++++++++++++++++++++++++ 15 files changed, 3767 insertions(+), 48 deletions(-) create mode 100644 hardhat.config.ts create mode 100644 package.json create mode 100644 script/keccak.ts create mode 100644 src/contracts/mocks/MockHasher.sol delete mode 100644 src/interfaces/IHasher.sol create mode 100644 src/libraries/Hasher.sol create mode 100644 test/HasherLib.test.ts create mode 100644 tsconfig.json create mode 100644 types/circomlibjs.d.ts create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore index 85198aa..cc99de9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,10 @@ +# Node files +node_modules/ + # Compiler files cache/ out/ +artifacts/ # Ignores development broadcast logs !/broadcast diff --git a/hardhat.config.ts b/hardhat.config.ts new file mode 100644 index 0000000..080a4c5 --- /dev/null +++ b/hardhat.config.ts @@ -0,0 +1,23 @@ +import { HardhatUserConfig } from 'hardhat/config' +import '@nomiclabs/hardhat-ethers' + +const config: HardhatUserConfig = { + solidity: { + version: '0.8.24', + settings: { + optimizer: { + enabled: true, + runs: 200, + }, + viaIR: false, + }, + }, + paths: { + sources: './src', + tests: './test', + cache: './cache', + artifacts: './artifacts', + }, +} + +export default config diff --git a/package.json b/package.json new file mode 100644 index 0000000..a701453 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "devDependencies": { + "@nomiclabs/hardhat-ethers": "^2.2.3", + "@openzeppelin/contracts": "^5.4.0", + "@types/chai": "^5.2.2", + "@types/mocha": "^10.0.10", + "@types/node": "^24.8.1", + "chai": "^6.2.0", + "circomlibjs": "^0.1.7", + "ethers": "^5.7.2", + "hardhat": "^2.24.2", + "ts-node": "^10.9.2", + "typescript": "^5.9.3" + } +} diff --git a/script/keccak.ts b/script/keccak.ts new file mode 100644 index 0000000..cae1d07 --- /dev/null +++ b/script/keccak.ts @@ -0,0 +1,19 @@ +import { keccak256, toUtf8Bytes } from 'ethers/lib/utils' + +const FIELD_P = BigInt( + '21888242871839275222246405745257275088548364400416034343698204186575808495617', +) + +const keccak = async (str: string) => { + const keccak = keccak256(toUtf8Bytes(str)) + const n = BigInt(keccak) + const bigint = n % FIELD_P + const hash = '0x' + bigint.toString(16).padStart(64, '0') + + return { + bigint, + hash, + } +} + +keccak('zero').then(console.log) diff --git a/src/contracts/ERC20PrivateBank.sol b/src/contracts/ERC20PrivateBank.sol index 97dc0ee..fdf644a 100644 --- a/src/contracts/ERC20PrivateBank.sol +++ b/src/contracts/ERC20PrivateBank.sol @@ -1,12 +1,11 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import { PrivateBank } from "./PrivateBank.sol"; -import { ETHTransferredForERC20Deposit, IncorrectRefundAmount } from "../Errors.sol"; -import { IVerifier } from "../interfaces/IVerifier.sol"; -import { IHasher } from "../interfaces/IHasher.sol"; +import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol'; +import { SafeERC20 } from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; +import { PrivateBank } from './PrivateBank.sol'; +import { ETHTransferredForERC20Deposit, IncorrectRefundAmount } from '../Errors.sol'; +import { IVerifier } from '../interfaces/IVerifier.sol'; contract ERC20PrivateBank is PrivateBank { using SafeERC20 for IERC20; @@ -14,11 +13,10 @@ contract ERC20PrivateBank is PrivateBank { constructor( IVerifier _verifier, - IHasher _hasher, uint32 _height, uint256 _depositAmount, IERC20 _token - ) PrivateBank(_verifier, _hasher, _height, _depositAmount) { + ) PrivateBank(_verifier, _height, _depositAmount) { token = _token; } @@ -40,7 +38,7 @@ contract ERC20PrivateBank is PrivateBank { } if (inputs.gasRefund > 0) { - (bool success,) = inputs.recipient.call{ value: inputs.gasRefund }(""); + (bool success, ) = inputs.recipient.call{ value: inputs.gasRefund }(''); if (!success) { // return refund back to relayer if transfer unsuccessful inputs.relayer.transfer(inputs.gasRefund); diff --git a/src/contracts/ETHPrivateBank.sol b/src/contracts/ETHPrivateBank.sol index 4100b85..cf5563e 100644 --- a/src/contracts/ETHPrivateBank.sol +++ b/src/contracts/ETHPrivateBank.sol @@ -1,21 +1,16 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { PrivateBank } from "./PrivateBank.sol"; -import { IVerifier } from "../interfaces/IVerifier.sol"; -import { IHasher } from "../interfaces/IHasher.sol"; -import { - WrongAmountTransferred, - EthReceivedForWithdraw, - GasRefundReceivedForEthWithdraw, - WithdrawFailed, - RelayerFeePaymentFailed -} from "../Errors.sol"; +import { PrivateBank } from './PrivateBank.sol'; +import { IVerifier } from '../interfaces/IVerifier.sol'; +import { WrongAmountTransferred, EthReceivedForWithdraw, GasRefundReceivedForEthWithdraw, WithdrawFailed, RelayerFeePaymentFailed } from '../Errors.sol'; contract ETHPrivateBank is PrivateBank { - constructor(IVerifier _verifier, IHasher _hasher, uint32 _height, uint256 _depositAmount) - PrivateBank(_verifier, _hasher, _height, _depositAmount) - { } + constructor( + IVerifier _verifier, + uint32 _height, + uint256 _depositAmount + ) PrivateBank(_verifier, _height, _depositAmount) {} function processDeposit() internal override { if (msg.value != depositAmount) { @@ -32,12 +27,12 @@ contract ETHPrivateBank is PrivateBank { revert GasRefundReceivedForEthWithdraw(); } - (bool success,) = inputs.recipient.call{ value: depositAmount - inputs.relayerFee }(""); + (bool success, ) = inputs.recipient.call{ value: depositAmount - inputs.relayerFee }(''); if (!success) { revert WithdrawFailed(); } if (inputs.relayerFee > 0) { - (success,) = inputs.relayer.call{ value: inputs.relayerFee }(""); + (success, ) = inputs.relayer.call{ value: inputs.relayerFee }(''); if (!success) { revert RelayerFeePaymentFailed(); } diff --git a/src/contracts/MerkleTree.sol b/src/contracts/MerkleTree.sol index 038aabe..dcaa13d 100644 --- a/src/contracts/MerkleTree.sol +++ b/src/contracts/MerkleTree.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { IHasher } from '../interfaces/IHasher.sol'; import { TreeHeightZero, TreeHeightOverflow, MerkleTreeFull } from '../Errors.sol'; +import { HasherLib } from '../libraries/Hasher.sol'; contract MerkleTree { /////////////////////////// @@ -19,8 +19,6 @@ contract MerkleTree { // STATE /////////////////////////// - /// hasher contract - IHasher public hasher; /// height of tree uint32 public height; /// circular buffer of most recent valid roots @@ -36,7 +34,7 @@ contract MerkleTree { // FUNCTIONS /////////////////////////// - constructor(uint32 _height, IHasher _hasher) { + constructor(uint32 _height) { // validity checks if (_height == 0) { revert TreeHeightZero(); @@ -47,10 +45,9 @@ contract MerkleTree { // init state height = _height; - hasher = _hasher; - roots[0] = hasher.zeros(_height - 1); + roots[0] = HasherLib.zeros(_height - 1); for (uint32 i = 0; i < _height; i++) { - latestHashAtHeight[i] = hasher.zeros(i); + latestHashAtHeight[i] = HasherLib.zeros(i); } } @@ -72,13 +69,13 @@ contract MerkleTree { for (uint32 h = 0; h < height; h++) { if (currLeafIndex % 2 == 0) { left = latestHash; - right = hasher.zeros(h); + right = HasherLib.zeros(h); latestHashAtHeight[h] = latestHash; } else { left = latestHashAtHeight[h]; right = latestHash; } - latestHash = hasher.hash(left, right); + latestHash = HasherLib.hash(left, right); currLeafIndex /= 2; } diff --git a/src/contracts/PrivateBank.sol b/src/contracts/PrivateBank.sol index 78c17d6..f123b7b 100644 --- a/src/contracts/PrivateBank.sol +++ b/src/contracts/PrivateBank.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.24; import { ReentrancyGuard } from '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import { MerkleTree } from './MerkleTree.sol'; -import { IHasher } from '../interfaces/IHasher.sol'; import { IVerifier } from '../interfaces/IVerifier.sol'; import { DepositAmountZero, InvalidCaller, InvalidMerkleRoot, AlreadySpent, DuplicateCommitment, FeeExceedsTransferValue, InvalidProof } from '../Errors.sol'; @@ -59,15 +58,9 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { /// @dev Constructor /// @param _verifier address of SNARK verifier contract - /// @param _hasher the address of hasher contract /// @param _height height of merkle tree /// @param _depositAmount fixed deposit amount - constructor( - IVerifier _verifier, - IHasher _hasher, - uint32 _height, - uint256 _depositAmount - ) MerkleTree(_height, _hasher) { + constructor(IVerifier _verifier, uint32 _height, uint256 _depositAmount) MerkleTree(_height) { if (_depositAmount == 0) { revert DepositAmountZero(); } diff --git a/src/contracts/mocks/MockHasher.sol b/src/contracts/mocks/MockHasher.sol new file mode 100644 index 0000000..99e335a --- /dev/null +++ b/src/contracts/mocks/MockHasher.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import { HasherLib } from '../../libraries/Hasher.sol'; + +contract MockHasher { + function hash(bytes32 left, bytes32 right) external pure returns (bytes32) { + return HasherLib.hash(left, right); + } + + function zeros(uint256 i) external pure returns (bytes32) { + return HasherLib.zeros(i); + } +} diff --git a/src/interfaces/IHasher.sol b/src/interfaces/IHasher.sol deleted file mode 100644 index 243624c..0000000 --- a/src/interfaces/IHasher.sol +++ /dev/null @@ -1,7 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; - -interface IHasher { - function hash(bytes32 a, bytes32 b) external pure returns (bytes32); - function zeros(uint256 i) external pure returns (bytes32); -} diff --git a/src/libraries/Hasher.sol b/src/libraries/Hasher.sol new file mode 100644 index 0000000..a295277 --- /dev/null +++ b/src/libraries/Hasher.sol @@ -0,0 +1,1640 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +library HasherLib { + uint256 internal constant FIELD_SIZE = + 21888242871839275222246405745257275088548364400416034343698204186575808495617; + uint256 internal constant ZERO = + 0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8; // keccak('zero') + + function hash(bytes32 left, bytes32 right) internal pure returns (bytes32) { + uint256 r = uint256(left); + uint256 c = 0; + (r, c) = mimcSponge(r, c); + r = addmod(r, uint256(right), FIELD_SIZE); + (r, c) = mimcSponge(r, c); + + return bytes32(r); + } + + function zeros(uint256 i) internal pure returns (bytes32) { + if (i == 0) { + return bytes32(ZERO); + } else if (i == 1) { + return 0x0ea9c501b3fdfe2ffd8062997a2f847de55a5743992e6bb815bfd008f83701b6; + } else if (i == 2) { + return 0x1b0ec50e0db3b049e6529f27d3345314975bdf50fd74e876506c5bd99463a0e2; + } else if (i == 3) { + return 0x005a56864b1b0c01152eecea75c19bd56fe33ae816decfa5ddd3641b9d9b4bf8; + } else if (i == 4) { + return 0x04c88c4ef43a38c62db0d8057763f2dc687fcf6b710d0779e9c5adabd2feeb1c; + } else if (i == 5) { + return 0x17759758524a3bbf2ce748d4a4178ab6a7a6d252143bda097a0673232a569dfc; + } else if (i == 6) { + return 0x25df1e2387a112355ba3932d0c86491ab0c23d6b8d4257a00bb295b61de3c70b; + } else if (i == 7) { + return 0x0fdb13e84469019ae8acf806899848bbe72413da4a3ef55da7f2af8628d325f9; + } else if (i == 8) { + return 0x0423e0aa620bd48d796b161e82971770afc9bd2e9265d78e537ad24e1c45e70e; + } else if (i == 9) { + return 0x1b85d917bdb0b73ab51bc40e11a39cf79e810b8bfe376ae508cf7bad921de2e5; + } else if (i == 10) { + return 0x023408243a0e6aab1c9460c5767b3687b0a7d134537516688fa27e1ec9f3e355; + } else if (i == 11) { + return 0x136bece97be5bb2a8520ef1a70701ae9466247545058e7a07042321065d34160; + } else if (i == 12) { + return 0x144a9f5ecbb09cbbb49a724c4019de64bb53f13ee5de2dd043d51be328791224; + } else if (i == 13) { + return 0x1a51dd5998f06a61b280d926efdee8b65e3239b509d05aad06fe53b9ee9867a7; + } else if (i == 14) { + return 0x2691927a8228d7be14bd9f43f283d376a6f450bc9480facae1ccacefb3a74f2b; + } else if (i == 15) { + return 0x27aa787af1eef3ec4bbb95bff2b62aecdbf69c17ae648d29f85b620a88bd6502; + } else if (i == 16) { + return 0x2e7fdc8c615e606fb06e73a122f85dbad00e30f70519e9a8976e4d251264910d; + } else if (i == 17) { + return 0x11484cefa2cab012d7909db746a290a91da521147b821fba7cf91da732c8ab89; + } else if (i == 18) { + return 0x217506ccb8c5d5f310e24d2bd72d31952a42b84e6004ffdfde79e4dddcabc108; + } else if (i == 19) { + return 0x22e9ad37f3194eb232e09093f69972d61c19eb0a27a8b7001b88e58302742903; + } else if (i == 20) { + return 0x14321b25c647dc0c64d92090cdfa0eb8ce088987a37cb40f5e05510ae1400e10; + } else if (i == 21) { + return 0x0ba0d93975defb8ae03396a8141acc70de9e4ca5e55047ba7e4e7c888671b3d8; + } else if (i == 22) { + return 0x2d7e6e5395e15bd58e51ee2deb86c15a1dda38bd67cf6ffbdb4c7ea2d25d58f6; + } else if (i == 23) { + return 0x021dc1decd4231b79cdb623e260bd051bb5155b366cdf7e3f1a8c71bbf1b795e; + } else if (i == 24) { + return 0x0af1f87b6110f02d9cb0d513cf6304c5c74e5f0558525ddf459ca5517a58d508; + } else if (i == 25) { + return 0x1b27f58915d32310c0b1067e3004775458f06a38921063838c1e0b96b5129edb; + } else if (i == 26) { + return 0x207c947a90b67e533c627ee26b7d051c031d85f9b944135e570fa6475efc9b22; + } else if (i == 27) { + return 0x2707db5c512c7fe5c46e83cd1cedbb4ec3b1dcf85c12b4093354141b8da4131c; + } else if (i == 28) { + return 0x0358079acfebd7c5ec01c9802400adc74e85927dbfa79bda1430f2733a14036f; + } else if (i == 29) { + return 0x1bae8aac01cbc7f40fa2c39c828e5d33d4745a2095002690ecc32e9a93de2601; + } else if (i == 30) { + return 0x10fd326b8ff2bd71772afd12aa7dea1fd217324166e096e48a2ff5b4e90722c0; + } else if (i == 31) { + return 0x177ac4fce1769abebed9f508e1ee2e47fd75020f2e648e3fe7f0e8718ff6c6a1; + } + revert('Invalid index'); + } + + function mimcSponge(uint256 inxL, uint256 inxR) internal pure returns (uint256 xL, uint256 xR) { + unchecked { + assembly { + let _xL := inxL + let _xR := inxR + let q := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 + let a := 0 + let b := mulmod(_xL, _xL, q) + let c := mulmod(b, b, q) + let d := mulmod(c, _xL, q) + let e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0fbe43c36a80e36d7c7c584d4f8f3759fb51f0d66065d8a227b688d12488c5d4, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x9c48cd3e00a6195a253fc009e60f249456f802ff9baf6549210d201321efc1cc, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x27c0849dba2643077c13eb42ffb97663cdcecd669bf10f756be30bab71b86cf8, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x2bf76744736132e5c68f7dfdd5b792681d415098554fd8280f00d11b172b80d2, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x33133eb4a1a1ab45037c8bdf9adbb2999baf06f20a9c95180dc4ccdcbec58568, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x588bb66012356dbc9b059ef1d792b563d6c18624dddecc3fe4583fd3551e9b30, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x71bc3e244e1b92911fe7f53cf523e491fd6ff487d59337a1d92f92668c4f4c36, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd1808e2b039fd010c489768f78d7499938ccc0858f3295151787cfe8b7e40be1, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x76978af3ded437cf41b3faa40cd6bcfce94f27f4abcc3ed34be19abd2c4537d0, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0a9baee798a320b0ca5b1cf888386d1dc12c13b38e10225aa4e9f03069a099f5, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xb79dbf6050a03b16c3ade8d77e11c767d2251af9cdbd6cdf9a8a0ee921b32c79, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xa74bbcf5067f067faec2cce4b98d130d7927456f5c5f6c00e0f5406a24eb8b19, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xab7ab080d4c4018bda6ecc8bd67468bc4619ba12f25b0da879a639c758c8855d, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xe6a5b797c2bba7e9a873b37f5c41adc47765e9be4a1f0e0650e6a24ad2268763, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x6270ae87cf3d82cf9c0b5f428466c429d7b7cbe234cecff39969171af006016c, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x9951c9f6e76d636b52f7600d979ca9f3b643dfbe9551c83b31542830321b2a66, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x4119469e44229cc40c4ff555a2b6f6b39961088e741e3c20a3c9b47f130c5550, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x5d795e02bbaf90ff1f384741e5f18f8b644a0080441315d0e5b3c8123452a0b0, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x281e90a515e6409e9177b4f297f8049ce3d4c3659423c48b3fd64e83596ff101, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x424185c60a21e84970f7d32cacaa2725aa8a844caea7ed760d2b965af1bf3e7d, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd96fcbc3960614ea887da609187a5dada2e1b829f23309a6375212cea1f25c09, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xfde84026d7c294300af18f7712fc3662f43387ae8cf7fdda1f9a810f4b24bcf2, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x3a9d568575846aa6b8a890b3c237fd0447426db878e6e25333b8eb9b386195c1, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x55a2aa32c84a4cae196dd4094b685dd11757470a3be094d98eea73f02452aa36, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xcbc9481380978d29ebc5b0a8d4481cd2ef654ee800907adb3d38dc2fd9265fab, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x24e53af71ef06bacb76d3294c11223911e9d177ff09b7009febc484add0beb74, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xdbd44e16108225766dac3e5fe7acbe9df519bbba97380e5e9437a90658f21393, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xc6f434863c79013bb2c202331e04bccea2251c1ff6f191dc2afa23e6f6d28e4e, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x3490eeb39a733c0e8062d87f981ae65a8fccf25c448f4455d27db3915351b066, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x30b89830ff7ade3558a5361a24869130ce1fcce97211602962e34859525dac4f, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x29bae21b579d080a75c1694da628d0ecfd83efc9c8468704f410300062f64ca9, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xe326499de0476e719915dd1c661ef4550723d4aee9ee9af224edd208790fce44, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x8c45208b8baa6f473821415957088c0b7e72a465f460b09ece2d270aee2f1841, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xfe2ad454f451348f26ce2cc7e7914aef3eb96e8f89a4619a1dc7d11f8401c352, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0929db368ef2af2d29bca38845325b0b7a820a4889e44b5829bbe1ed47fd4d52, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x16531d424b0cbaf9abbf2d2acde698462ea4555bf32ccf1bbd26697e905066f6, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xf5c30d247f045ff6d05cf0dd0a49c9823e7a24b0d751d3c721353b96f29d76f6, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x6eb7a3614056c230c6f171370fdd9d1048bb00b2cdd1b2721d11bdda5023f486, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0ee9c4621642a272f710908707557498d25a6fdd51866da5d9f0d205355a6189, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x78ca1cb1c7f6c6894d1cf94f327b8763be173151b6b06f99dfc6a944bb5a72f0, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x5d24d0b1b304d05311ce0f274b0d93746a4860ed5cdd8d4348de557ea7a5ee7a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x77423dabd1a3cddc8691438fc5891e3fd49ac0f3e21aaf249791bfde1303d2f3, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0642e8800a48cc04c0168232c6f542396597a67cf395ad622d947e98bb68697a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xc1e7d3cbbc4c35b7490647d8402e56d334336943bda91fe2d34ca9727c0e3df5, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x8d6fb1730335204f38f85e408ac861e76f24349ab6ee0469c22e19350bb24fe1, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x67d0faf5f0db32a1b60e13dc4914246b9edac7990fb4990b19aa86815586441a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x2605b9b909ded1b04971eae979027c4e0de57f3b6a60d5ed58aba619c34749ce, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd276890b2c205db85f000d1f5111ed8f177e279cae3e52862780f04e846228d0, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x2ac5905f9450a21ef6905ed5951a91b3730e3a2e2d62b50bdeb810015d50376b, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x7a366839f0291ca54da674ac3f0e1e9aa8b687ba533926cb40268039e57b967a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x67ab0f3466989c3dbbe209c37ec272ba83984ba6e445be6d472b63e3ca7270e3, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0e786007d0ce7e28a90e31d3263887d40c556dec88fcb8b56bc9e9c05ecc0c29, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0b814ed99bd00eca389b0022663dbfddfbfa15e321c19abcf1eaf9556075fb68, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x65c0321ba26fcee4fdc35b4999b78ceb54dcaf9fec2e3bdea98e9f82925c0932, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xab2d2a929601f9c3520e0b14aaa6ba9f1e79821a5b768919670a4ea970722bf4, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xcdd2e0744d4af1a81918de69ec12128a5871367303ff83ed764771cbbdf65023, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x74527d0c0868f2ec628086b874fa66a7347d3d3b918d2e07a5f33e1067e8ac58, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x1c6bf6ac0314caead23e357bfcbbaa17d670672ae3a475f80934c716f10aca25, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x3c4007e286f8dc7efd5d0eeb0e95d7aa6589361d128a0cccb17b554c851a6432, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xae468a86a5a7db7c763a053eb09ac1a02809ce095258c88101ee319e12b0697e, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x9333e3d052b7c77fcac1eb366f610f6f97852242b1317a87b80f3bbc5c8c2d1d, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x52ec1d675cf5353153f6b628414783ca6b7fc0fe01948ca206daad712296e395, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x13ceeeb301572b4991076750e11ea7e7fcbfee454d90dc1763989004a1894f93, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x8505737e7e94939a08d8cda10b6fbbbf879b2141ae7eabc30fcd22405135fe64, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x6127db7ac5200a212092b66ec2bfc63653f4dc8ac66c76008fef885258a258b5, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x12692a7d808f44e31d628dbcfea377eb073fb918d7beb8136ea47f8cf094c88c, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x260e384b1268e3a347c91d6987fd280fa0a275541a7c5be34bf126af35c962e0, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd88c3b01966d90e713aee8d482ceaa6925311d2342e1a5aca4fcd2f44b6daddc, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xb87e868affd91b078a87fa75ac9332a6cf23587d94e20c3262db5e91f30bf04b, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xb5ba5f8acad1a950a3bbf2201055cd3ea27056c0c53f0c4c97f33cda8dbfe909, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x59ca814b49e00d7b3118c53a2986ded128584acd7428735e08ade6661c457f75, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0fc4c0bea813a223fd510c07f7bbe337badd4bcf28649a0d378970c2a15b3aa5, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0053f1ea6dd60e7a6db09a00be77549ff3d4ee3737be7fb42052ae1321f667c3, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xeb937077bb10c8fe38716d4e38edc1f9e7b18c6414fef85fe7e9c5567baa4a04, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xbacb14c0f1508d828f7fd048d716b8044aec7f0fb48e85e717bf532db9725207, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x4ca0abb8beb7cff572a0c1e6f58e080e1bb243d497a3e74538442a4555ad40be, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xda9eefd411e590d7e44592cce298af87b2c62aa3cc8bb137aa99ca8d4aa551b5, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x153dae43cef763e7a2fc9846f09a2973b0ad9c35894c220699bcc2954501c6bd, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd4ed2a09375813b4fb504c7a9ba13110bdd8549a47349db82c15a434c090e87b, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0063a5c4c9c12dcf4bae72c69f3a225664469503d61d9eae5d9553bfb006095b, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xdc8a4d35ad28e59dd3713b45985cd3b70e37ccc2be42086f1ea078fe2dc9d82d, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x486ba219308f0c847b22fcb4449f8855192536c01b8057904e81c1c7814f483b, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x34d9604140a1ac9fdb204285b9fe1b303c281af2fc5fb362f6577282b423bcf3, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xc1681959ec4bc3656911db2b2f56aa4db709c26f1a0a25c879286e37f437465d, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xfcd849f3b5f9e4368af75619fb27f2e335adbb9b44988f17c4d389fa751ad47a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xf5f7fc22ad64c8e7c1e005110e13f4f1c6b1f8f8cc59000db0e3bb38f99554a5, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xa9133b8a20fbae4633ec5f82cb47a38ae1877d12d1febb23982c7c808aa53175, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xf4827c5c7b61141cc31b75984bb3ed16ed579e5b72e32a1289b63ab55eaf8c12, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xcca361819ffefe3e50fe34c91a322c9405f4e5a168c1fc0a0a1883993e32c9f4, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x6656088842bfc9e325a532784d3362cecfa86f9c7b208a6b499836ebe48ff157, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x00129c7cd00e42ed05a37dbceb80d47b65e1d750ef2148278a54723fdf42c4cc, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xa85b235631b786f85cd46f7768f6c71ae004ad267ae59bdf929ada149b195888, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x34df65a82686be09c5b237911abf237a9887c1a418f279ac79b446d7d311f5ea, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x815a850c3989df9ca6231e0bdd9916fc0e076f2c6c7f0f260a846d0179f9c32d, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x50fb0940848a67aee83d348421fadd79aefc7a2adabeec6e64904ebe1bf63e7d, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xbab63a16273599f8b66895461e62a19ff0d103693be771d93e3691bba89cdd8d, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x6931a091756e0bc709ebecfffba5038634c5b3d5d0c5876dd72aac67452db8a2, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x55559b8bb79db8809c46ee627f1b5ce1d8e6d89bf94a9987a1407759d1ba8963, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xa9a1a11b2979018cb155914d09f1df19b7ffec241e8b2487b6f6272a56a44a0a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xf83293400e7bccea4bb86dcb0d5ca57fa2466e13a572d7d3531c6fa491cb0f1b, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xb7cb5742b6bc5339624d3568a33c21f31b877f8396972582028da999abf249f2, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xf56efb400f8500b5c5bf811c65c86c7ed2e965f14f1a69bca436c0c60b79f465, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd7c4427998d9c440f849dcd75b7157996eaad1b9a1d58cc2441931300e26eb22, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xca5ed18ad53e33fdc3ae8cf353ff3f6dd315f60060442b74f6b614b24ebd4cc3, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x9ad3e9376c97b194a0fbf43e22a3616981d777365c765ead09a1d033fdf536b7, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xc6daeff5769a06b26fe3b8fef30df07b1387373a7814cef364fe1d6059eaf54a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xc20a78398345c6b8cf439643dab96223bf879c302648293eaf496fee5c978c66, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x589ca65b6cf0e90653c06dddc057dc61ba2839974569051c98b43e8618716efb, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x83064161f127d8c59fc73625957e21630dc6dc99e5443f6ce37ecd6bf28e69b7, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x46d0ba662b50100b9a3af52052f68932feec1d12290b2033c4f49148893d8ba3, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x18dd55b4a83a53f2ee578eb3e6d26f594824d44670fc3f4de80642344d15c09a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x9fb5b594f48bc58b345ab90ded705920a7274b8e070eee8ce8cf90c72c3604b6, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x1901d8f4f2c8449128e00663978f2050f2eb1cd6acb60d9d09c57c5d46ee54fe, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x5ec56789beab24ef7ee32f594d5fc561ec59dfeb93606dc7dcc6fe65133a7db4, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x01c0b2cbe4fa9877a3d08eb67c510e8630da0a8beda94a6d9283e6f70d268bc5, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0b1d85acd9031a9107350eed946a25734e974799c5ba7cff13b15a5a623a25f0, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x204497d1d359552905a2fe655f3d6f94926ea92d12cdaa6556ec26362f239f64, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xe075f7edc6631a8d7ffe33019f44fc91f286236d5a5f90f16de4791b72a2a5f0, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x243f46e353354256ab8fe0ca4e9230dfc330bc163e602dfeaf307c1d1a7264b9, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd448ae5e09625fa1fcfd732fc9cd8f06e4c33b81f0a9240c83da56f41e9ecceb, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x2f312eef69a33d9fa753c08840275692a03432b3e6da67f9c59b9f9f4971cd56, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x5f333996af231bd5a293137da91801e191a6f24eb532ad1a7e6e9a2ad0efbc00, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xa8f771e0383a832dc8e2eaa8efabda300947acaf0684fabddf8b4abb0abd8a62, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x9ff0b3d7a4643596f651b70c1963cc4fa6c46018d78f05cb2c5f187e25df83a9, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x9c373b704838325648273734dcdf962d7c156f431f70380ba4855832c4a238b8, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xea2afa02604b8afeeb570f48a0e97a5e6bfe9613394b9a6b0026ecd6cec8c33a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x68892258cd8eb43b71caa6d6837ec9959bfdfd72f25c9005ebaffc4011f8a7bf, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xf2824f561f6f82e3c1232836b0d268fa3b1b5489edd39a5fe1503bfc7ca91f49, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x164eda75fda2861f9d812f24e37ac938844fbe383c243b32b9f66ae2e76be719, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xf0a6fc431f5bf0dd1cca93b8b65b3f72c91f0693e2c74be9243b15abb31afcc0, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xe68db66ba891ef0cd527f09ec6fff3ec0a269cf3d891a35ec13c902f70334b4f, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x3a44a5b102f7883a2b8630a3cae6e6db2e6e483bb7cfeb3492cbd91793ef598e, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x43939fe8ef789acb33cbf129ba8a3aa1bd61510a178022a05177c9c5a1c59bf1, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x936fe3b66dfda1bc5a7aae241b4db442858bd720c1d579c0c869f273cd55d774, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x3490fcaa8ffa37f35dc67ae006e81352c7103945417b8e4b142afcaefa344b85, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xcae66096cff344caca53ffe0e58aafeb468bd174f00d8abc425b2099c0881874, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xc7d05783a41bc14f3c9a45384b6d5e2547c5b6a224c8316910b208f2718a70ab, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x5ac6b9ba94040d5692b865b6677b60ef3201b5c2121699f70beb9f9b2528a026, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xa902a3d4d9ecbfb9b2c76fddf780554bf93cad97b244e805d3adb94e18162900, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xe9df91ffeeb086a4d26041c29dac6fca1d56a4d022fe34b38831267395b98d27, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x862646f851d91a8840ad9ee711f12ec13b3e8f980ff5ef5ee43ca4520d57def7, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x30b7381c9725b9db07816baf8524943a79cea135807c84cce0833485c11e0c2e, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x96afc10c5cedaddbda99df79387397c9be74a5b50f3a0c04ccb68d4e0f3a989f, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x3543da80d10da251c548776fe907c4ef89993d62e0062ae5c0496fcb851c3661, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xe5140fe26d8b008430fccd50a68e3e11c1163d63b6d8b7cc40bc6f3c1d0b1b06, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xfefdf1872e4475e8bbb0ef6fab7f561bff121314695c433bd4c29ec118060c96, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x6bb8c9f3d57b18e002df059db1e6a5d42ad566f153f18460774f68ac26509400, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x5415122d50b26f4fab5784004c56cf03f128f825ad2236f4b3d51f74737bd973, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x00e115c4a98efae6a3a5ecc873b0cef63ccd5b515710a3ab03ec52218f784dc9, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xda7d525427bad87b88238657c21331245578bc76aa6240b7f972382537a202ab, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x83332e8b34505b83010270dc795290a2f515b8f89c163acecdf4799df04c62f8, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xb09ecb6033d1a065f17a61066cd737d0c3c5873b51c3ab0a285e26939e62aa18, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x24e65c718938c2b937378e7435332174329730bde85a4185e37875824eb49859, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x68e41430ccd41cc5e92a9f9acd2e955c1385b9f5ed8d3f133d767429484a8eba, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xc038fe9d0125ab8be54545276f841274e414c596ed4c9eaa6919604603d1ffa9, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x23248698612cd8e83234fcf5db9b6b225f4b0ba78d72ef13ea1edff5f0fb0298, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd2a9fa3d39c1ba91eefa666a1db71c6e0e4e3b707626b0197a4e59e7110cf0d4, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xc28931ee7dfa02b62872e0d937ba3dc5c637118273a1f1f0c4fc880905c82efc, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x01cd399556445e3d7b201d6c5e56a5794e60be2cfd9a4643e7ead79bb4f60f79, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xac855cc58d5fbb0dff91a79683eb0e914c1b7d8d0a540d416838a89f83a8312f, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xf7798af7ccf36b836705849f7dd40328bf9346657255b431446ec75a68171816, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xe52a24c92d3f067bf551eeaf98c62ba525e84882d7adad835fad8de72986b2b1, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xffc8682759a2bf1dd67c87a77c285467801f1c44fd78fa4eb5957a4832c9d72d, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x1482ac3e7e4f321627850d95a13942aea6d2923402b913046856ff7e8aaf9aff, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x17332b4c7aac2a07ccfe954de7ad22ccf6fcb4c5fa15c130ed22a40ae9398f47, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd4be0546013f84a0d1e118b37589723b58e323983263616d1b036f8b3fdd8583, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xa64ec737d31dddf939b184438ccdd3e1d3e667572857cd6c9c31a0d1d9b7b085, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x8ad12fbc74117cff4743d674539c86548c6758710a07a6abe3715e4b53526d34, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x15a16435a2300b27a337561401f06682ba85019aa0af61b264a1177d38b5c13c, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x22616f306e76352293a22ab6ee15509d9b108d4136b32fa7f9ed259793f392a1, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x519727b25560caf00ce0d3f911bd4356f907160ab5186da10a629c7ccae1851e, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xcff39e77928ce9310118d50e29bc87e7f78b53ad51366359aa17f07902ae6392, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x17dead3bfa1968c744118023dead77cdbee22c5b7c2414f5a6bdf82fd94cf3ad, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x2bef0f8b22a1cfb90100f4a552a9d02b772130123de8144a00c4d57497e1d7f4, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xbf5188713fef90b31c35243f92cfa4331ab076e30e24b355c79b01f41d152a11, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x3baadd2fd92e3e12fb371be0578941dc0a108fbca0a7d81b88316fb94d6b4dfe, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd4f955742e20a28d38611bf9fc4a478c97b673a7cd40d0113a58a1efe338d9aa, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x3c1c3fe9a5f7ccd54ad5a51a224b3f94775266d19c3733017e4920d7391ad645, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x6372df6148abeed66fda5461779a9651130c6c525df733852bcd929016768a7a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x6d098e848fb853f95adb5a6364b5ab33c79fb08877f2cf3e0e160d9fcb3ebcc5, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x48c5fc90f27431fabfe496dfba14bb0dba71141eb5472a365fd13023f4fe6296, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xbb988dfc0c4dfe53999bd34840adcb63fdbf501ccd622ca2ddf5064ad8cdebf4, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x25b068c942724c424ed5851c9575c22752c9bd25f91ebfa589de3d88ee7627f9, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xed98a1931e361add218de11ff7879bd7114cda19c24ddbe15b3b0190ce01e1aa, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xc80b5a7d63f6c43542ad612023d3ffd6c684ce2eab837180addcb4decf518544, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xe2ef24bf47c5203118c6ff96657dd3c6fdff7212d5c798d826455de77b4b70cd, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x907da812fd5a8375587e4860f87691d0a8d61d454c507d09e5562e1a5d0fcc76, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xc459abbc62bc6070cacdff597e97990de56edc51cc6643afb0f6789fef1bad63, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x38d61f5e566855d70d36ef0f0f1fefcd7c829bdd60d95e0ef1fb5b98856280a4, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x13218626665c420d3aa2b0fa49224a3dce8e08b8b56f8851bd9cb5e25cb3042d, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x6f685fb152dba21b4d02422e237e246df73d7d711ae6d7d33983bae0f873e310, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x5ade34719e2498dde70e4571c40474475a4af706a3cb82ac18a7fa44c22d1c47, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x8a0c3dc7a496adca059cb95d9b173812a00f3c4d435e0b9e8116e0c4b5f56acb, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x196bc98252f63169ed79073ee091a0e8ed0b5af51017da143940c00bdb863709, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd979bf70695d93f8efb552a413701918afec9e12dfe213f4d0c27cfa68fad6c2, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xb803072d02f54d237a3c6c4cc18eda6dce87a03c6819df54e4ed8aed6dc56d46, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x1efcda9d986cddcf431af4d59c6a7709d650885b7886cba70f0e7cd92b331cdc, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd3ca5f7859b82ac50b63da06d43aa68a6b685f0a60397638bbea173b3f604192, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xa59d392c0667316ad37a06be2d51aabe9e79bdef0013bc109985648a14c7e41f, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xac2f5f0d2146791b396e2bed6cf15a20bc22cc4c8cf7dd4b3514ac00148dd0a7, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x17a993a6af068d72bc36f0e814d29fef3f97d7a72aa963889b16a8457409861a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x6f1bf99686550e0396f7f4e2df6fdaa090fbc272c8c76eb32a3c6791de5a07b5, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x8234d705e1ecdc59cc6ed40749069d4b45e63deb49b5b7d7f527abd31c072b1b, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x6fe929a1fd6aacba5c4012c45dd727d2c816119567450003913d882cb97bc47e, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xad5371215f2aba49026b2e48739c11b4d8ffbb24dd4a6e41b9763862af96787a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd0e704566c49e1a11edc2c128b2e07f36dc0c755468268f8fe4c4859b9fa595b, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x263e1195090d00be1d8fb37de17ccf3b66d180645efa0d831865cfaa8797769e, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xe65c090eebde2cfa7f9c92cf75641c7683fb8e81f4a48f5b7a9c7eb26a85029f, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xa18971781c6855f6a9752912780bb9b719c14a677a4c6393d62d6e046b97a2ac, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xf6fc1ef1bca8bec055cc66edecc5dc99030fe78311a3f21d8cd624df4f89e625, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x824e4e2838501516d3296542cb47a59a1ca4326e947c9c874d88dccc8e37b99a, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x3cd5a9e7353a50e454c9c1381b556b543897cc89153c3e3749f2021d82372263, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xb4bcedbd54d0c917a315cc7ca785e3c5995abbeeb3deb3ebaf02c7a9bf6cc83f, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x1f7476211105b3039cef009c51155ae93526c53a74973ecfce40754b3df10521, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x58aefbd978440c94b4b9fbd36e00e6e36caeacf82b0da0a6161d34c541a5a6e3, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xc22cd6d61be780a33c77677bc6ba40307b597ed981db57cb485313eec2a5a497, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xd9ffc4fe0dc5f835c8dcdc1e60b8f0b1637f32a809175371b94a057272b0748d, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0xf6a5268541bc4c64ad0ade8f55dda3492604857a71c923662a214dd7e9c20c10, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + a := addmod(0x0, _xL, q) + b := mulmod(a, a, q) + c := mulmod(b, b, q) + d := mulmod(c, a, q) + e := addmod(d, _xR, q) + _xR := _xL + _xL := e + xL := _xR + xR := _xL + } + } + } +} diff --git a/test/HasherLib.test.ts b/test/HasherLib.test.ts new file mode 100644 index 0000000..d03bae4 --- /dev/null +++ b/test/HasherLib.test.ts @@ -0,0 +1,30 @@ +import { Contract } from 'ethers' +import { ethers } from 'hardhat' +import { expect } from 'chai' + +describe('HasherLib', function () { + const ZERO = '0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8' + + let hasher: Contract + + before(async () => { + // deploy Hasher contract + const Hasher = await ethers.getContractFactory('MockHasher') + hasher = await Hasher.deploy() + await hasher.deployed() + }) + + it('should match zeros(i)', async () => { + let hash = ZERO + for (let i = 1; i < 32; i++) { + hash = await hasher.hash(hash, hash) + const expected = await hasher.zeros(i) + expect(hash).to.equal(expected) + } + }) + + it('gas estimate: hash()', async () => { + const gas = await hasher.estimateGas.hash(ZERO, ZERO) + console.log('Gas used - `hash()`:', gas.toString()) + }) +}) diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0873780 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "types": ["chai", "mocha"], + "typeRoots": ["./types", "./node_modules/@types"] + } +} diff --git a/types/circomlibjs.d.ts b/types/circomlibjs.d.ts new file mode 100644 index 0000000..021f352 --- /dev/null +++ b/types/circomlibjs.d.ts @@ -0,0 +1,11 @@ +declare module 'circomlibjs' { + // Accept common input types used by circomlibjs field ops + type FieldLike = string | number | bigint | Uint8Array + + interface MimcSponge { + hash(xL: FieldLike, xR: FieldLike, k: FieldLike): { xL: Uint8Array; xR: Uint8Array } + multiHash(arr: FieldLike[], key?: FieldLike, numOutputs?: number): Uint8Array + } + + export function buildMimcSponge(): Promise +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..ea551fc --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1974 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@ethereumjs/rlp@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.2.tgz#c89bd82f2f3bec248ab2d517ae25f5bbc4aac842" + integrity sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA== + +"@ethereumjs/util@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" + integrity sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog== + dependencies: + "@ethereumjs/rlp" "^5.0.2" + ethereum-cryptography "^2.2.1" + +"@ethersproject/abi@5.8.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" + integrity sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/abstract-provider@5.8.0", "@ethersproject/abstract-provider@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" + integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/networks" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/web" "^5.8.0" + +"@ethersproject/abstract-signer@5.8.0", "@ethersproject/abstract-signer@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" + integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + +"@ethersproject/address@5.8.0", "@ethersproject/address@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" + integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + +"@ethersproject/base64@5.8.0", "@ethersproject/base64@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" + integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== + dependencies: + "@ethersproject/bytes" "^5.8.0" + +"@ethersproject/basex@5.8.0", "@ethersproject/basex@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.8.0.tgz#1d279a90c4be84d1c1139114a1f844869e57d03a" + integrity sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + +"@ethersproject/bignumber@5.8.0", "@ethersproject/bignumber@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" + integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.8.0", "@ethersproject/bytes@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" + integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/constants@5.8.0", "@ethersproject/constants@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" + integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + +"@ethersproject/contracts@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.8.0.tgz#243a38a2e4aa3e757215ea64e276f8a8c9d8ed73" + integrity sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ== + dependencies: + "@ethersproject/abi" "^5.8.0" + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + +"@ethersproject/hash@5.8.0", "@ethersproject/hash@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" + integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/hdnode@5.8.0", "@ethersproject/hdnode@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.8.0.tgz#a51ae2a50bcd48ef6fd108c64cbae5e6ff34a761" + integrity sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/basex" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/pbkdf2" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/wordlists" "^5.8.0" + +"@ethersproject/json-wallets@5.8.0", "@ethersproject/json-wallets@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz#d18de0a4cf0f185f232eb3c17d5e0744d97eb8c9" + integrity sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hdnode" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/pbkdf2" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.8.0", "@ethersproject/keccak256@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" + integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== + dependencies: + "@ethersproject/bytes" "^5.8.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.8.0", "@ethersproject/logger@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" + integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== + +"@ethersproject/networks@5.8.0", "@ethersproject/networks@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" + integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/pbkdf2@5.8.0", "@ethersproject/pbkdf2@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz#cd2621130e5dd51f6a0172e63a6e4a0c0a0ec37e" + integrity sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + +"@ethersproject/properties@5.8.0", "@ethersproject/properties@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" + integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/providers@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.8.0.tgz#6c2ae354f7f96ee150439f7de06236928bc04cb4" + integrity sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/base64" "^5.8.0" + "@ethersproject/basex" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/networks" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/web" "^5.8.0" + bech32 "1.1.4" + ws "8.18.0" + +"@ethersproject/random@5.8.0", "@ethersproject/random@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.8.0.tgz#1bced04d49449f37c6437c701735a1a022f0057a" + integrity sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/rlp@5.8.0", "@ethersproject/rlp@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" + integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/sha2@5.8.0", "@ethersproject/sha2@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.8.0.tgz#8954a613bb78dac9b46829c0a95de561ef74e5e1" + integrity sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.8.0", "@ethersproject/signing-key@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" + integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + bn.js "^5.2.1" + elliptic "6.6.1" + hash.js "1.1.7" + +"@ethersproject/solidity@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.8.0.tgz#429bb9fcf5521307a9448d7358c26b93695379b9" + integrity sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/strings@5.8.0", "@ethersproject/strings@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" + integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/transactions@5.8.0", "@ethersproject/transactions@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" + integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + +"@ethersproject/units@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.8.0.tgz#c12f34ba7c3a2de0e9fa0ed0ee32f3e46c5c2c6a" + integrity sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/wallet@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.8.0.tgz#49c300d10872e6986d953e8310dc33d440da8127" + integrity sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/hdnode" "^5.8.0" + "@ethersproject/json-wallets" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/wordlists" "^5.8.0" + +"@ethersproject/web@5.8.0", "@ethersproject/web@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" + integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== + dependencies: + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/wordlists@5.8.0", "@ethersproject/wordlists@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.8.0.tgz#7a5654ee8d1bb1f4dbe43f91d217356d650ad821" + integrity sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/curves@~1.8.1": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.2.tgz#8f24c037795e22b90ae29e222a856294c1d9ffc7" + integrity sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g== + dependencies: + "@noble/hashes" "1.7.2" + +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@1.7.2", "@noble/hashes@~1.7.1": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.2.tgz#d53c65a21658fb02f3303e7ee3ba89d6754c64b4" + integrity sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ== + +"@noble/secp256k1@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + +"@noble/secp256k1@~1.7.0": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.2.tgz#c2c3343e2dce80e15a914d7442147507f8a98e7f" + integrity sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ== + +"@nomicfoundation/edr-darwin-arm64@0.11.3": + version "0.11.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.11.3.tgz#d8e2609fc24cf20e75c3782e39cd5a95f7488075" + integrity sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA== + +"@nomicfoundation/edr-darwin-x64@0.11.3": + version "0.11.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.11.3.tgz#7a9e94cee330269a33c7f1dce267560c7e12dbd3" + integrity sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA== + +"@nomicfoundation/edr-linux-arm64-gnu@0.11.3": + version "0.11.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.11.3.tgz#cd5ec90c7263045c3dfd0b109c73206e488edc27" + integrity sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ== + +"@nomicfoundation/edr-linux-arm64-musl@0.11.3": + version "0.11.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.11.3.tgz#ed23df2d9844470f5661716da27d99a72a69e99e" + integrity sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA== + +"@nomicfoundation/edr-linux-x64-gnu@0.11.3": + version "0.11.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.11.3.tgz#87a62496c2c4b808bc4a9ae96cca1642a21c2b51" + integrity sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw== + +"@nomicfoundation/edr-linux-x64-musl@0.11.3": + version "0.11.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.11.3.tgz#8cfe408c73bcb9ed5e263910c313866d442f4b48" + integrity sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg== + +"@nomicfoundation/edr-win32-x64-msvc@0.11.3": + version "0.11.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.11.3.tgz#fb208b94553c7eb22246d73a1ac4de5bfdb97d01" + integrity sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung== + +"@nomicfoundation/edr@^0.11.3": + version "0.11.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.11.3.tgz#e8b30b868788e45d7a2ee2359a021ef7dcb96952" + integrity sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.11.3" + "@nomicfoundation/edr-darwin-x64" "0.11.3" + "@nomicfoundation/edr-linux-arm64-gnu" "0.11.3" + "@nomicfoundation/edr-linux-arm64-musl" "0.11.3" + "@nomicfoundation/edr-linux-x64-gnu" "0.11.3" + "@nomicfoundation/edr-linux-x64-musl" "0.11.3" + "@nomicfoundation/edr-win32-x64-msvc" "0.11.3" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" + integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" + integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" + integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" + integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" + integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" + integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" + integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" + integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" + +"@nomiclabs/hardhat-ethers@^2.2.3": + version "2.2.3" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" + integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== + +"@openzeppelin/contracts@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.4.0.tgz#177594bdb2d86c71f5d1052fe40cb4edb95fb20f" + integrity sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A== + +"@scure/base@~1.1.0", "@scure/base@~1.1.6": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + +"@scure/base@~1.2.5": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6" + integrity sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@tsconfig/node10@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/chai@^5.2.2": + version "5.2.2" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" + integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== + dependencies: + "@types/deep-eql" "*" + +"@types/deep-eql@*": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== + +"@types/mocha@^10.0.10": + version "10.0.10" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== + +"@types/node@^24.8.1": + version "24.8.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.8.1.tgz#74c8ae00b045a0a351f2837ec00f25dfed0053be" + integrity sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q== + dependencies: + undici-types "~7.14.0" + +acorn-walk@^8.1.1: + version "8.3.4" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +b4a@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.7.3.tgz#24cf7ccda28f5465b66aec2bac69e32809bf112f" + integrity sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +blake-hash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" + integrity sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w== + dependencies: + node-addon-api "^3.0.0" + node-gyp-build "^4.2.2" + readable-stream "^3.6.0" + +blake2b-wasm@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== + dependencies: + b4a "^1.0.1" + nanoassert "^2.0.0" + +blake2b@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" + integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A== + dependencies: + blake2b-wasm "^2.4.0" + nanoassert "^2.0.0" + +bn.js@^4.11.9: + version "4.12.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.2.tgz#3d8fed6796c24e177737f7cc5172ee04ef39ec99" + integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== + +bn.js@^5.2.1: + version "5.2.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566" + integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== + +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chai@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.0.tgz#181bca6a219cddb99c3eeefb82483800ffa550ce" + integrity sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA== + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +circomlibjs@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" + integrity sha512-GRAUoAlKAsiiTa+PA725G9RmEmJJRc8tRFxw/zKktUxlQISGznT4hH4ESvW8FNTsrGg/nNd06sGP/Wlx0LUHVg== + dependencies: + blake-hash "^2.0.0" + blake2b "^2.1.3" + ethers "^5.5.1" + ffjavascript "^0.2.45" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +debug@4, debug@^4.1.1, debug@^4.3.5: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + +elliptic@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enquirer@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereum-cryptography@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== + dependencies: + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + +ethers@^5.5.1, ethers@^5.7.2: + version "5.8.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.8.0.tgz#97858dc4d4c74afce83ea7562fe9493cedb4d377" + integrity sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg== + dependencies: + "@ethersproject/abi" "5.8.0" + "@ethersproject/abstract-provider" "5.8.0" + "@ethersproject/abstract-signer" "5.8.0" + "@ethersproject/address" "5.8.0" + "@ethersproject/base64" "5.8.0" + "@ethersproject/basex" "5.8.0" + "@ethersproject/bignumber" "5.8.0" + "@ethersproject/bytes" "5.8.0" + "@ethersproject/constants" "5.8.0" + "@ethersproject/contracts" "5.8.0" + "@ethersproject/hash" "5.8.0" + "@ethersproject/hdnode" "5.8.0" + "@ethersproject/json-wallets" "5.8.0" + "@ethersproject/keccak256" "5.8.0" + "@ethersproject/logger" "5.8.0" + "@ethersproject/networks" "5.8.0" + "@ethersproject/pbkdf2" "5.8.0" + "@ethersproject/properties" "5.8.0" + "@ethersproject/providers" "5.8.0" + "@ethersproject/random" "5.8.0" + "@ethersproject/rlp" "5.8.0" + "@ethersproject/sha2" "5.8.0" + "@ethersproject/signing-key" "5.8.0" + "@ethersproject/solidity" "5.8.0" + "@ethersproject/strings" "5.8.0" + "@ethersproject/transactions" "5.8.0" + "@ethersproject/units" "5.8.0" + "@ethersproject/wallet" "5.8.0" + "@ethersproject/web" "5.8.0" + "@ethersproject/wordlists" "5.8.0" + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + +ffjavascript@^0.2.45: + version "0.2.63" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.63.tgz#0c1216a1f123dc9181df69e144473704d2f115eb" + integrity sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.12.1: + version "1.15.11" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +hardhat@^2.24.2: + version "2.26.3" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.26.3.tgz#87f3f4b6d1001970299d5bff135d57e8adae7a07" + integrity sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw== + dependencies: + "@ethereumjs/util" "^9.1.0" + "@ethersproject/abi" "^5.1.2" + "@nomicfoundation/edr" "^0.11.3" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + boxen "^5.1.2" + chokidar "^4.0.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + find-up "^5.0.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + json-stream-stringify "^3.1.4" + keccak "^3.0.2" + lodash "^4.17.11" + micro-eth-signer "^0.14.0" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + picocolors "^1.1.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.8.26" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tinyglobby "^0.2.6" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +immutable@^4.0.0-rc.12: + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json-stream-stringify@^3.1.4: + version "3.1.6" + resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.11: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +micro-eth-signer@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz#8aa1fe997d98d6bdf42f2071cef7eb01a66ecb22" + integrity sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw== + dependencies: + "@noble/curves" "~1.8.1" + "@noble/hashes" "~1.7.1" + micro-packed "~0.7.2" + +micro-packed@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/micro-packed/-/micro-packed-0.7.3.tgz#59e96b139dffeda22705c7a041476f24cabb12b6" + integrity sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg== + dependencies: + "@scure/base" "~1.2.5" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0: + version "10.8.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoassert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-addon-api@^3.0.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== + +node-gyp-build@^4.2.0, node-gyp-build@^4.2.2: + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +obliterator@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.5.tgz#031e0145354b0c18840336ae51d41e7d6d2c76aa" + integrity sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +raw-body@^2.4.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + +source-map-support@^0.5.13: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +stacktrace-parser@^0.1.10: + version "0.1.11" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz#c7c08f9b29ef566b9a6f7b255d7db572f66fabc4" + integrity sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg== + dependencies: + type-fest "^0.7.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +tinyglobby@^0.2.6: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + +tmp@0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typescript@^5.9.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +undici-types@~7.14.0: + version "7.14.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.14.0.tgz#4c037b32ca4d7d62fae042174604341588bc0840" + integrity sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA== + +undici@^5.14.0: + version "5.29.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.29.0.tgz#419595449ae3f2cdcba3580a2e8903399bd1f5a3" + integrity sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg== + dependencies: + "@fastify/busboy" "^2.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +wasmbuilder@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" + integrity sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA== + +wasmcurves@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" + integrity sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ== + dependencies: + wasmbuilder "0.0.16" + +web-worker@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +ws@^7.4.6: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 6af5c68d8f03343d5e7728a67e93bbc95a31ac6a Mon Sep 17 00:00:00 2001 From: parketh Date: Mon, 20 Oct 2025 19:34:37 +0100 Subject: [PATCH 06/41] add hasher lib tests --- src/contracts/mocks/MockHasher.sol | 4 ++++ test/HasherLib.test.ts | 23 ++++++++++++++++++++--- types/circomlibjs.d.ts | 1 + 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/contracts/mocks/MockHasher.sol b/src/contracts/mocks/MockHasher.sol index 99e335a..3ecfc4e 100644 --- a/src/contracts/mocks/MockHasher.sol +++ b/src/contracts/mocks/MockHasher.sol @@ -11,4 +11,8 @@ contract MockHasher { function zeros(uint256 i) external pure returns (bytes32) { return HasherLib.zeros(i); } + + function mimcSponge(uint256 inxL, uint256 inxR) external pure returns (uint256 xL, uint256 xR) { + return HasherLib.mimcSponge(inxL, inxR); + } } diff --git a/test/HasherLib.test.ts b/test/HasherLib.test.ts index d03bae4..af0ada5 100644 --- a/test/HasherLib.test.ts +++ b/test/HasherLib.test.ts @@ -1,22 +1,39 @@ import { Contract } from 'ethers' import { ethers } from 'hardhat' import { expect } from 'chai' +import { buildMimcSponge } from 'circomlibjs' describe('HasherLib', function () { const ZERO = '0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8' + const MAX_HEIGHT = 32 let hasher: Contract before(async () => { - // deploy Hasher contract + // deploy MockHasher contract const Hasher = await ethers.getContractFactory('MockHasher') hasher = await Hasher.deploy() await hasher.deployed() }) - it('should match zeros(i)', async () => { + it('should match circomjs implementation', async () => { + const left = '0x23dc111d7c3ad1df9806ce1e8eb4f55f57dba117339c545e7593d1f6c3b02662' // keccak('one') + const right = '0x02c7eb69f2674a0aec3b4162175431983790df74664bf26a232aa19a8e1b071f' // keccak('two') + + // circomjs + const mimcSponge = await buildMimcSponge() + const exp = mimcSponge.hash(left, right, 0) + + // contract + const act = await hasher.mimcSponge(left, right) + + expect(mimcSponge.F.toObject(exp.xL)).to.equal(BigInt(act.xL)) + expect(mimcSponge.F.toObject(exp.xR)).to.equal(BigInt(act.xR)) + }) + + it('hash() should match zeros(i)', async () => { let hash = ZERO - for (let i = 1; i < 32; i++) { + for (let i = 1; i < MAX_HEIGHT; i++) { hash = await hasher.hash(hash, hash) const expected = await hasher.zeros(i) expect(hash).to.equal(expected) diff --git a/types/circomlibjs.d.ts b/types/circomlibjs.d.ts index 021f352..cc31877 100644 --- a/types/circomlibjs.d.ts +++ b/types/circomlibjs.d.ts @@ -5,6 +5,7 @@ declare module 'circomlibjs' { interface MimcSponge { hash(xL: FieldLike, xR: FieldLike, k: FieldLike): { xL: Uint8Array; xR: Uint8Array } multiHash(arr: FieldLike[], key?: FieldLike, numOutputs?: number): Uint8Array + F: Fp } export function buildMimcSponge(): Promise From 33e9d9b5774527ede31a17f7ec63503440c827d4 Mon Sep 17 00:00:00 2001 From: parketh Date: Mon, 20 Oct 2025 19:35:35 +0100 Subject: [PATCH 07/41] chore: inline comments --- src/contracts/MerkleTree.sol | 8 ++++---- src/contracts/PrivateBank.sol | 16 ++++++++-------- src/libraries/Hasher.sol | 18 ++++++++++++++++++ 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/contracts/MerkleTree.sol b/src/contracts/MerkleTree.sol index dcaa13d..7f5df4e 100644 --- a/src/contracts/MerkleTree.sol +++ b/src/contracts/MerkleTree.sol @@ -31,7 +31,7 @@ contract MerkleTree { uint32 public nextLeafIndex = 0; /////////////////////////// - // FUNCTIONS + // METHODS /////////////////////////// constructor(uint32 _height) { @@ -51,7 +51,7 @@ contract MerkleTree { } } - /// @dev Insert leaf to merkle tree and update roots + /// @notice Insert leaf to merkle tree and update roots /// @param leaf leaf to insert /// @return index position at which leaf was inserted to tree function insert(bytes32 leaf) internal returns (uint32 index) { @@ -90,7 +90,7 @@ contract MerkleTree { return cachedNextLeafIndex; } - /// @dev Whether the root exists in buffer + /// @notice Whether the root exists in buffer function isKnownRoot(bytes32 root) public view returns (bool) { if (root == 0) { return false; @@ -109,7 +109,7 @@ contract MerkleTree { return false; } - /// @dev Return current root + /// @notice Return current root function getLastRoot() public view returns (bytes32) { return roots[currRootIndex]; } diff --git a/src/contracts/PrivateBank.sol b/src/contracts/PrivateBank.sol index f123b7b..d249474 100644 --- a/src/contracts/PrivateBank.sol +++ b/src/contracts/PrivateBank.sol @@ -56,7 +56,7 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { // METHODS /////////////////////////// - /// @dev Constructor + /// @notice Constructor /// @param _verifier address of SNARK verifier contract /// @param _height height of merkle tree /// @param _depositAmount fixed deposit amount @@ -68,7 +68,7 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { depositAmount = _depositAmount; } - /// @dev Register public key used to sign commitments for user + /// @notice Register public key used to sign commitments for user /// @param user depositing user /// @param publicKey public key of keypair used to sign commitments function register(address user, bytes memory publicKey) public { @@ -81,7 +81,7 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { emit Register(user, publicKey); } - /// @dev Deposit funds into the contract + /// @notice Deposit funds into the contract /// @param commitment commitment of (nullifier + secret) signed with user's registered public key function deposit(bytes32 commitment) external payable nonReentrant { // validity check @@ -101,10 +101,10 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { emit Deposit(msg.sender, commitment, index, block.timestamp); } - /// @dev Implemented by child contract + /// @notice Implemented by child contract function processDeposit() internal virtual; - /// @dev Withdraw a deposit by proving ownership of commmitment + /// @notice Withdraw a deposit by proving ownership of commmitment /// @param proof SNARK proof data /// @param inputs circuit public inputs function withdraw(bytes calldata proof, Inputs memory inputs) external payable nonReentrant { @@ -145,15 +145,15 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { emit Withdraw(inputs.recipient, inputs.relayer, inputs.nullifierHash, inputs.relayerFee); } - /// @dev Implemented by child contract + /// @notice Implemented by child contract function processWithdraw(Inputs memory inputs) internal virtual; - /// @dev Whether a deposit has already been spent + /// @notice Whether a deposit has already been spent function isSpent(bytes32 nullifierHash) public view returns (bool) { return nullifierHashes[nullifierHash]; } - /// @dev Whether a list of deposit has already been spent + /// @notice Whether a list of deposit has already been spent function isSpentArray( bytes32[] calldata nullifierHashArray ) external view returns (bool[] memory spent) { diff --git a/src/libraries/Hasher.sol b/src/libraries/Hasher.sol index a295277..f0c6ea4 100644 --- a/src/libraries/Hasher.sol +++ b/src/libraries/Hasher.sol @@ -2,11 +2,23 @@ pragma solidity ^0.8.24; library HasherLib { + /////////////////////////// + // CONSTANTS + /////////////////////////// + uint256 internal constant FIELD_SIZE = 21888242871839275222246405745257275088548364400416034343698204186575808495617; uint256 internal constant ZERO = 0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8; // keccak('zero') + /////////////////////////// + // METHODS + /////////////////////////// + + /// @notice Hash two values using the MiMCSponge hash function + /// @param left left value + /// @param right right value + /// @return hash hashed value function hash(bytes32 left, bytes32 right) internal pure returns (bytes32) { uint256 r = uint256(left); uint256 c = 0; @@ -17,6 +29,9 @@ library HasherLib { return bytes32(r); } + /// @notice Return the recursive hash of 'ZERO' at index i of the merkle tree + /// @param i zero-indexed height of the merkle tree + /// @return hash of the zero value at index i function zeros(uint256 i) internal pure returns (bytes32) { if (i == 0) { return bytes32(ZERO); @@ -86,6 +101,9 @@ library HasherLib { revert('Invalid index'); } + /// @notice Hash two values using the MiMCSponge hash function + /// @notice based on + /// @notice Set to `internal` for testing purposes only, should not be called directly function mimcSponge(uint256 inxL, uint256 inxR) internal pure returns (uint256 xL, uint256 xR) { unchecked { assembly { From bb90e6e7fc9079329be31667f76fc88a9a72484c Mon Sep 17 00:00:00 2001 From: parketh Date: Mon, 20 Oct 2025 19:37:58 +0100 Subject: [PATCH 08/41] remove todo --- src/contracts/MerkleTree.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/src/contracts/MerkleTree.sol b/src/contracts/MerkleTree.sol index 7f5df4e..9f6b8fa 100644 --- a/src/contracts/MerkleTree.sol +++ b/src/contracts/MerkleTree.sol @@ -10,7 +10,6 @@ contract MerkleTree { /////////////////////////// /// max height of merkle tree - /// TODO: consider if there is a hard limit to the max height uint32 public constant MAX_HEIGHT = 32; /// size of buffer for storing recent roots uint32 public constant ROOT_HISTORY_SIZE = 30; From 08c5a45934d11ac9a70262b8c8cdf701a72c0924 Mon Sep 17 00:00:00 2001 From: parketh Date: Mon, 20 Oct 2025 22:31:55 +0100 Subject: [PATCH 09/41] test: MerkleTree lib --- hardhat.config.ts | 1 + package.json | 3 + src/contracts/MerkleTree.sol | 2 + src/contracts/mocks/MockMerkleTree.sol | 13 + test/HasherLib.test.ts | 2 +- test/MerkleTree.test.ts | 94 ++ test/shared/expect.ts | 6 + utils/MiMCSponge.utils.ts | 28 + yarn.lock | 2003 +++++++++++++++++++++++- 9 files changed, 2131 insertions(+), 21 deletions(-) create mode 100644 src/contracts/mocks/MockMerkleTree.sol create mode 100644 test/MerkleTree.test.ts create mode 100644 test/shared/expect.ts create mode 100644 utils/MiMCSponge.utils.ts diff --git a/hardhat.config.ts b/hardhat.config.ts index 080a4c5..743fdad 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -1,5 +1,6 @@ import { HardhatUserConfig } from 'hardhat/config' import '@nomiclabs/hardhat-ethers' +import '@nomiclabs/hardhat-waffle' const config: HardhatUserConfig = { solidity: { diff --git a/package.json b/package.json index a701453..1cd51a6 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,16 @@ { "devDependencies": { "@nomiclabs/hardhat-ethers": "^2.2.3", + "@nomiclabs/hardhat-waffle": "^2.0.6", "@openzeppelin/contracts": "^5.4.0", "@types/chai": "^5.2.2", "@types/mocha": "^10.0.10", "@types/node": "^24.8.1", "chai": "^6.2.0", "circomlibjs": "^0.1.7", + "ethereum-waffle": "^4.0.10", "ethers": "^5.7.2", + "fixed-merkle-tree": "^0.7.3", "hardhat": "^2.24.2", "ts-node": "^10.9.2", "typescript": "^5.9.3" diff --git a/src/contracts/MerkleTree.sol b/src/contracts/MerkleTree.sol index 9f6b8fa..79300f9 100644 --- a/src/contracts/MerkleTree.sol +++ b/src/contracts/MerkleTree.sol @@ -5,6 +5,8 @@ import { TreeHeightZero, TreeHeightOverflow, MerkleTreeFull } from '../Errors.so import { HasherLib } from '../libraries/Hasher.sol'; contract MerkleTree { + using HasherLib for bytes32; + /////////////////////////// // CONSTANTS /////////////////////////// diff --git a/src/contracts/mocks/MockMerkleTree.sol b/src/contracts/mocks/MockMerkleTree.sol new file mode 100644 index 0000000..1eba3db --- /dev/null +++ b/src/contracts/mocks/MockMerkleTree.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import { MerkleTree } from '../MerkleTree.sol'; + +contract MockMerkleTree is MerkleTree { + constructor(uint32 _height) MerkleTree(_height) {} + + function insert2(bytes32 _leaf) public returns (uint32) { + uint32 index = insert(_leaf); + return index; + } +} diff --git a/test/HasherLib.test.ts b/test/HasherLib.test.ts index af0ada5..2ec0b04 100644 --- a/test/HasherLib.test.ts +++ b/test/HasherLib.test.ts @@ -1,6 +1,6 @@ import { Contract } from 'ethers' import { ethers } from 'hardhat' -import { expect } from 'chai' +import { expect } from './shared/expect' import { buildMimcSponge } from 'circomlibjs' describe('HasherLib', function () { diff --git a/test/MerkleTree.test.ts b/test/MerkleTree.test.ts new file mode 100644 index 0000000..ccdd5a5 --- /dev/null +++ b/test/MerkleTree.test.ts @@ -0,0 +1,94 @@ +import { Contract } from 'ethers' +import { ethers } from 'hardhat' +import { expect } from './shared/expect' +import { MerkleTree as FixedMerkleTree } from 'fixed-merkle-tree' +import { getMiMCSpongeHasher } from '../utils/MiMCSponge.utils' + +describe('MerkleTree', function () { + const ZERO = '0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8' + const HEIGHT = 6 + + let merkleTree: Contract + let fixedMerkleTree: FixedMerkleTree + + beforeEach(async () => { + // deploy MerkleTree contract + const MerkleTree = await ethers.getContractFactory('MockMerkleTree') + merkleTree = await MerkleTree.deploy(HEIGHT) + await merkleTree.deployed() + + // init js lib + const hashMiMCSponge = await getMiMCSpongeHasher() + fixedMerkleTree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + }) + + it('should initialize contract state', async () => { + const hashAtHeight0 = await merkleTree.latestHashAtHeight(0) + expect(hashAtHeight0).to.equal(ZERO) + + const expRoot = '0x17759758524a3bbf2ce748d4a4178ab6a7a6d252143bda097a0673232a569dfc' + const root = await merkleTree.roots(0) + expect(root).to.equal(expRoot) + }) + + it('insert(): should insert leaves and update roots', async () => { + let contractMerkleRoot: string + for (let i = 1; i < 11; i++) { + await merkleTree.insert2(toFixedHex(i)) + fixedMerkleTree.insert(i) + contractMerkleRoot = await merkleTree.getLastRoot() + expect(toFixedHex(fixedMerkleTree.root as number)).to.equal(contractMerkleRoot) + } + }) + + it('insert(): should reject if tree is full', async () => { + // insert leaves + for (let i = 0; i < 2 ** HEIGHT; i++) { + const index = await merkleTree.callStatic.insert2(toFixedHex(i + 42)) + const tx = await merkleTree.insert2(toFixedHex(i + 42)) + await tx.wait() + expect(index).to.be.equal(i) + } + + // reject if tree is full + await expect(merkleTree.insert2(toFixedHex(1))).to.be.revertedWith('MerkleTreeFull') + }) + + it('isKnownRoot(): should return true if root is in buffer', async () => { + // check latest hashes + for (let i = 1; i < 5; i++) { + await expect(merkleTree.insert2(toFixedHex(i))).to.not.be.reverted + fixedMerkleTree.insert(i) + const isKnown = await merkleTree.isKnownRoot(toFixedHex(fixedMerkleTree.root as number)) + expect(isKnown).to.be.true + } + + // add new root to contract only + await expect(merkleTree.insert2(toFixedHex(1))).to.not.be.reverted + + // check outdated root + const isKnown = await merkleTree.isKnownRoot(toFixedHex(fixedMerkleTree.root as number)) + expect(isKnown).to.be.true + }) + + it('isKnownRoot(): should return false if root is not in buffer', async () => { + // add new root + await expect(merkleTree.insert2(toFixedHex(1))).to.not.be.reverted + + // check non-existent root + const isKnown = await merkleTree.isKnownRoot(toFixedHex(2)) + expect(isKnown).to.be.false + }) +}) + +// internal helpers + +function toFixedHex(number: number, length = 32) { + let str = BigInt(number).toString(16) + while (str.length < length * 2) str = '0' + str + str = '0x' + str + return str +} diff --git a/test/shared/expect.ts b/test/shared/expect.ts new file mode 100644 index 0000000..90e4fc7 --- /dev/null +++ b/test/shared/expect.ts @@ -0,0 +1,6 @@ +import { expect, use } from 'chai' +import { solidity } from 'ethereum-waffle' + +use(solidity) + +export { expect } diff --git a/utils/MiMCSponge.utils.ts b/utils/MiMCSponge.utils.ts new file mode 100644 index 0000000..86f15a9 --- /dev/null +++ b/utils/MiMCSponge.utils.ts @@ -0,0 +1,28 @@ +import { buildMimcSponge, FieldLike, MimcSponge } from 'circomlibjs' + +const FIELD_SIZE = BigInt( + '21888242871839275222246405745257275088548364400416034343698204186575808495617', +) + +export const getMiMCSpongeHasher = async () => { + const mimcSponge = await buildMimcSponge() + return (left: FieldLike, right: FieldLike): string => { + const { left: left2, right: right2 } = MiMCSponge(mimcSponge, left, 0) + const left3 = (BigInt(left2) + BigInt(right.toString())) % FIELD_SIZE + const { left: hash } = MiMCSponge(mimcSponge, left3, right2) + return hash + } +} + +const MiMCSponge = ( + mimcSponge: MimcSponge, + left: FieldLike, + right: FieldLike, +): { left: string; right: string } => { + const { xL, xR } = mimcSponge.hash(left, right, 0) + return { left: toHex(mimcSponge, xL), right: toHex(mimcSponge, xR) } +} + +const toHex = (mimcSponge: MimcSponge, value: Uint8Array): string => { + return '0x' + mimcSponge.F.toObject(value).toString(16) +} diff --git a/yarn.lock b/yarn.lock index ea551fc..f05a7d3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,11 +9,120 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@ethereum-waffle/chai@4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-4.0.10.tgz#6f600a40b6fdaed331eba42b8625ff23f3a0e59a" + integrity sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw== + dependencies: + "@ethereum-waffle/provider" "4.0.5" + debug "^4.3.4" + json-bigint "^1.0.0" + +"@ethereum-waffle/compiler@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz#069e2df24b879b8a7b78857bad6f8bf6ebc8a5b1" + integrity sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw== + dependencies: + "@resolver-engine/imports" "^0.3.3" + "@resolver-engine/imports-fs" "^0.3.3" + "@typechain/ethers-v5" "^10.0.0" + "@types/mkdirp" "^0.5.2" + "@types/node-fetch" "^2.6.1" + mkdirp "^0.5.1" + node-fetch "^2.6.7" + +"@ethereum-waffle/ens@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-4.0.3.tgz#4a46ac926414f3c83b4e8cc2562c8e2aee06377a" + integrity sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw== + +"@ethereum-waffle/mock-contract@4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz#f13fea29922d87a4d2e7c4fc8fe72ea04d2c13de" + integrity sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA== + +"@ethereum-waffle/provider@4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-4.0.5.tgz#8a65dbf0263f4162c9209608205dee1c960e716b" + integrity sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw== + dependencies: + "@ethereum-waffle/ens" "4.0.3" + "@ganache/ethereum-options" "0.1.4" + debug "^4.3.4" + ganache "7.4.3" + +"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.2": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" + integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== + dependencies: + "@ethereumjs/common" "^2.6.5" + "@ethereumjs/tx" "^3.5.2" + ethereumjs-util "^7.1.5" + merkle-patricia-tree "^4.2.4" + +"@ethereumjs/blockchain@^5.5.0": + version "5.5.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz#aa49a6a04789da6b66b5bcbb0d0b98efc369f640" + integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== + dependencies: + "@ethereumjs/block" "^3.6.2" + "@ethereumjs/common" "^2.6.4" + "@ethereumjs/ethash" "^1.1.0" + debug "^4.3.3" + ethereumjs-util "^7.1.5" + level-mem "^5.0.1" + lru-cache "^5.1.1" + semaphore-async-await "^1.5.1" + +"@ethereumjs/common@2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.0.tgz#feb96fb154da41ee2cc2c5df667621a440f36348" + integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.3" + +"@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.5" + +"@ethereumjs/ethash@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" + integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== + dependencies: + "@ethereumjs/block" "^3.5.0" + "@types/levelup" "^4.3.0" + buffer-xor "^2.0.1" + ethereumjs-util "^7.1.1" + miller-rabin "^4.0.0" + "@ethereumjs/rlp@^5.0.2": version "5.0.2" resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.2.tgz#c89bd82f2f3bec248ab2d517ae25f5bbc4aac842" integrity sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA== +"@ethereumjs/tx@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7" + integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw== + dependencies: + "@ethereumjs/common" "^2.6.0" + ethereumjs-util "^7.1.3" + +"@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== + dependencies: + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" + "@ethereumjs/util@^9.1.0": version "9.1.0" resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" @@ -22,6 +131,24 @@ "@ethereumjs/rlp" "^5.0.2" ethereum-cryptography "^2.2.1" +"@ethereumjs/vm@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.6.0.tgz#e0ca62af07de820143674c30b776b86c1983a464" + integrity sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ== + dependencies: + "@ethereumjs/block" "^3.6.0" + "@ethereumjs/blockchain" "^5.5.0" + "@ethereumjs/common" "^2.6.0" + "@ethereumjs/tx" "^3.4.0" + async-eventemitter "^0.2.4" + core-js-pure "^3.0.1" + debug "^2.2.0" + ethereumjs-util "^7.1.3" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + merkle-patricia-tree "^4.2.2" + rustbn.js "~0.2.0" + "@ethersproject/abi@5.8.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.8.0": version "5.8.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" @@ -369,6 +496,68 @@ resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== +"@ganache/ethereum-address@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz#0e6d66f4a24f64bf687cb3ff7358fb85b9d9005e" + integrity sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw== + dependencies: + "@ganache/utils" "0.1.4" + +"@ganache/ethereum-options@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz#6a559abb44225e2b8741a8f78a19a46714a71cd6" + integrity sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw== + dependencies: + "@ganache/ethereum-address" "0.1.4" + "@ganache/ethereum-utils" "0.1.4" + "@ganache/options" "0.1.4" + "@ganache/utils" "0.1.4" + bip39 "3.0.4" + seedrandom "3.0.5" + +"@ganache/ethereum-utils@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz#fae4b5b9e642e751ff1fa0cd7316c92996317257" + integrity sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg== + dependencies: + "@ethereumjs/common" "2.6.0" + "@ethereumjs/tx" "3.4.0" + "@ethereumjs/vm" "5.6.0" + "@ganache/ethereum-address" "0.1.4" + "@ganache/rlp" "0.1.4" + "@ganache/utils" "0.1.4" + emittery "0.10.0" + ethereumjs-abi "0.6.8" + ethereumjs-util "7.1.3" + +"@ganache/options@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/options/-/options-0.1.4.tgz#325b07e6de85094667aaaaf3d653e32404a04b78" + integrity sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw== + dependencies: + "@ganache/utils" "0.1.4" + bip39 "3.0.4" + seedrandom "3.0.5" + +"@ganache/rlp@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/rlp/-/rlp-0.1.4.tgz#f4043afda83e1a14a4f80607b103daf166a9b374" + integrity sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ== + dependencies: + "@ganache/utils" "0.1.4" + rlp "2.2.6" + +"@ganache/utils@0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@ganache/utils/-/utils-0.1.4.tgz#25d60d7689e3dda6a8a7ad70e3646f07c2c39a1f" + integrity sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w== + dependencies: + emittery "0.10.0" + keccak "3.0.1" + seedrandom "3.0.5" + optionalDependencies: + "@trufflesuite/bigint-buffer" "1.1.9" + "@jridgewell/resolve-uri@^3.0.3": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" @@ -527,11 +716,53 @@ resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== +"@nomiclabs/hardhat-waffle@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz#d11cb063a5f61a77806053e54009c40ddee49a54" + integrity sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg== + "@openzeppelin/contracts@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.4.0.tgz#177594bdb2d86c71f5d1052fe40cb4edb95fb20f" integrity sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A== +"@resolver-engine/core@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" + integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== + dependencies: + debug "^3.1.0" + is-url "^1.2.4" + request "^2.85.0" + +"@resolver-engine/fs@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" + integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== + dependencies: + "@resolver-engine/core" "^0.3.3" + debug "^3.1.0" + +"@resolver-engine/imports-fs@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b" + integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== + dependencies: + "@resolver-engine/fs" "^0.3.3" + "@resolver-engine/imports" "^0.3.3" + debug "^3.1.0" + +"@resolver-engine/imports@^0.3.3": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" + integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== + dependencies: + "@resolver-engine/core" "^0.3.3" + debug "^3.1.0" + hosted-git-info "^2.6.0" + path-browserify "^1.0.0" + url "^0.11.0" + "@scure/base@~1.1.0", "@scure/base@~1.1.6": version "1.1.9" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" @@ -644,6 +875,20 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" +"@trufflesuite/bigint-buffer@1.1.10": + version "1.1.10" + resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" + integrity sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw== + dependencies: + node-gyp-build "4.4.0" + +"@trufflesuite/bigint-buffer@1.1.9": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz#e2604d76e1e4747b74376d68f1312f9944d0d75d" + integrity sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw== + dependencies: + node-gyp-build "4.3.0" + "@tsconfig/node10@^1.0.7": version "1.0.11" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" @@ -664,6 +909,33 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@typechain/ethers-v5@^10.0.0": + version "10.2.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" + integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@types/abstract-leveldown@*": + version "7.2.5" + resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.5.tgz#db2cf364c159fb1f12be6cd3549f56387eaf8d73" + integrity sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg== + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^5.1.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.2.0.tgz#4349b9710e98f9ab3cdc50f1c5e4dcbd8ef29c80" + integrity sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q== + dependencies: + "@types/node" "*" + "@types/chai@^5.2.2": version "5.2.2" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" @@ -676,11 +948,57 @@ resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== +"@types/level-errors@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.2.tgz#f33ec813c50780b547463da9ad8acac89ee457d9" + integrity sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA== + +"@types/levelup@^4.3.0": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" + integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== + dependencies: + "@types/abstract-leveldown" "*" + "@types/level-errors" "*" + "@types/node" "*" + +"@types/lru-cache@5.1.1": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/mkdirp@^0.5.2": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== + dependencies: + "@types/node" "*" + "@types/mocha@^10.0.10": version "10.0.10" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== +"@types/node-fetch@^2.6.1": + version "2.6.13" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.13.tgz#e0c9b7b5edbdb1b50ce32c127e85e880872d56ee" + integrity sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw== + dependencies: + "@types/node" "*" + form-data "^4.0.4" + +"@types/node@*": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.9.0.tgz#4fb62beb8b322fe2955ac94f80ff5a58c941ebf4" + integrity sha512-MKNwXh3seSK8WurXF7erHPJ2AONmMwkI7zAMrXZDPIru8jRqkk6rGDBVbw4mLwfqA+ZZliiDPg05JQ3uW66tKQ== + dependencies: + undici-types "~7.16.0" + +"@types/node@11.11.6": + version "11.11.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== + "@types/node@^24.8.1": version "24.8.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-24.8.1.tgz#74c8ae00b045a0a351f2837ec00f25dfed0053be" @@ -688,6 +1006,64 @@ dependencies: undici-types "~7.14.0" +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/secp256k1@^4.0.1": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.7.tgz#534c9814eb80964962108ad45d549d1555c75fa0" + integrity sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw== + dependencies: + "@types/node" "*" + +"@types/seedrandom@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== + +abstract-leveldown@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" + integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +abstract-leveldown@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== + dependencies: + buffer "^6.0.3" + catering "^2.0.0" + is-buffer "^2.0.5" + level-concat-iterator "^3.0.0" + level-supports "^2.0.1" + queue-microtask "^1.2.3" + +abstract-leveldown@~6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" + integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + acorn-walk@^8.1.1: version "8.3.4" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" @@ -725,6 +1101,16 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv@^6.12.3: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ansi-align@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" @@ -749,6 +1135,13 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -774,6 +1167,64 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +async-eventemitter@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + +async@^2.4.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.13.2" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef" + integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== + b4a@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.7.3.tgz#24cf7ccda28f5465b66aec2bac69e32809bf112f" @@ -784,16 +1235,50 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-x@^3.0.2: + version "3.0.11" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.11.tgz#40d80e2a1aeacba29792ccc6c5354806421287ff" + integrity sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + bech32@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bignumber.js@^9.0.0: + version "9.3.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" + integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== + binary-extensions@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +bip39@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" + integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== + dependencies: + "@types/node" "11.11.6" + create-hash "^1.1.0" + pbkdf2 "^3.0.9" + randombytes "^2.0.1" + blake-hash@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" @@ -819,12 +1304,17 @@ blake2b@^2.1.3: blake2b-wasm "^2.4.0" nanoassert "^2.0.0" -bn.js@^4.11.9: +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.2" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.2.tgz#3d8fed6796c24e177737f7cc5172ee04ef39ec99" integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== -bn.js@^5.2.1: +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.2" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566" integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== @@ -843,6 +1333,14 @@ boxen@^5.1.2: widest-line "^3.1.0" wrap-ansi "^7.0.0" +brace-expansion@^1.1.7: + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + brace-expansion@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" @@ -857,7 +1355,7 @@ braces@~3.0.2: dependencies: fill-range "^7.1.1" -brorand@^1.1.0: +brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== @@ -867,26 +1365,134 @@ browser-stdout@^1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + +buffer-xor@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" + integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== + dependencies: + safe-buffer "^5.1.1" + +buffer@^5.5.0, buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bufferutil@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" + integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== + dependencies: + node-gyp-build "^4.3.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +catering@^2.0.0, catering@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + chai@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.0.tgz#181bca6a219cddb99c3eeefb82483800ffa550ce" integrity sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA== +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -922,6 +1528,15 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.7.tgz#bd094bfef42634ccfd9e13b9fc73274997111e39" + integrity sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.2" + circomlibjs@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" @@ -951,6 +1566,13 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -958,43 +1580,171 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + command-exists@^1.2.8: version "1.2.9" resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + commander@^8.1.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +core-js-pure@^3.0.1: + version "3.46.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.46.0.tgz#9bb80248584c6334bb54cd381b0f41c619ef1b43" + integrity sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -debug@4, debug@^4.1.1, debug@^4.3.5: +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + decamelize@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deferred-leveldown@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" + integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== + dependencies: + abstract-leveldown "~6.2.1" + inherits "^2.0.3" + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -1010,7 +1760,24 @@ diff@^5.2.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== -elliptic@6.6.1: +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +elliptic@6.6.1, elliptic@^6.5.2, elliptic@^6.5.4, elliptic@^6.5.7: version "6.6.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== @@ -1023,11 +1790,26 @@ elliptic@6.6.1: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" +emittery@0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" + integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +encoding-down@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" + integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== + dependencies: + abstract-leveldown "^6.2.1" + inherits "^2.0.3" + level-codec "^9.0.0" + level-errors "^2.0.0" + enquirer@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" @@ -1041,16 +1823,76 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== +errno@~0.1.1: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + escalade@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + ethereum-cryptography@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" @@ -1071,6 +1913,61 @@ ethereum-cryptography@^2.2.1: "@scure/bip32" "1.4.0" "@scure/bip39" "1.3.0" +ethereum-waffle@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz#f1ef1564c0155236f1a66c6eae362a5d67c9f64c" + integrity sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ== + dependencies: + "@ethereum-waffle/chai" "4.0.10" + "@ethereum-waffle/compiler" "4.0.3" + "@ethereum-waffle/mock-contract" "4.0.4" + "@ethereum-waffle/provider" "4.0.5" + solc "0.8.15" + typechain "^8.0.0" + +ethereumjs-abi@0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" + integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethereumjs-util@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + ethers@^5.5.1, ethers@^5.7.2: version "5.8.0" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.8.0.tgz#97858dc4d4c74afce83ea7562fe9493cedb4d377" @@ -1107,6 +2004,47 @@ ethers@^5.5.1, ethers@^5.7.2: "@ethersproject/web" "5.8.0" "@ethersproject/wordlists" "5.8.0" +ethjs-util@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + fdir@^6.5.0: version "6.5.0" resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" @@ -1128,6 +2066,13 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -1136,6 +2081,11 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +fixed-merkle-tree@^0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/fixed-merkle-tree/-/fixed-merkle-tree-0.7.3.tgz#e8993628bc43894dfae3cb7e2a847f45c63e8678" + integrity sha512-b50ZBpDfp/Nru120IdeS0IyqbVjOien1OSdWMDdcxS9uVHLV668xndNkEnn9t1WFOvc5aw1owl6l4N8mP5mkKg== + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -1146,6 +2096,38 @@ follow-redirects@^1.12.1: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== +for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" + integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + fp-ts@1.19.3: version "1.19.3" resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" @@ -1156,7 +2138,7 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== -fs-extra@^7.0.1: +fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -1175,11 +2157,69 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +ganache@7.4.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.4.3.tgz#e995f1250697264efbb34d4241c374a2b0271415" + integrity sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA== + dependencies: + "@trufflesuite/bigint-buffer" "1.1.10" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "5.1.1" + "@types/seedrandom" "3.0.1" + emittery "0.10.0" + keccak "3.0.2" + leveldown "6.1.0" + secp256k1 "4.0.3" + optionalDependencies: + bufferutil "4.0.5" + utf-8-validate "5.0.7" + get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -1187,6 +2227,18 @@ glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" @@ -1198,11 +2250,29 @@ glob@^8.1.0: minimatch "^5.0.1" once "^1.3.0" +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + hardhat@^2.24.2: version "2.26.3" resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.26.3.tgz#87f3f4b6d1001970299d5bff135d57e8adae7a07" @@ -1248,12 +2318,46 @@ hardhat@^2.24.2: uuid "^8.3.2" ws "^7.4.6" -has-flag@^4.0.0: +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hash-base@^3.0.0, hash-base@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.2.tgz#79d72def7611c3f6e3c3b5730652638001b10a74" + integrity sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg== + dependencies: + inherits "^2.0.4" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + to-buffer "^1.2.1" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -1261,6 +2365,13 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -1275,6 +2386,11 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hosted-git-info@^2.6.0: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -1286,6 +2402,15 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -1301,6 +2426,21 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +immediate@~3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" + integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== + immutable@^4.0.0-rc.12: version "4.3.7" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" @@ -1319,7 +2459,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -1338,6 +2478,16 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -1355,6 +2505,11 @@ is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -1365,12 +2520,44 @@ is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-typed-array@^1.1.14: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -js-sha3@0.8.0: +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -1382,11 +2569,38 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + json-stream-stringify@^3.1.4: version "3.1.6" resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -1394,7 +2608,34 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" -keccak@^3.0.2: +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +keccak@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +keccak@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +keccak@^3.0.0, keccak@^3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== @@ -1403,6 +2644,98 @@ keccak@^3.0.2: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +level-codec@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" + integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== + dependencies: + buffer "^5.6.0" + +level-concat-iterator@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== + dependencies: + catering "^2.1.0" + +level-concat-iterator@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" + integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== + +level-errors@^2.0.0, level-errors@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" + integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== + dependencies: + errno "~0.1.1" + +level-iterator-stream@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" + integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== + dependencies: + inherits "^2.0.4" + readable-stream "^3.4.0" + xtend "^4.0.2" + +level-mem@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" + integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== + dependencies: + level-packager "^5.0.3" + memdown "^5.0.0" + +level-packager@^5.0.3: + version "5.1.1" + resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" + integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== + dependencies: + encoding-down "^6.3.0" + levelup "^4.3.2" + +level-supports@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== + +level-supports@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" + integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== + dependencies: + xtend "^4.0.2" + +level-ws@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" + integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== + dependencies: + inherits "^2.0.3" + readable-stream "^3.1.0" + xtend "^4.0.1" + +leveldown@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" + integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== + dependencies: + abstract-leveldown "^7.2.0" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + +levelup@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" + integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== + dependencies: + deferred-leveldown "~5.3.0" + level-errors "~2.0.0" + level-iterator-stream "~4.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -1410,7 +2743,12 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash@^4.17.11: +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -1423,21 +2761,76 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== +ltgt@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== + make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +mcl-wasm@^0.7.1: + version "0.7.9" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memdown@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" + integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== + dependencies: + abstract-leveldown "~6.2.1" + functional-red-black-tree "~1.0.1" + immediate "~3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.2.0" + memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== +merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" + integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== + dependencies: + "@types/levelup" "^4.3.0" + ethereumjs-util "^7.1.4" + level-mem "^5.0.1" + level-ws "^2.0.0" + readable-stream "^3.6.0" + semaphore-async-await "^1.5.1" + micro-eth-signer@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz#8aa1fe997d98d6bdf42f2071cef7eb01a66ecb22" @@ -1454,6 +2847,26 @@ micro-packed@~0.7.2: dependencies: "@scure/base" "~1.2.5" +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@~2.1.19: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -1464,6 +2877,13 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^5.0.1, minimatch@^5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" @@ -1471,6 +2891,23 @@ minimatch@^5.0.1, minimatch@^5.1.6: dependencies: brace-expansion "^2.0.1" +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mnemonist@^0.38.0: version "0.38.5" resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" @@ -1504,7 +2941,12 @@ mocha@^10.0.0: yargs-parser "^20.2.9" yargs-unparser "^2.0.0" -ms@^2.1.3: +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@^2.1.1, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -1514,6 +2956,11 @@ nanoassert@^2.0.0: resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -1524,7 +2971,29 @@ node-addon-api@^3.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== -node-gyp-build@^4.2.0, node-gyp-build@^4.2.2: +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + +node-fetch@^2.6.7: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + +node-gyp-build@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== + +node-gyp-build@^4.2.0, node-gyp-build@^4.2.2, node-gyp-build@^4.3.0: version "4.8.4" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== @@ -1534,6 +3003,16 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-inspect@^1.13.3: + version "1.13.4" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + obliterator@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.5.tgz#031e0145354b0c18840336ae51d41e7d6d2c76aa" @@ -1572,16 +3051,43 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +path-browserify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + path-parse@^1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +pbkdf2@^3.0.17, pbkdf2@^3.0.9: + version "3.1.5" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.5.tgz#444a59d7a259a95536c56e80c89de31cc01ed366" + integrity sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ== + dependencies: + create-hash "^1.2.0" + create-hmac "^1.1.7" + ripemd160 "^2.0.3" + safe-buffer "^5.2.1" + sha.js "^2.4.12" + to-buffer "^1.2.1" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picocolors@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" @@ -1597,7 +3103,61 @@ picomatch@^4.0.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== -randombytes@^2.1.0: +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== + +psl@^1.1.28: + version "1.15.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== + +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +qs@^6.12.3: + version "6.14.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== + dependencies: + side-channel "^1.1.0" + +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +queue-microtask@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -1614,7 +3174,20 @@ raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" -readable-stream@^3.6.0: +readable-stream@^2.3.8: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -1635,6 +3208,37 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + +request@^2.85.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -1647,21 +3251,81 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -safe-buffer@^5.1.0, safe-buffer@~5.2.0: +ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.3.tgz#9be54e4ba5e3559c8eee06a25cd7648bbccdf5a8" + integrity sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA== + dependencies: + hash-base "^3.1.2" + inherits "^2.0.4" + +rlp@2.2.6: + version "2.2.6" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" + integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== + dependencies: + bn.js "^4.11.1" + +rlp@^2.2.3, rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -"safer-buffer@>= 2.1.2 < 3": +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scrypt-js@3.0.1: +scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== +secp256k1@4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== + dependencies: + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +secp256k1@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.4.tgz#58f0bfe1830fe777d9ca1ffc7574962a8189f8ab" + integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw== + dependencies: + elliptic "^6.5.7" + node-addon-api "^5.0.0" + node-gyp-build "^4.2.0" + +seedrandom@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== + +semaphore-async-await@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" + integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== + semver@^5.5.0: version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" @@ -1679,11 +3343,90 @@ serialize-javascript@^6.0.2: dependencies: randombytes "^2.1.0" +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +sha.js@^2.4.0, sha.js@^2.4.12, sha.js@^2.4.8: + version "2.4.12" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" + integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.0" + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +solc@0.8.15: + version "0.8.15" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.15.tgz#d274dca4d5a8b7d3c9295d4cbdc9291ee1c52152" + integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + solc@0.8.26: version "0.8.26" resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" @@ -1710,6 +3453,21 @@ source-map@^0.6.0: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sshpk@^1.7.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + stacktrace-parser@^0.1.10: version "0.1.11" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz#c7c08f9b29ef566b9a6f7b255d7db572f66fabc4" @@ -1722,6 +3480,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -1738,6 +3501,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -1745,11 +3515,25 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -1764,6 +3548,16 @@ supports-color@^8.1.1: dependencies: has-flag "^4.0.0" +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + tinyglobby@^0.2.6: version "0.2.15" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" @@ -1779,6 +3573,15 @@ tmp@0.0.33: dependencies: os-tmpdir "~1.0.2" +to-buffer@^1.2.0, to-buffer@^1.2.1, to-buffer@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.2.tgz#ffe59ef7522ada0a2d1cb5dfe03bb8abc3cdc133" + integrity sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw== + dependencies: + isarray "^2.0.5" + safe-buffer "^5.2.1" + typed-array-buffer "^1.0.3" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1791,6 +3594,34 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + ts-node@^10.9.2: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" @@ -1820,6 +3651,18 @@ tsort@0.0.1: resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -1835,16 +3678,56 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== +typechain@^8.0.0: + version "8.3.2" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== + dependencies: + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + typescript@^5.9.3: version "5.9.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + undici-types@~7.14.0: version "7.14.0" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.14.0.tgz#4c037b32ca4d7d62fae042174604341588bc0840" integrity sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA== +undici-types@~7.16.0: + version "7.16.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" + integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== + undici@^5.14.0: version "5.29.0" resolved "https://registry.yarnpkg.com/undici/-/undici-5.29.0.tgz#419595449ae3f2cdcba3580a2e8903399bd1f5a3" @@ -1862,11 +3745,38 @@ unpipe@1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -util-deprecate@^1.0.1: +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url@^0.11.0: + version "0.11.4" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" + integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== + dependencies: + punycode "^1.4.1" + qs "^6.12.3" + +utf-8-validate@5.0.7: + version "5.0.7" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" + integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== + dependencies: + node-gyp-build "^4.3.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -1877,6 +3787,15 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + wasmbuilder@0.0.16: version "0.0.16" resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" @@ -1894,6 +3813,32 @@ web-worker@1.2.0: resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-typed-array@^1.1.16: + version "1.1.19" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + widest-line@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" @@ -1901,6 +3846,14 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + workerpool@^6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" @@ -1930,11 +3883,21 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== +xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" From c62fe8da6ac8839ffe5bf8c06b262ee36b35ae88 Mon Sep 17 00:00:00 2001 From: parketh Date: Mon, 20 Oct 2025 22:32:36 +0100 Subject: [PATCH 10/41] chore: refactor utils --- script/keccak.ts => utils/keccak.utils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename script/keccak.ts => utils/keccak.utils.ts (81%) diff --git a/script/keccak.ts b/utils/keccak.utils.ts similarity index 81% rename from script/keccak.ts rename to utils/keccak.utils.ts index cae1d07..bb2bf36 100644 --- a/script/keccak.ts +++ b/utils/keccak.utils.ts @@ -4,7 +4,7 @@ const FIELD_P = BigInt( '21888242871839275222246405745257275088548364400416034343698204186575808495617', ) -const keccak = async (str: string) => { +export const keccak = async (str: string) => { const keccak = keccak256(toUtf8Bytes(str)) const n = BigInt(keccak) const bigint = n % FIELD_P @@ -16,4 +16,4 @@ const keccak = async (str: string) => { } } -keccak('zero').then(console.log) +// keccak('zero').then(console.log) From d410bdddbf190c76768552dbac6ea074adef6299 Mon Sep 17 00:00:00 2001 From: parketh Date: Tue, 21 Oct 2025 19:49:49 +0100 Subject: [PATCH 11/41] feat: add circuits --- circuits/merkleTree.circom | 53 +++++++++++++++++++++++++++++++ circuits/withdraw.circom | 64 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 circuits/merkleTree.circom create mode 100644 circuits/withdraw.circom diff --git a/circuits/merkleTree.circom b/circuits/merkleTree.circom new file mode 100644 index 0000000..ba0c31b --- /dev/null +++ b/circuits/merkleTree.circom @@ -0,0 +1,53 @@ +pragma circom 2.0.0; + +include "../node_modules/circomlib/circuits/mimcsponge.circom"; + +// Hash two values using the MiMCSponge hash function +template MiMCSpongeHash() { + signal input left; + signal input right; + signal output hash; + + component hasher = MiMCSponge(2, 220, 1); + hasher.ins[0] <== left; + hasher.ins[1] <== right; + hasher.k <== 0; + hash <== hasher.outs[0]; +} + +// if s == 0 returns [in[0], in[1]] +// if s == 1 returns [in[1], in[0]] +template DualMux() { + signal input in[2]; + signal input s; + signal output out[2]; + + s * (1 - s) === 0; + out[0] <== (in[1] - in[0])*s + in[0]; + out[1] <== (in[0] - in[1])*s + in[1]; +} + +// Verifies that merkle proof is correct for given merkle root and a leaf +// pathIndices input is an array of 0/1 selectors telling whether given pathElement is on the left or right side of merkle path +template MerkleTreeChecker(levels) { + signal input leaf; + signal input root; + signal input pathElements[levels]; + signal input pathIndices[levels]; + + component selectors[levels]; + component hashers[levels]; + + for (var i = 0; i < levels; i++) { + selectors[i] = DualMux(); + selectors[i].in[0] <== i == 0 ? leaf : hashers[i - 1].hash; + selectors[i].in[1] <== pathElements[i]; + selectors[i].s <== pathIndices[i]; + + hashers[i] = MiMCSpongeHash(); + hashers[i].left <== selectors[i].out[0]; + hashers[i].right <== selectors[i].out[1]; + } + + root === hashers[levels - 1].hash; +} diff --git a/circuits/withdraw.circom b/circuits/withdraw.circom new file mode 100644 index 0000000..0319211 --- /dev/null +++ b/circuits/withdraw.circom @@ -0,0 +1,64 @@ +pragma circom 2.0.0; + +include "../node_modules/circomlib/circuits/bitify.circom"; +include "../node_modules/circomlib/circuits/poseidon.circom"; +include "merkleTree.circom"; + +// Computes Poseidon(nullifier + secret) and Poseidon(nullifier) +template CommitmentHasher() { + signal input nullifier; + signal input secret; + signal output commitment; + signal output nullifierHash; + + component commitmentHasher = Poseidon(2); + component nullifierHasher = Poseidon(1); + + commitmentHasher.inputs[0] <== nullifier; + commitmentHasher.inputs[1] <== secret; + nullifierHasher.inputs[0] <== nullifier; + + commitment <== commitmentHasher.out; + nullifierHash <== nullifierHasher.out; +} + +// Verifies that commitment that corresponds to given secret and nullifier is included in the merkle tree of deposits +template Withdraw(levels) { + signal input root; + signal input nullifierHash; + signal input recipient; // not taking part in any computations + signal input relayer; // not taking part in any computations + signal input relayerFee; // not taking part in any computations + signal input gasRefund; // not taking part in any computations + signal input nullifier; + signal input secret; + signal input pathElements[levels]; + signal input pathIndices[levels]; + + component hasher = CommitmentHasher(); + hasher.nullifier <== nullifier; + hasher.secret <== secret; + hasher.nullifierHash === nullifierHash; + + component tree = MerkleTreeChecker(levels); + tree.leaf <== hasher.commitment; + tree.root <== root; + for (var i = 0; i < levels; i++) { + tree.pathElements[i] <== pathElements[i]; + tree.pathIndices[i] <== pathIndices[i]; + } + + // Add hidden signals to make sure that tampering with recipient or fee will invalidate the snark proof + // Most likely it is not required, but it's better to stay on the safe side and it only takes 2 constraints + // Squares are used to prevent optimizer from removing those constraints + signal recipientSquare; + signal relayerFeeSquare; + signal relayerSquare; + signal gasRefundSquare; + recipientSquare <== recipient * recipient; + relayerFeeSquare <== relayerFee * relayerFee; + relayerSquare <== relayer * relayer; + gasRefundSquare <== gasRefund * gasRefund; +} + +component main {public [root, nullifierHash, recipient, relayer, relayerFee, gasRefund]} = Withdraw(20); From a9c91c159adf0858b5d6f2af45c1f64eff2ed19f Mon Sep 17 00:00:00 2001 From: parketh Date: Tue, 21 Oct 2025 19:56:33 +0100 Subject: [PATCH 12/41] add proof gen + verification tests --- .gitignore | 3 + README.md | 47 +- package.json | 18 + src/contracts/Verifier.sol | 232 ++++++ test/ETHPrivateBank.test.ts | 168 +++++ test/HasherLib.test.ts | 2 +- types/ffjavascript.d.ts | 20 + types/snarkjs.d.ts | 14 + utils/PrivateBank.utils.ts | 47 ++ utils/types.utils.ts | 23 + yarn.lock | 1339 +++++++++++++++++++++-------------- 11 files changed, 1363 insertions(+), 550 deletions(-) create mode 100644 src/contracts/Verifier.sol create mode 100644 test/ETHPrivateBank.test.ts create mode 100644 types/ffjavascript.d.ts create mode 100644 types/snarkjs.d.ts create mode 100644 utils/PrivateBank.utils.ts create mode 100644 utils/types.utils.ts diff --git a/.gitignore b/.gitignore index cc99de9..c8281f7 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ cache/ out/ artifacts/ +# Build files +build/ + # Ignores development broadcast logs !/broadcast /broadcast/*/31337/ diff --git a/README.md b/README.md index f929e3d..a36771d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,48 @@ ## Private Money -Private Money is a modernized fork of Tornado Cash allowing private money transfers on Base. \ No newline at end of file +Private Money is a modernized fork of Tornado Cash allowing private money transfers on Base. + +## Setup + +1. Install npm dependencies + +```bash +yarn install +``` + +2. Install `circom` (note: requires `rust`) + +```bash +# refer to latest instructions at: https://docs.circom.io/getting-started/installation/ + +# clone repo +git clone https://github.com/iden3/circom.git + +# install circom +cargo build --release +cargo install --path circom +``` + +3. Install `snarkjs` (note: requires `node`) + +```bash +npm install -g snarkjs +``` + +4. Download `ptau` file + +We use prepared `.ptau` files from the [`privacy-ethereum/perpetualpowersoftau`](https://github.com/privacy-ethereum/perpetualpowersoftau) repo. + +The `withdraw` circuit has 27.4k constraints, so we use the `ppot_0080_15.ptau` which has 32.7k points and is 36mb in size. + +To download the file, run: + +```bash +yarn run setup +``` + +5. Build circuits + +```bash +yarn run build:circuit +``` \ No newline at end of file diff --git a/package.json b/package.json index 1cd51a6..76160ad 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,15 @@ { + "scripts": { + "setup:mkdir": "mkdir -p build/circuits", + "setup:download": "wget https://pse-trusted-setup-ppot.s3.eu-central-1.amazonaws.com/pot28_0080/ppot_0080_15.ptau -O build/circuits/ppot_0080_15.ptau", + "setup": "npm run setup:mkdir && npm run setup:download", + "info:circuit": "npx snarkjs r1cs info build/circuits/withdraw.r1cs", + "build:circuit:compile": "circom circuits/withdraw.circom --r1cs --wasm --sym -o build/circuits", + "build:circuit:setup": "npx snarkjs groth16 setup build/circuits/withdraw.r1cs build/circuits/ppot_0080_15.ptau build/circuits/withdraw.zkey", + "build:circuit:export:key": "npx snarkjs zkey export verificationkey build/circuits/withdraw.zkey build/circuits/verification_key.json", + "build:circuit:export:contract": "npx snarkjs zkey export solidityverifier build/circuits/withdraw.zkey build/circuits/Verifier.sol", + "build:circuit": "npm run build:circuit:compile && npm run build:circuit:setup && npm run build:circuit:export:key && npm run build:circuit:export:contract" + }, "devDependencies": { "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-waffle": "^2.0.6", @@ -6,13 +17,20 @@ "@types/chai": "^5.2.2", "@types/mocha": "^10.0.10", "@types/node": "^24.8.1", + "@types/snarkjs": "^0.7.9", "chai": "^6.2.0", "circomlibjs": "^0.1.7", "ethereum-waffle": "^4.0.10", "ethers": "^5.7.2", + "ffjavascript": "^0.3.1", "fixed-merkle-tree": "^0.7.3", "hardhat": "^2.24.2", + "snarkjs": "^0.7.5", "ts-node": "^10.9.2", "typescript": "^5.9.3" + }, + "dependencies": { + "@iden3/js-crypto": "^1.3.2", + "circomlib": "^2.0.5" } } diff --git a/src/contracts/Verifier.sol b/src/contracts/Verifier.sol new file mode 100644 index 0000000..857f823 --- /dev/null +++ b/src/contracts/Verifier.sol @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: MIT +/* + Copyright 2021 0KIMS association. + + This file is generated with [snarkJS](https://github.com/iden3/snarkjs). + + snarkJS is a free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + snarkJS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with snarkJS. If not, see . +*/ + +pragma solidity ^0.8.24; + +contract Verifier { + // Scalar field size + uint256 constant r = + 21888242871839275222246405745257275088548364400416034343698204186575808495617; + // Base field size + uint256 constant q = + 21888242871839275222246405745257275088696311157297823662689037894645226208583; + + // Verification Key data + uint256 constant alphax = + 16428432848801857252194528405604668803277877773566238944394625302971855135431; + uint256 constant alphay = + 16846502678714586896801519656441059708016666274385668027902869494772365009666; + uint256 constant betax1 = + 3182164110458002340215786955198810119980427837186618912744689678939861918171; + uint256 constant betax2 = + 16348171800823588416173124589066524623406261996681292662100840445103873053252; + uint256 constant betay1 = + 4920802715848186258981584729175884379674325733638798907835771393452862684714; + uint256 constant betay2 = + 19687132236965066906216944365591810874384658708175106803089633851114028275753; + uint256 constant gammax1 = + 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant gammax2 = + 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant gammay1 = + 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant gammay2 = + 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant deltax1 = + 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant deltax2 = + 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant deltay1 = + 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant deltay2 = + 8495653923123431417604973247489272438418190587263600148770280649306958101930; + + uint256 constant IC0x = + 19345027579055691442232030885585358603661387761211135985107572956835645821424; + uint256 constant IC0y = + 6970734058131104011332651160749990650751392498667137665320645656029949031038; + + uint256 constant IC1x = + 14090489076103670597018116520648535856812238729299721181075397277514784393718; + uint256 constant IC1y = + 17571797013621969995736067140027247406932905556801850515510678415761452802073; + + uint256 constant IC2x = + 4050967825025692193456888093898318244575492240770650835291567617213381285954; + uint256 constant IC2y = + 21493757562808989843905945177884706190858964447230823163868375585722894699543; + + uint256 constant IC3x = + 5112752980131522575116927374094828581157087194474483576327716188957360001977; + uint256 constant IC3y = + 13593038714319541077699488665375854782049057687266926183487979978077858256907; + + uint256 constant IC4x = + 13641957649997242479421402730016051359703541440321045845032306239820608864918; + uint256 constant IC4y = + 15236924403742880579660502380396794016475355429085457791907345970652568972555; + + uint256 constant IC5x = + 474321822140723381328860273216999357723214550487194043528076824713580975455; + uint256 constant IC5y = + 5011919448025533158096087868794277175434873567880624898473259049027906972420; + + uint256 constant IC6x = + 10198416267615844257439351470961284035725279158422282821713285143871066671943; + uint256 constant IC6y = + 13916876023165539688312045497383401714445273306984016241679553491287767202329; + + // Memory data + uint16 constant pVk = 0; + uint16 constant pPairing = 128; + + uint16 constant pLastMem = 896; + + function verifyProof( + uint[2] calldata _pA, + uint[2][2] calldata _pB, + uint[2] calldata _pC, + uint[6] calldata _pubSignals + ) public view returns (bool) { + assembly { + function checkField(v) { + if iszero(lt(v, r)) { + mstore(0, 0) + return(0, 0x20) + } + } + + // G1 function to multiply a G1 value(x,y) to value in an address + function g1_mulAccC(pR, x, y, s) { + let success + let mIn := mload(0x40) + mstore(mIn, x) + mstore(add(mIn, 32), y) + mstore(add(mIn, 64), s) + + success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + + mstore(add(mIn, 64), mload(pR)) + mstore(add(mIn, 96), mload(add(pR, 32))) + + success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + } + + function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { + let _pPairing := add(pMem, pPairing) + let _pVk := add(pMem, pVk) + + mstore(_pVk, IC0x) + mstore(add(_pVk, 32), IC0y) + + // Compute the linear combination vk_x + + g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) + + g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) + + g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) + + g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) + + g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) + + g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) + + // -A + mstore(_pPairing, calldataload(pA)) + mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) + + // B + mstore(add(_pPairing, 64), calldataload(pB)) + mstore(add(_pPairing, 96), calldataload(add(pB, 32))) + mstore(add(_pPairing, 128), calldataload(add(pB, 64))) + mstore(add(_pPairing, 160), calldataload(add(pB, 96))) + + // alpha1 + mstore(add(_pPairing, 192), alphax) + mstore(add(_pPairing, 224), alphay) + + // beta2 + mstore(add(_pPairing, 256), betax1) + mstore(add(_pPairing, 288), betax2) + mstore(add(_pPairing, 320), betay1) + mstore(add(_pPairing, 352), betay2) + + // vk_x + mstore(add(_pPairing, 384), mload(add(pMem, pVk))) + mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) + + // gamma2 + mstore(add(_pPairing, 448), gammax1) + mstore(add(_pPairing, 480), gammax2) + mstore(add(_pPairing, 512), gammay1) + mstore(add(_pPairing, 544), gammay2) + + // C + mstore(add(_pPairing, 576), calldataload(pC)) + mstore(add(_pPairing, 608), calldataload(add(pC, 32))) + + // delta2 + mstore(add(_pPairing, 640), deltax1) + mstore(add(_pPairing, 672), deltax2) + mstore(add(_pPairing, 704), deltay1) + mstore(add(_pPairing, 736), deltay2) + + let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) + + isOk := and(success, mload(_pPairing)) + } + + let pMem := mload(0x40) + mstore(0x40, add(pMem, pLastMem)) + + // Validate that all evaluations ∈ F + + checkField(calldataload(add(_pubSignals, 0))) + + checkField(calldataload(add(_pubSignals, 32))) + + checkField(calldataload(add(_pubSignals, 64))) + + checkField(calldataload(add(_pubSignals, 96))) + + checkField(calldataload(add(_pubSignals, 128))) + + checkField(calldataload(add(_pubSignals, 160))) + + // Validate all evaluations + let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) + + mstore(0, isValid) + return(0, 0x20) + } + } +} diff --git a/test/ETHPrivateBank.test.ts b/test/ETHPrivateBank.test.ts new file mode 100644 index 0000000..82a485f --- /dev/null +++ b/test/ETHPrivateBank.test.ts @@ -0,0 +1,168 @@ +import { Contract } from 'ethers' +import { ethers } from 'hardhat' +import { generateDeposit, generateProof, verifyProof } from '../utils/PrivateBank.utils' +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { expect } from './shared/expect' +import FixedMerkleTree from 'fixed-merkle-tree' +import { getMiMCSpongeHasher } from '../utils/MiMCSponge.utils' +import { utils } from 'ffjavascript' +import { bufferToBigInt, uint8ArrayToBigInt } from '../utils/types.utils' +import { poseidon } from '@iden3/js-crypto' + +describe('ETHPrivateBank', function () { + const ZERO = '0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8' + const DEPOSIT_AMOUNT = ethers.utils.parseEther('1') + const HEIGHT = 20 + const relayerFee = BigInt(25e15) + const gasRefund = BigInt(0) + + let verifier: Contract + let privateBank: Contract + let sender: SignerWithAddress + let recipient: SignerWithAddress + let relayer: SignerWithAddress + + beforeEach(async () => { + // deploy Verifier contract + const Verifier = await ethers.getContractFactory('Verifier') + verifier = await Verifier.deploy() + await verifier.deployed() + + // deploy PrivateBank contract + const PrivateBank = await ethers.getContractFactory('ETHPrivateBank') + privateBank = await PrivateBank.deploy(verifier.address, HEIGHT, DEPOSIT_AMOUNT) + await privateBank.deployed() + + // get signers + ;[sender, recipient, relayer] = await ethers.getSigners() + }) + + it('deposit(): should process deposit and emit event', async () => { + // first deposit + const deposit = generateDeposit() + const tx = await privateBank + .connect(sender) + .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) + const receipt = await tx.wait() + + // check event + const depositEvt = receipt.events[0] + expect(depositEvt.event).to.equal('Deposit') + expect(depositEvt.args.user).to.equal(sender.address) + expect(depositEvt.args.commitment).to.equal(deposit.commitment) + expect(depositEvt.args.index).to.equal(0) + + // 2nd deposit + const deposit2 = generateDeposit() + const tx2 = await privateBank + .connect(sender) + .deposit(deposit2.commitment, { value: DEPOSIT_AMOUNT }) + const receipt2 = await tx2.wait() + + // check event + const depositEvt2 = receipt2.events[0] + expect(depositEvt2.event).to.equal('Deposit') + expect(depositEvt2.args.user).to.equal(sender.address) + expect(depositEvt2.args.commitment).to.equal(deposit2.commitment) + expect(depositEvt2.args.index).to.equal(1) + }) + + it('deposit(): should reject duplicate deposit', async () => { + // generate deposit + const deposit = generateDeposit() + const tx = await privateBank + .connect(sender) + .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) + const receipt = await tx.wait() + + // deposit again + await expect( + privateBank.connect(sender).deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }), + ).to.be.revertedWith('DuplicateCommitment') + }) + + it('snarkjs should correctly generate and verify proof', async () => { + // generate deposit + const deposit = generateDeposit() + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit.commitment) + + // setup proof + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([uint8ArrayToBigInt(deposit.nullifier)]), + nullifier: bufferToBigInt(deposit.nullifier), + relayer: relayer.address, + recipient: recipient.address, + relayerFee, + gasRefund, + secret: bufferToBigInt(deposit.secret), + pathElements: tree.path(0).pathElements, + pathIndices: tree.path(0).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + + // generate proof + const proof = await generateProof(input) + + // verify proof + const isValid = await verifyProof(proof) + expect(isValid).to.be.true + }) + + it('snarkjs proof should be resistant to tampering', async () => { + // generate deposit + const deposit = generateDeposit() + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit.commitment) + + // setup proof + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([uint8ArrayToBigInt(deposit.nullifier)]), + nullifier: bufferToBigInt(deposit.nullifier), + relayer: relayer.address, + recipient: recipient.address, + relayerFee, + gasRefund, + secret: bufferToBigInt(deposit.secret), + pathElements: tree.path(0).pathElements, + pathIndices: tree.path(0).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + + // generate proof + const proof = await generateProof(input) + + // change nullifierHash and verify proof + let proof1 = proof + proof1.publicSignals[1] = + '20852167369483002368129571733491972748550005954511142719407505103546956288274' + let isValid = await verifyProof(proof1) + expect(isValid).to.be.false + + // change recipient and verify proof + let proof2 = proof + proof2.publicSignals[2] = '344073830386746567427978432078835137280280269756' + isValid = await verifyProof(proof2) + expect(isValid).to.be.false + + // change fee and verify proof + let proof3 = proof + proof3.publicSignals[4] = '0' + isValid = await verifyProof(proof3) + expect(isValid).to.be.false + }) +}) diff --git a/test/HasherLib.test.ts b/test/HasherLib.test.ts index 2ec0b04..0258739 100644 --- a/test/HasherLib.test.ts +++ b/test/HasherLib.test.ts @@ -40,7 +40,7 @@ describe('HasherLib', function () { } }) - it('gas estimate: hash()', async () => { + it.skip('gas estimate: hash()', async () => { const gas = await hasher.estimateGas.hash(ZERO, ZERO) console.log('Gas used - `hash()`:', gas.toString()) }) diff --git a/types/ffjavascript.d.ts b/types/ffjavascript.d.ts new file mode 100644 index 0000000..2927302 --- /dev/null +++ b/types/ffjavascript.d.ts @@ -0,0 +1,20 @@ +declare module 'ffjavascript' { + type Stringifiable = + | bigint + | Uint8Array + | string + | number + | { [key: string]: Stringifiable } + | Stringifiable[] + + function stringifyBigInts(o: Stringifiable): Stringifiable + + type Unstringifiable = string | bigint | { [key: string]: Unstringifiable } | Unstringifiable[] + + function unstringifyBigInts(o: Unstringifiable): Unstringifiable + + export const utils: { + stringifyBigInts: (o: Stringifiable) => Stringifiable + unstringifyBigInts: (o: Unstringifiable) => Unstringifiable + } +} diff --git a/types/snarkjs.d.ts b/types/snarkjs.d.ts new file mode 100644 index 0000000..a483e24 --- /dev/null +++ b/types/snarkjs.d.ts @@ -0,0 +1,14 @@ +declare module 'snarkjs' { + export const groth16: { + fullProve: ( + input: any, + wasmFile: string, + zkeyFileName: string, + logger?: any, + wtnsCalcOptions?: any, + proverOptions?: any, + ) => Promise + prove: (input: any, wasmFile: string, zkeyFileName: string, logger?: any) => Promise + verify: (_vk_verifier: any, _publicSignals: any, _proof: any, logger?: any) => Promise + } +} diff --git a/utils/PrivateBank.utils.ts b/utils/PrivateBank.utils.ts new file mode 100644 index 0000000..9c9e755 --- /dev/null +++ b/utils/PrivateBank.utils.ts @@ -0,0 +1,47 @@ +import crypto from 'crypto' +import { bigintToHex, uint8ArrayToBigInt } from './types.utils' +import { poseidon } from '@iden3/js-crypto' +import { groth16 } from 'snarkjs' +import { Stringifiable } from 'ffjavascript' +import path from 'path' +import fs from 'fs' + +export type Proof = { + proof: { + pi_a: string[] + pi_b: string[][] + pi_c: string[] + protocol: string + curve: string + } + publicSignals: string[] +} + +export const generateDeposit = () => { + const secret = randomBigInt(31) + const nullifier = randomBigInt(31) + const commitment = bigintToHex( + poseidon.hash([uint8ArrayToBigInt(nullifier), uint8ArrayToBigInt(secret)]), + ) + const deposit = { secret, nullifier, commitment } + return deposit +} + +const randomBigInt = (numBytes: number) => { + const bytes = crypto.randomBytes(numBytes) + // const littleEndianBigInt = BigInt('0x' + bytes.reverse().toString('hex')) + return bytes.reverse() +} + +export const generateProof = async (input: Stringifiable): Promise => { + const wasmPath = path.resolve(__dirname, '../build/circuits/withdraw_js/withdraw.wasm') + const provingKeyPath = path.resolve(__dirname, '../build/circuits/withdraw.zkey') + const proof = (await groth16.fullProve(input, wasmPath, provingKeyPath)) as Proof + return proof +} + +export const verifyProof = async (proof: Proof): Promise => { + const verificationKeyPath = path.resolve(__dirname, '../build/circuits/verification_key.json') + const verificationKey = JSON.parse(fs.readFileSync(verificationKeyPath, 'utf8')) + return await groth16.verify(verificationKey, proof.publicSignals, proof.proof) +} diff --git a/utils/types.utils.ts b/utils/types.utils.ts new file mode 100644 index 0000000..cf47bb2 --- /dev/null +++ b/utils/types.utils.ts @@ -0,0 +1,23 @@ +export const bigintToHex = (bigint: bigint) => { + return '0x' + bigint.toString(16).padStart(64, '0') +} + +export const bigintToBuffer = (bigint: bigint) => { + return Buffer.from(bigintToHex(bigint)) +} + +export const bufferToBigInt = (buffer: Buffer) => { + return BigInt('0x' + buffer.toString('hex')) +} + +export const bufferToHex = (buffer: Buffer) => { + return '0x' + buffer.toString('hex').padStart(64, '0') +} + +export const uint8ArrayToHex = (uint8Array: Uint8Array) => { + return '0x' + Buffer.from(uint8Array).toString('hex').padStart(64, '0') +} + +export const uint8ArrayToBigInt = (uint8Array: Uint8Array) => { + return BigInt('0x' + Buffer.from(uint8Array).toString('hex')) +} diff --git a/yarn.lock b/yarn.lock index f05a7d3..58cd281 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,14 +4,14 @@ "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@ethereum-waffle/chai@4.0.10": version "4.0.10" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/chai/-/chai-4.0.10.tgz#6f600a40b6fdaed331eba42b8625ff23f3a0e59a" + resolved "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-4.0.10.tgz" integrity sha512-X5RepE7Dn8KQLFO7HHAAe+KeGaX/by14hn90wePGBhzL54tq4Y8JscZFu+/LCwCl6TnkAAy5ebiMoqJ37sFtWw== dependencies: "@ethereum-waffle/provider" "4.0.5" @@ -20,7 +20,7 @@ "@ethereum-waffle/compiler@4.0.3": version "4.0.3" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz#069e2df24b879b8a7b78857bad6f8bf6ebc8a5b1" + resolved "https://registry.npmjs.org/@ethereum-waffle/compiler/-/compiler-4.0.3.tgz" integrity sha512-5x5U52tSvEVJS6dpCeXXKvRKyf8GICDwiTwUvGD3/WD+DpvgvaoHOL82XqpTSUHgV3bBq6ma5/8gKUJUIAnJCw== dependencies: "@resolver-engine/imports" "^0.3.3" @@ -33,17 +33,17 @@ "@ethereum-waffle/ens@4.0.3": version "4.0.3" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/ens/-/ens-4.0.3.tgz#4a46ac926414f3c83b4e8cc2562c8e2aee06377a" + resolved "https://registry.npmjs.org/@ethereum-waffle/ens/-/ens-4.0.3.tgz" integrity sha512-PVLcdnTbaTfCrfSOrvtlA9Fih73EeDvFS28JQnT5M5P4JMplqmchhcZB1yg/fCtx4cvgHlZXa0+rOCAk2Jk0Jw== "@ethereum-waffle/mock-contract@4.0.4": version "4.0.4" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz#f13fea29922d87a4d2e7c4fc8fe72ea04d2c13de" + resolved "https://registry.npmjs.org/@ethereum-waffle/mock-contract/-/mock-contract-4.0.4.tgz" integrity sha512-LwEj5SIuEe9/gnrXgtqIkWbk2g15imM/qcJcxpLyAkOj981tQxXmtV4XmQMZsdedEsZ/D/rbUAOtZbgwqgUwQA== "@ethereum-waffle/provider@4.0.5": version "4.0.5" - resolved "https://registry.yarnpkg.com/@ethereum-waffle/provider/-/provider-4.0.5.tgz#8a65dbf0263f4162c9209608205dee1c960e716b" + resolved "https://registry.npmjs.org/@ethereum-waffle/provider/-/provider-4.0.5.tgz" integrity sha512-40uzfyzcrPh+Gbdzv89JJTMBlZwzya1YLDyim8mVbEqYLP5VRYWoGp0JMyaizgV3hMoUFRqJKVmIUw4v7r3hYw== dependencies: "@ethereum-waffle/ens" "4.0.3" @@ -53,7 +53,7 @@ "@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.0", "@ethereumjs/block@^3.6.2": version "3.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" + resolved "https://registry.npmjs.org/@ethereumjs/block/-/block-3.6.3.tgz" integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== dependencies: "@ethereumjs/common" "^2.6.5" @@ -63,7 +63,7 @@ "@ethereumjs/blockchain@^5.5.0": version "5.5.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz#aa49a6a04789da6b66b5bcbb0d0b98efc369f640" + resolved "https://registry.npmjs.org/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz" integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== dependencies: "@ethereumjs/block" "^3.6.2" @@ -77,7 +77,7 @@ "@ethereumjs/common@2.6.0": version "2.6.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.0.tgz#feb96fb154da41ee2cc2c5df667621a440f36348" + resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.0.tgz" integrity sha512-Cq2qS0FTu6O2VU1sgg+WyU9Ps0M6j/BEMHN+hRaECXCV/r0aI78u4N6p52QW/BDVhwWZpCdrvG8X7NJdzlpNUA== dependencies: crc-32 "^1.2.0" @@ -85,7 +85,7 @@ "@ethereumjs/common@^2.6.0", "@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": version "2.6.5" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + resolved "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz" integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== dependencies: crc-32 "^1.2.0" @@ -93,7 +93,7 @@ "@ethereumjs/ethash@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" + resolved "https://registry.npmjs.org/@ethereumjs/ethash/-/ethash-1.1.0.tgz" integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== dependencies: "@ethereumjs/block" "^3.5.0" @@ -104,12 +104,12 @@ "@ethereumjs/rlp@^5.0.2": version "5.0.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.2.tgz#c89bd82f2f3bec248ab2d517ae25f5bbc4aac842" + resolved "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz" integrity sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA== "@ethereumjs/tx@3.4.0": version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.4.0.tgz#7eb1947eefa55eb9cf05b3ca116fb7a3dbd0bce7" + resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.4.0.tgz" integrity sha512-WWUwg1PdjHKZZxPPo274ZuPsJCWV3SqATrEKQP1n2DrVYVP1aZIYpo/mFaA0BDoE0tIQmBeimRCEA0Lgil+yYw== dependencies: "@ethereumjs/common" "^2.6.0" @@ -117,7 +117,7 @@ "@ethereumjs/tx@^3.4.0", "@ethereumjs/tx@^3.5.2": version "3.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + resolved "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz" integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== dependencies: "@ethereumjs/common" "^2.6.4" @@ -125,7 +125,7 @@ "@ethereumjs/util@^9.1.0": version "9.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" + resolved "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz" integrity sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog== dependencies: "@ethereumjs/rlp" "^5.0.2" @@ -133,7 +133,7 @@ "@ethereumjs/vm@5.6.0": version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.6.0.tgz#e0ca62af07de820143674c30b776b86c1983a464" + resolved "https://registry.npmjs.org/@ethereumjs/vm/-/vm-5.6.0.tgz" integrity sha512-J2m/OgjjiGdWF2P9bj/4LnZQ1zRoZhY8mRNVw/N3tXliGI8ai1sI1mlDPkLpeUUM4vq54gH6n0ZlSpz8U/qlYQ== dependencies: "@ethereumjs/block" "^3.6.0" @@ -151,7 +151,7 @@ "@ethersproject/abi@5.8.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz" integrity sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q== dependencies: "@ethersproject/address" "^5.8.0" @@ -166,7 +166,7 @@ "@ethersproject/abstract-provider@5.8.0", "@ethersproject/abstract-provider@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz" integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== dependencies: "@ethersproject/bignumber" "^5.8.0" @@ -179,7 +179,7 @@ "@ethersproject/abstract-signer@5.8.0", "@ethersproject/abstract-signer@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz" integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== dependencies: "@ethersproject/abstract-provider" "^5.8.0" @@ -190,7 +190,7 @@ "@ethersproject/address@5.8.0", "@ethersproject/address@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz" integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== dependencies: "@ethersproject/bignumber" "^5.8.0" @@ -201,14 +201,14 @@ "@ethersproject/base64@5.8.0", "@ethersproject/base64@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz" integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== dependencies: "@ethersproject/bytes" "^5.8.0" "@ethersproject/basex@5.8.0", "@ethersproject/basex@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.8.0.tgz#1d279a90c4be84d1c1139114a1f844869e57d03a" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz" integrity sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -216,7 +216,7 @@ "@ethersproject/bignumber@5.8.0", "@ethersproject/bignumber@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz" integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -225,21 +225,21 @@ "@ethersproject/bytes@5.8.0", "@ethersproject/bytes@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz" integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== dependencies: "@ethersproject/logger" "^5.8.0" "@ethersproject/constants@5.8.0", "@ethersproject/constants@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz" integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== dependencies: "@ethersproject/bignumber" "^5.8.0" "@ethersproject/contracts@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.8.0.tgz#243a38a2e4aa3e757215ea64e276f8a8c9d8ed73" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz" integrity sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ== dependencies: "@ethersproject/abi" "^5.8.0" @@ -255,7 +255,7 @@ "@ethersproject/hash@5.8.0", "@ethersproject/hash@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz" integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== dependencies: "@ethersproject/abstract-signer" "^5.8.0" @@ -270,7 +270,7 @@ "@ethersproject/hdnode@5.8.0", "@ethersproject/hdnode@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.8.0.tgz#a51ae2a50bcd48ef6fd108c64cbae5e6ff34a761" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz" integrity sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA== dependencies: "@ethersproject/abstract-signer" "^5.8.0" @@ -288,7 +288,7 @@ "@ethersproject/json-wallets@5.8.0", "@ethersproject/json-wallets@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz#d18de0a4cf0f185f232eb3c17d5e0744d97eb8c9" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz" integrity sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w== dependencies: "@ethersproject/abstract-signer" "^5.8.0" @@ -307,7 +307,7 @@ "@ethersproject/keccak256@5.8.0", "@ethersproject/keccak256@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz" integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -315,19 +315,19 @@ "@ethersproject/logger@5.8.0", "@ethersproject/logger@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz" integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== "@ethersproject/networks@5.8.0", "@ethersproject/networks@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz" integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== dependencies: "@ethersproject/logger" "^5.8.0" "@ethersproject/pbkdf2@5.8.0", "@ethersproject/pbkdf2@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz#cd2621130e5dd51f6a0172e63a6e4a0c0a0ec37e" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz" integrity sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -335,14 +335,14 @@ "@ethersproject/properties@5.8.0", "@ethersproject/properties@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz" integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== dependencies: "@ethersproject/logger" "^5.8.0" "@ethersproject/providers@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.8.0.tgz#6c2ae354f7f96ee150439f7de06236928bc04cb4" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz" integrity sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw== dependencies: "@ethersproject/abstract-provider" "^5.8.0" @@ -368,7 +368,7 @@ "@ethersproject/random@5.8.0", "@ethersproject/random@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.8.0.tgz#1bced04d49449f37c6437c701735a1a022f0057a" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz" integrity sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -376,7 +376,7 @@ "@ethersproject/rlp@5.8.0", "@ethersproject/rlp@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz" integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -384,7 +384,7 @@ "@ethersproject/sha2@5.8.0", "@ethersproject/sha2@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.8.0.tgz#8954a613bb78dac9b46829c0a95de561ef74e5e1" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz" integrity sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -393,7 +393,7 @@ "@ethersproject/signing-key@5.8.0", "@ethersproject/signing-key@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz" integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -405,7 +405,7 @@ "@ethersproject/solidity@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.8.0.tgz#429bb9fcf5521307a9448d7358c26b93695379b9" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz" integrity sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA== dependencies: "@ethersproject/bignumber" "^5.8.0" @@ -417,7 +417,7 @@ "@ethersproject/strings@5.8.0", "@ethersproject/strings@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz" integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -426,7 +426,7 @@ "@ethersproject/transactions@5.8.0", "@ethersproject/transactions@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz" integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== dependencies: "@ethersproject/address" "^5.8.0" @@ -441,7 +441,7 @@ "@ethersproject/units@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.8.0.tgz#c12f34ba7c3a2de0e9fa0ed0ee32f3e46c5c2c6a" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz" integrity sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ== dependencies: "@ethersproject/bignumber" "^5.8.0" @@ -450,7 +450,7 @@ "@ethersproject/wallet@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.8.0.tgz#49c300d10872e6986d953e8310dc33d440da8127" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz" integrity sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA== dependencies: "@ethersproject/abstract-provider" "^5.8.0" @@ -471,7 +471,7 @@ "@ethersproject/web@5.8.0", "@ethersproject/web@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz" integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== dependencies: "@ethersproject/base64" "^5.8.0" @@ -482,7 +482,7 @@ "@ethersproject/wordlists@5.8.0", "@ethersproject/wordlists@^5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.8.0.tgz#7a5654ee8d1bb1f4dbe43f91d217356d650ad821" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz" integrity sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -493,19 +493,19 @@ "@fastify/busboy@^2.0.0": version "2.1.1" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz" integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== "@ganache/ethereum-address@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz#0e6d66f4a24f64bf687cb3ff7358fb85b9d9005e" + resolved "https://registry.npmjs.org/@ganache/ethereum-address/-/ethereum-address-0.1.4.tgz" integrity sha512-sTkU0M9z2nZUzDeHRzzGlW724xhMLXo2LeX1hixbnjHWY1Zg1hkqORywVfl+g5uOO8ht8T0v+34IxNxAhmWlbw== dependencies: "@ganache/utils" "0.1.4" "@ganache/ethereum-options@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz#6a559abb44225e2b8741a8f78a19a46714a71cd6" + resolved "https://registry.npmjs.org/@ganache/ethereum-options/-/ethereum-options-0.1.4.tgz" integrity sha512-i4l46taoK2yC41FPkcoDlEVoqHS52wcbHPqJtYETRWqpOaoj9hAg/EJIHLb1t6Nhva2CdTO84bG+qlzlTxjAHw== dependencies: "@ganache/ethereum-address" "0.1.4" @@ -517,7 +517,7 @@ "@ganache/ethereum-utils@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz#fae4b5b9e642e751ff1fa0cd7316c92996317257" + resolved "https://registry.npmjs.org/@ganache/ethereum-utils/-/ethereum-utils-0.1.4.tgz" integrity sha512-FKXF3zcdDrIoCqovJmHLKZLrJ43234Em2sde/3urUT/10gSgnwlpFmrv2LUMAmSbX3lgZhW/aSs8krGhDevDAg== dependencies: "@ethereumjs/common" "2.6.0" @@ -532,7 +532,7 @@ "@ganache/options@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/options/-/options-0.1.4.tgz#325b07e6de85094667aaaaf3d653e32404a04b78" + resolved "https://registry.npmjs.org/@ganache/options/-/options-0.1.4.tgz" integrity sha512-zAe/craqNuPz512XQY33MOAG6Si1Xp0hCvfzkBfj2qkuPcbJCq6W/eQ5MB6SbXHrICsHrZOaelyqjuhSEmjXRw== dependencies: "@ganache/utils" "0.1.4" @@ -541,7 +541,7 @@ "@ganache/rlp@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/rlp/-/rlp-0.1.4.tgz#f4043afda83e1a14a4f80607b103daf166a9b374" + resolved "https://registry.npmjs.org/@ganache/rlp/-/rlp-0.1.4.tgz" integrity sha512-Do3D1H6JmhikB+6rHviGqkrNywou/liVeFiKIpOBLynIpvZhRCgn3SEDxyy/JovcaozTo/BynHumfs5R085MFQ== dependencies: "@ganache/utils" "0.1.4" @@ -549,7 +549,7 @@ "@ganache/utils@0.1.4": version "0.1.4" - resolved "https://registry.yarnpkg.com/@ganache/utils/-/utils-0.1.4.tgz#25d60d7689e3dda6a8a7ad70e3646f07c2c39a1f" + resolved "https://registry.npmjs.org/@ganache/utils/-/utils-0.1.4.tgz" integrity sha512-oatUueU3XuXbUbUlkyxeLLH3LzFZ4y5aSkNbx6tjSIhVTPeh+AuBKYt4eQ73FFcTB3nj/gZoslgAh5CN7O369w== dependencies: emittery "0.10.0" @@ -558,19 +558,39 @@ optionalDependencies: "@trufflesuite/bigint-buffer" "1.1.9" +"@iden3/bigarray@0.0.2": + version "0.0.2" + resolved "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz" + integrity sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g== + +"@iden3/binfileutils@0.0.12": + version "0.0.12" + resolved "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.12.tgz" + integrity sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ== + dependencies: + fastfile "0.0.20" + ffjavascript "^0.3.0" + +"@iden3/js-crypto@^1.3.2": + version "1.3.2" + resolved "https://registry.npmjs.org/@iden3/js-crypto/-/js-crypto-1.3.2.tgz" + integrity sha512-B1Fk8NLIhvEahFf02VKkmmXrw6Q+n+b3pbiFUYA9eesgoTZTSPtYtb+8A2jIKZrfdYKS5PlKJC8nNWmHUGk+6w== + dependencies: + "@noble/hashes" "^2.0.1" + "@jridgewell/resolve-uri@^3.0.3": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.10": version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -578,81 +598,86 @@ "@noble/curves@1.4.2", "@noble/curves@~1.4.0": version "1.4.2" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz" integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== dependencies: "@noble/hashes" "1.4.0" "@noble/curves@~1.8.1": version "1.8.2" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.2.tgz#8f24c037795e22b90ae29e222a856294c1d9ffc7" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz" integrity sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g== dependencies: "@noble/hashes" "1.7.2" "@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== "@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== "@noble/hashes@1.7.2", "@noble/hashes@~1.7.1": version "1.7.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.2.tgz#d53c65a21658fb02f3303e7ee3ba89d6754c64b4" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz" integrity sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ== +"@noble/hashes@^2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz" + integrity sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw== + "@noble/secp256k1@1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== "@noble/secp256k1@~1.7.0": version "1.7.2" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.2.tgz#c2c3343e2dce80e15a914d7442147507f8a98e7f" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.2.tgz" integrity sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ== "@nomicfoundation/edr-darwin-arm64@0.11.3": version "0.11.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.11.3.tgz#d8e2609fc24cf20e75c3782e39cd5a95f7488075" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.11.3.tgz" integrity sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA== "@nomicfoundation/edr-darwin-x64@0.11.3": version "0.11.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.11.3.tgz#7a9e94cee330269a33c7f1dce267560c7e12dbd3" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.11.3.tgz" integrity sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA== "@nomicfoundation/edr-linux-arm64-gnu@0.11.3": version "0.11.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.11.3.tgz#cd5ec90c7263045c3dfd0b109c73206e488edc27" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.11.3.tgz" integrity sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ== "@nomicfoundation/edr-linux-arm64-musl@0.11.3": version "0.11.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.11.3.tgz#ed23df2d9844470f5661716da27d99a72a69e99e" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.11.3.tgz" integrity sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA== "@nomicfoundation/edr-linux-x64-gnu@0.11.3": version "0.11.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.11.3.tgz#87a62496c2c4b808bc4a9ae96cca1642a21c2b51" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.11.3.tgz" integrity sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw== "@nomicfoundation/edr-linux-x64-musl@0.11.3": version "0.11.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.11.3.tgz#8cfe408c73bcb9ed5e263910c313866d442f4b48" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.11.3.tgz" integrity sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg== "@nomicfoundation/edr-win32-x64-msvc@0.11.3": version "0.11.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.11.3.tgz#fb208b94553c7eb22246d73a1ac4de5bfdb97d01" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.11.3.tgz" integrity sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung== "@nomicfoundation/edr@^0.11.3": version "0.11.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.11.3.tgz#e8b30b868788e45d7a2ee2359a021ef7dcb96952" + resolved "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.11.3.tgz" integrity sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g== dependencies: "@nomicfoundation/edr-darwin-arm64" "0.11.3" @@ -665,42 +690,42 @@ "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz" integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== "@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz" integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz" integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== "@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz" integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== "@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz" integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== "@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz" integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== "@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz" integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== "@nomicfoundation/solidity-analyzer@^0.1.0": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz" integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== optionalDependencies: "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" @@ -713,22 +738,22 @@ "@nomiclabs/hardhat-ethers@^2.2.3": version "2.2.3" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz" integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== "@nomiclabs/hardhat-waffle@^2.0.6": version "2.0.6" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz#d11cb063a5f61a77806053e54009c40ddee49a54" + resolved "https://registry.npmjs.org/@nomiclabs/hardhat-waffle/-/hardhat-waffle-2.0.6.tgz" integrity sha512-+Wz0hwmJGSI17B+BhU/qFRZ1l6/xMW82QGXE/Gi+WTmwgJrQefuBs1lIf7hzQ1hLk6hpkvb/zwcNkpVKRYTQYg== "@openzeppelin/contracts@^5.4.0": version "5.4.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.4.0.tgz#177594bdb2d86c71f5d1052fe40cb4edb95fb20f" + resolved "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.4.0.tgz" integrity sha512-eCYgWnLg6WO+X52I16TZt8uEjbtdkgLC0SUX/xnAksjjrQI4Xfn4iBRoI5j55dmlOhDv1Y7BoR3cU7e3WWhC6A== "@resolver-engine/core@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.3.3.tgz#590f77d85d45bc7ecc4e06c654f41345db6ca967" + resolved "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz" integrity sha512-eB8nEbKDJJBi5p5SrvrvILn4a0h42bKtbCTri3ZxCGt6UvoQyp7HnGOfki944bUjBSHKK3RvgfViHn+kqdXtnQ== dependencies: debug "^3.1.0" @@ -737,7 +762,7 @@ "@resolver-engine/fs@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/fs/-/fs-0.3.3.tgz#fbf83fa0c4f60154a82c817d2fe3f3b0c049a973" + resolved "https://registry.npmjs.org/@resolver-engine/fs/-/fs-0.3.3.tgz" integrity sha512-wQ9RhPUcny02Wm0IuJwYMyAG8fXVeKdmhm8xizNByD4ryZlx6PP6kRen+t/haF43cMfmaV7T3Cx6ChOdHEhFUQ== dependencies: "@resolver-engine/core" "^0.3.3" @@ -745,7 +770,7 @@ "@resolver-engine/imports-fs@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz#4085db4b8d3c03feb7a425fbfcf5325c0d1e6c1b" + resolved "https://registry.npmjs.org/@resolver-engine/imports-fs/-/imports-fs-0.3.3.tgz" integrity sha512-7Pjg/ZAZtxpeyCFlZR5zqYkz+Wdo84ugB5LApwriT8XFeQoLwGUj4tZFFvvCuxaNCcqZzCYbonJgmGObYBzyCA== dependencies: "@resolver-engine/fs" "^0.3.3" @@ -754,7 +779,7 @@ "@resolver-engine/imports@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@resolver-engine/imports/-/imports-0.3.3.tgz#badfb513bb3ff3c1ee9fd56073e3144245588bcc" + resolved "https://registry.npmjs.org/@resolver-engine/imports/-/imports-0.3.3.tgz" integrity sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q== dependencies: "@resolver-engine/core" "^0.3.3" @@ -765,17 +790,17 @@ "@scure/base@~1.1.0", "@scure/base@~1.1.6": version "1.1.9" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz" integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== "@scure/base@~1.2.5": version "1.2.6" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz" integrity sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg== "@scure/bip32@1.1.5": version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz" integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== dependencies: "@noble/hashes" "~1.2.0" @@ -784,7 +809,7 @@ "@scure/bip32@1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz" integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== dependencies: "@noble/curves" "~1.4.0" @@ -793,7 +818,7 @@ "@scure/bip39@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz" integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== dependencies: "@noble/hashes" "~1.2.0" @@ -801,7 +826,7 @@ "@scure/bip39@1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz" integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== dependencies: "@noble/hashes" "~1.4.0" @@ -809,7 +834,7 @@ "@sentry/core@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== dependencies: "@sentry/hub" "5.30.0" @@ -820,7 +845,7 @@ "@sentry/hub@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: "@sentry/types" "5.30.0" @@ -829,7 +854,7 @@ "@sentry/minimal@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== dependencies: "@sentry/hub" "5.30.0" @@ -838,7 +863,7 @@ "@sentry/node@^5.18.1": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== dependencies: "@sentry/core" "5.30.0" @@ -853,7 +878,7 @@ "@sentry/tracing@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== dependencies: "@sentry/hub" "5.30.0" @@ -864,12 +889,12 @@ "@sentry/types@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== "@sentry/utils@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: "@sentry/types" "5.30.0" @@ -877,41 +902,41 @@ "@trufflesuite/bigint-buffer@1.1.10": version "1.1.10" - resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz#a1d9ca22d3cad1a138b78baaf15543637a3e1692" + resolved "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz" integrity sha512-pYIQC5EcMmID74t26GCC67946mgTJFiLXOT/BYozgrd4UEY2JHEGLhWi9cMiQCt5BSqFEvKkCHNnoj82SRjiEw== dependencies: node-gyp-build "4.4.0" "@trufflesuite/bigint-buffer@1.1.9": version "1.1.9" - resolved "https://registry.yarnpkg.com/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz#e2604d76e1e4747b74376d68f1312f9944d0d75d" + resolved "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.9.tgz" integrity sha512-bdM5cEGCOhDSwminryHJbRmXc1x7dPKg6Pqns3qyTwFlxsqUgxE29lsERS3PlIW1HTjoIGMUqsk1zQQwST1Yxw== dependencies: node-gyp-build "4.3.0" "@tsconfig/node10@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz" integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@typechain/ethers-v5@^10.0.0": version "10.2.1" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" + resolved "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz" integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== dependencies: lodash "^4.17.15" @@ -919,43 +944,43 @@ "@types/abstract-leveldown@*": version "7.2.5" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.5.tgz#db2cf364c159fb1f12be6cd3549f56387eaf8d73" + resolved "https://registry.npmjs.org/@types/abstract-leveldown/-/abstract-leveldown-7.2.5.tgz" integrity sha512-/2B0nQF4UdupuxeKTJA2+Rj1D+uDemo6P4kMwKCpbfpnzeVaWSELTsAw4Lxn3VJD6APtRrZOCuYo+4nHUQfTfg== "@types/bn.js@^4.11.3": version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz" integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== dependencies: "@types/node" "*" "@types/bn.js@^5.1.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.2.0.tgz#4349b9710e98f9ab3cdc50f1c5e4dcbd8ef29c80" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.2.0.tgz" integrity sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q== dependencies: "@types/node" "*" "@types/chai@^5.2.2": version "5.2.2" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.2.tgz#6f14cea18180ffc4416bc0fd12be05fdd73bdd6b" + resolved "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz" integrity sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== dependencies: "@types/deep-eql" "*" "@types/deep-eql@*": version "4.0.2" - resolved "https://registry.yarnpkg.com/@types/deep-eql/-/deep-eql-4.0.2.tgz#334311971d3a07121e7eb91b684a605e7eea9cbd" + resolved "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz" integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== "@types/level-errors@*": version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.2.tgz#f33ec813c50780b547463da9ad8acac89ee457d9" + resolved "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.2.tgz" integrity sha512-gyZHbcQ2X5hNXf/9KS2qGEmgDe9EN2WDM3rJ5Ele467C0nA1sLhtmv1bZiPMDYfAYCfPWft0uQIaTvXbASSTRA== "@types/levelup@^4.3.0": version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" + resolved "https://registry.npmjs.org/@types/levelup/-/levelup-4.3.3.tgz" integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== dependencies: "@types/abstract-leveldown" "*" @@ -964,75 +989,73 @@ "@types/lru-cache@5.1.1": version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + resolved "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/mkdirp@^0.5.2": version "0.5.2" - resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" + resolved "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz" integrity sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg== dependencies: "@types/node" "*" "@types/mocha@^10.0.10": version "10.0.10" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz" integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== "@types/node-fetch@^2.6.1": version "2.6.13" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.13.tgz#e0c9b7b5edbdb1b50ce32c127e85e880872d56ee" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.13.tgz" integrity sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw== dependencies: "@types/node" "*" form-data "^4.0.4" -"@types/node@*": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.9.0.tgz#4fb62beb8b322fe2955ac94f80ff5a58c941ebf4" - integrity sha512-MKNwXh3seSK8WurXF7erHPJ2AONmMwkI7zAMrXZDPIru8jRqkk6rGDBVbw4mLwfqA+ZZliiDPg05JQ3uW66tKQ== +"@types/node@*", "@types/node@^24.8.1": + version "24.8.1" + resolved "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz" + integrity sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q== dependencies: - undici-types "~7.16.0" + undici-types "~7.14.0" "@types/node@11.11.6": version "11.11.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.6.tgz#df929d1bb2eee5afdda598a41930fe50b43eaa6a" + resolved "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz" integrity sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ== -"@types/node@^24.8.1": - version "24.8.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.8.1.tgz#74c8ae00b045a0a351f2837ec00f25dfed0053be" - integrity sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q== - dependencies: - undici-types "~7.14.0" - "@types/pbkdf2@^3.0.0": version "3.1.2" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc" + resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz" integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== dependencies: "@types/node" "*" "@types/prettier@^2.1.1": version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/secp256k1@^4.0.1": version "4.0.7" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.7.tgz#534c9814eb80964962108ad45d549d1555c75fa0" + resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.7.tgz" integrity sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw== dependencies: "@types/node" "*" "@types/seedrandom@3.0.1": version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/seedrandom/-/seedrandom-3.0.1.tgz#1254750a4fec4aff2ebec088ccd0bb02e91fedb4" + resolved "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz" integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== +"@types/snarkjs@^0.7.9": + version "0.7.9" + resolved "https://registry.npmjs.org/@types/snarkjs/-/snarkjs-0.7.9.tgz" + integrity sha512-pb4Bq3GI2YQOQOG0dR/YuQs/mqcuL6k/vnz68LIPtpA2frrUL3twf69a3AUK9eUmNNeW0RIKkq6scDlC75Is+g== + abstract-leveldown@^6.2.1: version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz" integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== dependencies: buffer "^5.5.0" @@ -1043,7 +1066,7 @@ abstract-leveldown@^6.2.1: abstract-leveldown@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#08d19d4e26fb5be426f7a57004851b39e1795a2e" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz" integrity sha512-DnhQwcFEaYsvYDnACLZhMmCWd3rkOeEvglpa4q5i/5Jlm3UIsWaxVzuXvDLFCSCWRO3yy2/+V/G7FusFgejnfQ== dependencies: buffer "^6.0.3" @@ -1055,7 +1078,7 @@ abstract-leveldown@^7.2.0: abstract-leveldown@~6.2.1: version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" + resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz" integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== dependencies: buffer "^5.5.0" @@ -1066,36 +1089,36 @@ abstract-leveldown@~6.2.1: acorn-walk@^8.1.1: version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz" integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" acorn@^8.11.0, acorn@^8.4.1: version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== adm-zip@^0.4.16: version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== aes-js@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" @@ -1103,7 +1126,7 @@ aggregate-error@^3.0.0: ajv@^6.12.3: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1113,45 +1136,45 @@ ajv@^6.12.3: ansi-align@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: string-width "^4.1.0" ansi-colors@^4.1.1, ansi-colors@^4.1.3: version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -1159,119 +1182,135 @@ anymatch@~3.1.2: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-back@^3.0.1, array-back@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== array-back@^4.0.1, array-back@^4.0.2: version "4.0.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== asn1@~0.2.3: version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== dependencies: safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== async-eventemitter@^0.2.4: version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + resolved "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz" integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== dependencies: async "^2.4.0" async@^2.4.0: version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" +async@^3.2.6: + version "3.2.6" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== available-typed-arrays@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== dependencies: possible-typed-array-names "^1.0.0" aws-sign2@~0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: version "1.13.2" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.2.tgz#0aa167216965ac9474ccfa83892cfb6b3e1e52ef" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz" integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== b4a@^1.0.1: version "1.7.3" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.7.3.tgz#24cf7ccda28f5465b66aec2bac69e32809bf112f" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz" integrity sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2: version "3.0.11" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.11.tgz#40d80e2a1aeacba29792ccc6c5354806421287ff" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz" integrity sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA== dependencies: safe-buffer "^5.0.1" base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bcrypt-pbkdf@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== dependencies: tweetnacl "^0.14.3" bech32@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +bfj@^7.0.2: + version "7.1.0" + resolved "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz" + integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== + dependencies: + bluebird "^3.7.2" + check-types "^11.2.3" + hoopy "^0.1.4" + jsonpath "^1.1.1" + tryer "^1.0.1" + bignumber.js@^9.0.0: version "9.3.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.3.1.tgz#759c5aaddf2ffdc4f154f7b493e1c8770f88c4d7" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz" integrity sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ== binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== bip39@3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/bip39/-/bip39-3.0.4.tgz#5b11fed966840b5e1b8539f0f54ab6392969b2a0" + resolved "https://registry.npmjs.org/bip39/-/bip39-3.0.4.tgz" integrity sha512-YZKQlb752TrUWqHWj7XAwCSjYEgGAk+/Aas3V7NyjQeZYsztO8JnQUaCWhcnL4T+jL8nvB8typ2jRPzTlgugNw== dependencies: "@types/node" "11.11.6" @@ -1281,7 +1320,7 @@ bip39@3.0.4: blake-hash@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e" + resolved "https://registry.npmjs.org/blake-hash/-/blake-hash-2.0.0.tgz" integrity sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w== dependencies: node-addon-api "^3.0.0" @@ -1290,7 +1329,7 @@ blake-hash@^2.0.0: blake2b-wasm@^2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + resolved "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz" integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== dependencies: b4a "^1.0.1" @@ -1298,7 +1337,7 @@ blake2b-wasm@^2.4.0: blake2b@^2.1.3: version "2.1.4" - resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3" + resolved "https://registry.npmjs.org/blake2b/-/blake2b-2.1.4.tgz" integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A== dependencies: blake2b-wasm "^2.4.0" @@ -1306,22 +1345,27 @@ blake2b@^2.1.3: blakejs@^1.1.0: version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.2.tgz#3d8fed6796c24e177737f7cc5172ee04ef39ec99" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz" integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw== bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.2" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.2.tgz#82c09f9ebbb17107cd72cb7fd39bd1f9d0aaa566" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz" integrity sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw== boxen@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== dependencies: ansi-align "^3.0.0" @@ -1335,7 +1379,7 @@ boxen@^5.1.2: brace-expansion@^1.1.7: version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" @@ -1343,31 +1387,31 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" braces@~3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-stdout@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" @@ -1379,14 +1423,14 @@ browserify-aes@^1.2.0: bs58@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" bs58check@^2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== dependencies: bs58 "^4.0.0" @@ -1395,24 +1439,24 @@ bs58check@^2.1.2: buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-xor@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== buffer-xor@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-2.0.2.tgz" integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== dependencies: safe-buffer "^5.1.1" buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -1420,7 +1464,7 @@ buffer@^5.5.0, buffer@^5.6.0: buffer@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -1428,19 +1472,19 @@ buffer@^6.0.3: bufferutil@4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" + resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.5.tgz" integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== dependencies: node-gyp-build "^4.3.0" bytes@3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" @@ -1448,7 +1492,7 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply- call-bind@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== dependencies: call-bind-apply-helpers "^1.0.0" @@ -1458,7 +1502,7 @@ call-bind@^1.0.8: call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== dependencies: call-bind-apply-helpers "^1.0.2" @@ -1466,12 +1510,12 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caseless@~0.12.0: version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== catering@^2.0.0, catering@^2.1.0: @@ -1481,12 +1525,12 @@ catering@^2.0.0, catering@^2.1.0: chai@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.0.tgz#181bca6a219cddb99c3eeefb82483800ffa550ce" + resolved "https://registry.npmjs.org/chai/-/chai-6.2.0.tgz" integrity sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA== chalk@^2.4.2: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -1495,15 +1539,20 @@ chalk@^2.4.2: chalk@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" +check-types@^11.2.3: + version "11.2.3" + resolved "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz" + integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== + chokidar@^3.5.3: version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -1518,28 +1567,40 @@ chokidar@^3.5.3: chokidar@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== dependencies: readdirp "^4.0.1" ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.7" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.7.tgz#bd094bfef42634ccfd9e13b9fc73274997111e39" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz" integrity sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA== dependencies: inherits "^2.0.4" safe-buffer "^5.2.1" to-buffer "^1.2.2" +circom_runtime@0.1.28: + version "0.1.28" + resolved "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.28.tgz" + integrity sha512-ACagpQ7zBRLKDl5xRZ4KpmYIcZDUjOiNRuxvXLqhnnlLSVY1Dbvh73TI853nqoR0oEbihtWmMSjgc5f+pXf/jQ== + dependencies: + ffjavascript "0.3.1" + +circomlib@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/circomlib/-/circomlib-2.0.5.tgz" + integrity sha512-O7NQ8OS+J4eshBuoy36z/TwQU0YHw8W3zxZcs4hVwpEll3e4hDm3mgkIPqItN8FDeLEKZFK3YeT/+k8TiLF3/A== + circomlibjs@^0.1.7: version "0.1.7" - resolved "https://registry.yarnpkg.com/circomlibjs/-/circomlibjs-0.1.7.tgz#9f5a7d9a23323744b11ee456b05b0cd81f48b554" + resolved "https://registry.npmjs.org/circomlibjs/-/circomlibjs-0.1.7.tgz" integrity sha512-GRAUoAlKAsiiTa+PA725G9RmEmJJRc8tRFxw/zKktUxlQISGznT4hH4ESvW8FNTsrGg/nNd06sGP/Wlx0LUHVg== dependencies: blake-hash "^2.0.0" @@ -1549,17 +1610,17 @@ circomlibjs@^0.1.7: clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-boxes@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" @@ -1568,43 +1629,43 @@ cliui@^7.0.2: color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" command-exists@^1.2.8: version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== command-line-args@^5.1.1: version "5.2.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== dependencies: array-back "^3.1.0" @@ -1614,7 +1675,7 @@ command-line-args@^5.1.1: command-line-usage@^6.1.0: version "6.1.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== dependencies: array-back "^4.0.2" @@ -1624,42 +1685,42 @@ command-line-usage@^6.1.0: commander@^8.1.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== cookie@^0.4.1: version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== core-js-pure@^3.0.1: version "3.46.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.46.0.tgz#9bb80248584c6334bb54cd381b0f41c619ef1b43" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.46.0.tgz" integrity sha512-NMCW30bHNofuhwLhYPt66OLOKTMbOhgTTatKVbaQC3KRHpTCiRIBYvtshr+NBYSnBxwAFhjW/RfJ0XbIjS16rw== core-util-is@1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== core-util-is@~1.0.0: version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== crc-32@^1.2.0: version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" @@ -1670,7 +1731,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: create-hmac@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" @@ -1682,50 +1743,55 @@ create-hmac@^1.1.7: create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== dashdash@^1.12.0: version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== dependencies: assert-plus "^1.0.0" debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" debug@^2.2.0: version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" debug@^3.1.0: version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== deep-extend@~0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + deferred-leveldown@~5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" + resolved "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz" integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== dependencies: abstract-leveldown "~6.2.1" @@ -1733,7 +1799,7 @@ deferred-leveldown@~5.3.0: define-data-property@^1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: es-define-property "^1.0.0" @@ -1742,27 +1808,27 @@ define-data-property@^1.1.4: delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== diff@^4.0.1: version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diff@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" @@ -1771,15 +1837,22 @@ dunder-proto@^1.0.1: ecc-jsbn@~0.1.1: version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== dependencies: jsbn "~0.1.0" safer-buffer "^2.1.0" +ejs@^3.1.6: + version "3.1.10" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + elliptic@6.6.1, elliptic@^6.5.2, elliptic@^6.5.4, elliptic@^6.5.7: version "6.6.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz" integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== dependencies: bn.js "^4.11.9" @@ -1792,17 +1865,17 @@ elliptic@6.6.1, elliptic@^6.5.2, elliptic@^6.5.4, elliptic@^6.5.7: emittery@0.10.0: version "0.10.0" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.0.tgz#bb373c660a9d421bb44706ec4967ed50c02a8026" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.0.tgz" integrity sha512-AGvFfs+d0JKCJQ4o01ASQLGPmSCxgfU9RFXvzPvZdjKK8oscynksuJhWrSTSw7j7Ep/sZct5b5ZhYCi8S/t0HQ== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== encoding-down@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" + resolved "https://registry.npmjs.org/encoding-down/-/encoding-down-6.3.0.tgz" integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== dependencies: abstract-leveldown "^6.2.1" @@ -1812,7 +1885,7 @@ encoding-down@^6.3.0: enquirer@^2.3.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz" integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" @@ -1820,36 +1893,36 @@ enquirer@^2.3.0: env-paths@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== errno@~0.1.1: version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: es-errors "^1.3.0" @@ -1859,22 +1932,54 @@ es-set-tostringtag@^2.1.0: escalade@^3.1.1: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@^1.8.1: + version "1.14.3" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + ethereum-cryptography@^0.1.3: version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== dependencies: "@types/pbkdf2" "^3.0.0" @@ -1895,7 +2000,7 @@ ethereum-cryptography@^0.1.3: ethereum-cryptography@^1.0.3: version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz" integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== dependencies: "@noble/hashes" "1.2.0" @@ -1905,7 +2010,7 @@ ethereum-cryptography@^1.0.3: ethereum-cryptography@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz" integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== dependencies: "@noble/curves" "1.4.2" @@ -1915,7 +2020,7 @@ ethereum-cryptography@^2.2.1: ethereum-waffle@^4.0.10: version "4.0.10" - resolved "https://registry.yarnpkg.com/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz#f1ef1564c0155236f1a66c6eae362a5d67c9f64c" + resolved "https://registry.npmjs.org/ethereum-waffle/-/ethereum-waffle-4.0.10.tgz" integrity sha512-iw9z1otq7qNkGDNcMoeNeLIATF9yKl1M8AIeu42ElfNBplq0e+5PeasQmm8ybY/elkZ1XyRO0JBQxQdVRb8bqQ== dependencies: "@ethereum-waffle/chai" "4.0.10" @@ -1927,7 +2032,7 @@ ethereum-waffle@^4.0.10: ethereumjs-abi@0.6.8: version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + resolved "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== dependencies: bn.js "^4.11.8" @@ -1935,7 +2040,7 @@ ethereumjs-abi@0.6.8: ethereumjs-util@7.1.3: version "7.1.3" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz" integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== dependencies: "@types/bn.js" "^5.1.0" @@ -1946,7 +2051,7 @@ ethereumjs-util@7.1.3: ethereumjs-util@^6.0.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== dependencies: "@types/bn.js" "^4.11.3" @@ -1959,7 +2064,7 @@ ethereumjs-util@^6.0.0: ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== dependencies: "@types/bn.js" "^5.1.0" @@ -1970,7 +2075,7 @@ ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereum ethers@^5.5.1, ethers@^5.7.2: version "5.8.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.8.0.tgz#97858dc4d4c74afce83ea7562fe9493cedb4d377" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz" integrity sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg== dependencies: "@ethersproject/abi" "5.8.0" @@ -2006,7 +2111,7 @@ ethers@^5.5.1, ethers@^5.7.2: ethjs-util@0.1.6: version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + resolved "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== dependencies: is-hex-prefixed "1.0.0" @@ -2014,7 +2119,7 @@ ethjs-util@0.1.6: evp_bytestokey@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" @@ -2022,60 +2127,95 @@ evp_bytestokey@^1.0.3: extend@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extsprintf@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== extsprintf@^1.2.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== fast-deep-equal@^3.1.1: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastfile@0.0.20: + version "0.0.20" + resolved "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz" + integrity sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA== + fdir@^6.5.0: version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== +ffjavascript@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.0.tgz" + integrity sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + +ffjavascript@0.3.1, ffjavascript@^0.3.0, ffjavascript@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.3.1.tgz" + integrity sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "1.2.0" + ffjavascript@^0.2.45: version "0.2.63" - resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.63.tgz#0c1216a1f123dc9181df69e144473704d2f115eb" + resolved "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.63.tgz" integrity sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A== dependencies: wasmbuilder "0.0.16" wasmcurves "0.2.2" web-worker "1.2.0" +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-replace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz" integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== dependencies: array-back "^3.0.1" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -2083,34 +2223,34 @@ find-up@^5.0.0: fixed-merkle-tree@^0.7.3: version "0.7.3" - resolved "https://registry.yarnpkg.com/fixed-merkle-tree/-/fixed-merkle-tree-0.7.3.tgz#e8993628bc43894dfae3cb7e2a847f45c63e8678" + resolved "https://registry.npmjs.org/fixed-merkle-tree/-/fixed-merkle-tree-0.7.3.tgz" integrity sha512-b50ZBpDfp/Nru120IdeS0IyqbVjOien1OSdWMDdcxS9uVHLV668xndNkEnn9t1WFOvc5aw1owl6l4N8mP5mkKg== flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.12.1: version "1.15.11" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz" integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== for-each@^0.3.5: version "0.3.5" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== dependencies: is-callable "^1.2.7" forever-agent@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== form-data@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz" integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== dependencies: asynckit "^0.4.0" @@ -2121,7 +2261,7 @@ form-data@^4.0.4: form-data@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" @@ -2130,17 +2270,17 @@ form-data@~2.3.2: fp-ts@1.19.3: version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== fp-ts@^1.0.0: version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.5.tgz" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" @@ -2149,27 +2289,27 @@ fs-extra@^7.0.0, fs-extra@^7.0.1: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== ganache@7.4.3: version "7.4.3" - resolved "https://registry.yarnpkg.com/ganache/-/ganache-7.4.3.tgz#e995f1250697264efbb34d4241c374a2b0271415" + resolved "https://registry.npmjs.org/ganache/-/ganache-7.4.3.tgz" integrity sha512-RpEDUiCkqbouyE7+NMXG26ynZ+7sGiODU84Kz+FVoXUnQ4qQM4M8wif3Y4qUCt+D/eM1RVeGq0my62FPD6Y1KA== dependencies: "@trufflesuite/bigint-buffer" "1.1.10" @@ -2186,12 +2326,12 @@ ganache@7.4.3: get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -2207,7 +2347,7 @@ get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@ get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" @@ -2215,21 +2355,21 @@ get-proto@^1.0.1: getpass@^0.1.1: version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== dependencies: assert-plus "^1.0.0" glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob@7.1.7: version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" @@ -2241,7 +2381,7 @@ glob@7.1.7: glob@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" @@ -2252,22 +2392,22 @@ glob@^8.1.0: gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== har-schema@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== har-validator@~5.1.3: version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: ajv "^6.12.3" @@ -2275,7 +2415,7 @@ har-validator@~5.1.3: hardhat@^2.24.2: version "2.26.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.26.3.tgz#87f3f4b6d1001970299d5bff135d57e8adae7a07" + resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.26.3.tgz" integrity sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw== dependencies: "@ethereumjs/util" "^9.1.0" @@ -2320,36 +2460,36 @@ hardhat@^2.24.2: has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: es-define-property "^1.0.0" has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" hash-base@^3.0.0, hash-base@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.2.tgz#79d72def7611c3f6e3c3b5730652638001b10a74" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz" integrity sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg== dependencies: inherits "^2.0.4" @@ -2359,7 +2499,7 @@ hash-base@^3.0.0, hash-base@^3.1.2: hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" @@ -2367,33 +2507,38 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: hasown@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" he@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + hosted-git-info@^2.6.0: version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== http-errors@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -2404,7 +2549,7 @@ http-errors@2.0.0: http-signature@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: assert-plus "^1.0.0" @@ -2413,7 +2558,7 @@ http-signature@~1.2.0: https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -2421,39 +2566,39 @@ https-proxy-agent@^5.0.0: iconv-lite@0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== immediate@^3.2.3: version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz" integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== immediate@~3.2.3: version "3.2.3" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" + resolved "https://registry.npmjs.org/immediate/-/immediate-3.2.3.tgz" integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== immutable@^4.0.0-rc.12: version "4.3.7" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz" integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -2461,156 +2606,174 @@ inflight@^1.0.4: inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== io-ts@1.10.4: version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== dependencies: fp-ts "^1.0.0" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-buffer@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== is-callable@^1.2.7: version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hex-prefixed@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-typed-array@^1.1.14: version "1.1.15" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: which-typed-array "^1.1.16" is-typedarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== is-url@^1.2.4: version "1.2.4" - resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== isarray@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== isarray@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== +jake@^10.8.5: + version "10.9.4" + resolved "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz" + integrity sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA== + dependencies: + async "^3.2.6" + filelist "^1.0.4" + picocolors "^1.1.1" + js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" jsbn@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== json-bigint@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1" + resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== dependencies: bignumber.js "^9.0.0" json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stream-stringify@^3.1.4: version "3.1.6" - resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + resolved "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz" integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== json-stringify-safe@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" + jsprim@^1.2.2: version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: assert-plus "1.0.0" @@ -2620,7 +2783,7 @@ jsprim@^1.2.2: keccak@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.1.tgz" integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== dependencies: node-addon-api "^2.0.0" @@ -2628,7 +2791,7 @@ keccak@3.0.1: keccak@3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz" integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== dependencies: node-addon-api "^2.0.0" @@ -2637,7 +2800,7 @@ keccak@3.0.2: keccak@^3.0.0, keccak@^3.0.2: version "3.0.4" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz" integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== dependencies: node-addon-api "^2.0.0" @@ -2646,33 +2809,33 @@ keccak@^3.0.0, keccak@^3.0.2: level-codec@^9.0.0: version "9.0.2" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" + resolved "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz" integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== dependencies: buffer "^5.6.0" level-concat-iterator@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz#5235b1f744bc34847ed65a50548aa88d22e881cf" + resolved "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-3.1.0.tgz" integrity sha512-BWRCMHBxbIqPxJ8vHOvKUsaO0v1sLYZtjN3K2iZJsRBYtp+ONsY6Jfi6hy9K3+zolgQRryhIn2NRZjZnWJ9NmQ== dependencies: catering "^2.1.0" level-concat-iterator@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" + resolved "https://registry.npmjs.org/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz" integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== level-errors@^2.0.0, level-errors@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" + resolved "https://registry.npmjs.org/level-errors/-/level-errors-2.0.1.tgz" integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== dependencies: errno "~0.1.1" level-iterator-stream@~4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" + resolved "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz" integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== dependencies: inherits "^2.0.4" @@ -2681,7 +2844,7 @@ level-iterator-stream@~4.0.0: level-mem@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" + resolved "https://registry.npmjs.org/level-mem/-/level-mem-5.0.1.tgz" integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== dependencies: level-packager "^5.0.3" @@ -2689,7 +2852,7 @@ level-mem@^5.0.1: level-packager@^5.0.3: version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" + resolved "https://registry.npmjs.org/level-packager/-/level-packager-5.1.1.tgz" integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== dependencies: encoding-down "^6.3.0" @@ -2697,19 +2860,19 @@ level-packager@^5.0.3: level-supports@^2.0.1: version "2.1.0" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-2.1.0.tgz#9af908d853597ecd592293b2fad124375be79c5f" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-2.1.0.tgz" integrity sha512-E486g1NCjW5cF78KGPrMDRBYzPuueMZ6VBXHT6gC7A8UYWGiM14fGgp+s/L1oFfDWSPV/+SFkYCmZ0SiESkRKA== level-supports@~1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" + resolved "https://registry.npmjs.org/level-supports/-/level-supports-1.0.1.tgz" integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== dependencies: xtend "^4.0.2" level-ws@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" + resolved "https://registry.npmjs.org/level-ws/-/level-ws-2.0.0.tgz" integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== dependencies: inherits "^2.0.3" @@ -2718,7 +2881,7 @@ level-ws@^2.0.0: leveldown@6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-6.1.0.tgz#7ab1297706f70c657d1a72b31b40323aa612b9ee" + resolved "https://registry.npmjs.org/leveldown/-/leveldown-6.1.0.tgz" integrity sha512-8C7oJDT44JXxh04aSSsfcMI8YiaGRhOFI9/pMEL7nWJLVsWajDPTRxsSHTM2WcTVY5nXM+SuRHzPPi0GbnDX+w== dependencies: abstract-leveldown "^7.2.0" @@ -2727,7 +2890,7 @@ leveldown@6.1.0: levelup@^4.3.2: version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" + resolved "https://registry.npmjs.org/levelup/-/levelup-4.4.0.tgz" integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== dependencies: deferred-leveldown "~5.3.0" @@ -2736,66 +2899,79 @@ levelup@^4.3.2: level-supports "~1.0.0" xtend "~4.0.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.camelcase@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" is-unicode-supported "^0.1.0" +logplease@^1.2.15: + version "1.2.15" + resolved "https://registry.npmjs.org/logplease/-/logplease-1.2.15.tgz" + integrity sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA== + lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru_map@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== ltgt@~2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + resolved "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz" integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== mcl-wasm@^0.7.1: version "0.7.9" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + resolved "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz" integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== md5.js@^1.3.4: version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" @@ -2804,7 +2980,7 @@ md5.js@^1.3.4: memdown@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" + resolved "https://registry.npmjs.org/memdown/-/memdown-5.1.0.tgz" integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== dependencies: abstract-leveldown "~6.2.1" @@ -2816,12 +2992,12 @@ memdown@^5.0.0: memorystream@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: version "4.2.4" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" + resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz" integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== dependencies: "@types/levelup" "^4.3.0" @@ -2833,7 +3009,7 @@ merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: micro-eth-signer@^0.14.0: version "0.14.0" - resolved "https://registry.yarnpkg.com/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz#8aa1fe997d98d6bdf42f2071cef7eb01a66ecb22" + resolved "https://registry.npmjs.org/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz" integrity sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw== dependencies: "@noble/curves" "~1.8.1" @@ -2842,14 +3018,14 @@ micro-eth-signer@^0.14.0: micro-packed@~0.7.2: version "0.7.3" - resolved "https://registry.yarnpkg.com/micro-packed/-/micro-packed-0.7.3.tgz#59e96b139dffeda22705c7a041476f24cabb12b6" + resolved "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.3.tgz" integrity sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg== dependencies: "@scure/base" "~1.2.5" miller-rabin@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" @@ -2857,67 +3033,67 @@ miller-rabin@^4.0.0: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12, mime-types@~2.1.19: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== minimatch@^3.0.4: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^5.0.1, minimatch@^5.1.6: version "5.1.6" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" minimist@^1.2.6: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mkdirp@^0.5.1: version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mnemonist@^0.38.0: version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== dependencies: obliterator "^2.0.0" mocha@^10.0.0: version "10.8.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz" integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== dependencies: ansi-colors "^4.1.3" @@ -2943,137 +3119,149 @@ mocha@^10.0.0: ms@2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@^2.1.1, ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== nanoassert@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + resolved "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz" integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== napi-macros@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== node-addon-api@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== node-addon-api@^3.0.0: version "3.2.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== node-addon-api@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz" integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== node-fetch@^2.6.7: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" node-gyp-build@4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz" integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== node-gyp-build@4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz" integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== node-gyp-build@^4.2.0, node-gyp-build@^4.2.2, node-gyp-build@^4.3.0: version "4.8.4" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz" integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== oauth-sign@~0.9.0: version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-inspect@^1.13.3: version "1.13.4" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== obliterator@^2.0.0: version "2.0.5" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.5.tgz#031e0145354b0c18840336ae51d41e7d6d2c76aa" + resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz" integrity sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw== once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" path-browserify@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-parse@^1.0.6: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== pbkdf2@^3.0.17, pbkdf2@^3.0.9: version "3.1.5" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.5.tgz#444a59d7a259a95536c56e80c89de31cc01ed366" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz" integrity sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ== dependencies: create-hash "^1.2.0" @@ -3085,88 +3273,103 @@ pbkdf2@^3.0.17, pbkdf2@^3.0.9: performance-now@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== -picocolors@^1.1.0: +picocolors@^1.1.0, picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== picomatch@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== possible-typed-array-names@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + prettier@^2.3.1: version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== process-nextick-args@~2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== prr@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== psl@^1.1.28: version "1.15.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + resolved "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz" integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== dependencies: punycode "^2.3.1" punycode@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@^6.12.3: version "6.14.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" + resolved "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz" integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== dependencies: side-channel "^1.1.0" qs@~6.5.2: version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== queue-microtask@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +r1csfile@0.0.48: + version "0.0.48" + resolved "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.48.tgz" + integrity sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw== + dependencies: + "@iden3/bigarray" "0.0.2" + "@iden3/binfileutils" "0.0.12" + fastfile "0.0.20" + ffjavascript "0.3.0" + randombytes@^2.0.1, randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" raw-body@^2.4.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" @@ -3176,7 +3379,7 @@ raw-body@^2.4.1: readable-stream@^2.3.8: version "2.3.8" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" @@ -3189,7 +3392,7 @@ readable-stream@^2.3.8: readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -3198,24 +3401,24 @@ readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: readdirp@^4.0.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" reduce-flatten@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== request@^2.85.0: version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: aws-sign2 "~0.7.0" @@ -3241,19 +3444,19 @@ request@^2.85.0: require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== resolve@1.17.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.3.tgz#9be54e4ba5e3559c8eee06a25cd7648bbccdf5a8" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz" integrity sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA== dependencies: hash-base "^3.1.2" @@ -3261,46 +3464,46 @@ ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.3: rlp@2.2.6: version "2.2.6" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" + resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.6.tgz" integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== dependencies: bn.js "^4.11.1" rlp@^2.2.3, rlp@^2.2.4: version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== dependencies: bn.js "^5.2.0" rustbn.js@~0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== secp256k1@4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz" integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: elliptic "^6.5.4" @@ -3309,7 +3512,7 @@ secp256k1@4.0.3: secp256k1@^4.0.1: version "4.0.4" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.4.tgz#58f0bfe1830fe777d9ca1ffc7574962a8189f8ab" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz" integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw== dependencies: elliptic "^6.5.7" @@ -3318,34 +3521,34 @@ secp256k1@^4.0.1: seedrandom@3.0.5: version "3.0.5" - resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7" + resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz" integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== semaphore-async-await@^1.5.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" + resolved "https://registry.npmjs.org/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz" integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== semver@^5.5.0: version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.3.0: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== serialize-javascript@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" set-function-length@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: define-data-property "^1.1.4" @@ -3357,17 +3560,17 @@ set-function-length@^1.2.2: setimmediate@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== setprototypeof@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.12, sha.js@^2.4.8: version "2.4.12" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz" integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== dependencies: inherits "^2.0.4" @@ -3376,7 +3579,7 @@ sha.js@^2.4.0, sha.js@^2.4.12, sha.js@^2.4.8: side-channel-list@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: es-errors "^1.3.0" @@ -3384,7 +3587,7 @@ side-channel-list@^1.0.0: side-channel-map@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== dependencies: call-bound "^1.0.2" @@ -3394,7 +3597,7 @@ side-channel-map@^1.0.1: side-channel-weakmap@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== dependencies: call-bound "^1.0.2" @@ -3405,7 +3608,7 @@ side-channel-weakmap@^1.0.2: side-channel@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== dependencies: es-errors "^1.3.0" @@ -3414,9 +3617,25 @@ side-channel@^1.1.0: side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" +snarkjs@^0.7.5: + version "0.7.5" + resolved "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.5.tgz" + integrity sha512-h+3c4rXZKLhLuHk4LHydZCk/h5GcNvk5GjVKRRkHmfb6Ntf8gHOA9zea3g656iclRuhqQ3iKDWFgiD9ypLrKiA== + dependencies: + "@iden3/binfileutils" "0.0.12" + bfj "^7.0.2" + blake2b-wasm "^2.4.0" + circom_runtime "0.1.28" + ejs "^3.1.6" + fastfile "0.0.20" + ffjavascript "0.3.1" + js-sha3 "^0.8.0" + logplease "^1.2.15" + r1csfile "0.0.48" + solc@0.8.15: version "0.8.15" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.15.tgz#d274dca4d5a8b7d3c9295d4cbdc9291ee1c52152" + resolved "https://registry.npmjs.org/solc/-/solc-0.8.15.tgz" integrity sha512-Riv0GNHNk/SddN/JyEuFKwbcWcEeho15iyupTSHw5Np6WuXA5D8kEHbyzDHi6sqmvLzu2l+8b1YmL8Ytple+8w== dependencies: command-exists "^1.2.8" @@ -3429,7 +3648,7 @@ solc@0.8.15: solc@0.8.26: version "0.8.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + resolved "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz" integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== dependencies: command-exists "^1.2.8" @@ -3442,20 +3661,20 @@ solc@0.8.26: source-map-support@^0.5.13: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0: +source-map@^0.6.0, source-map@~0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== sshpk@^1.7.0: version "1.18.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz" integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" @@ -3470,24 +3689,31 @@ sshpk@^1.7.0: stacktrace-parser@^0.1.10: version "0.1.11" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz#c7c08f9b29ef566b9a6f7b255d7db572f66fabc4" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz" integrity sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg== dependencies: type-fest "^0.7.1" +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + statuses@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== string-format@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -3496,61 +3722,61 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2 string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-hex-prefix@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: is-hex-prefixed "1.0.0" strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" table-layout@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== dependencies: array-back "^4.0.1" @@ -3560,7 +3786,7 @@ table-layout@^1.0.2: tinyglobby@^0.2.6: version "0.2.15" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz" integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== dependencies: fdir "^6.5.0" @@ -3568,14 +3794,14 @@ tinyglobby@^0.2.6: tmp@0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-buffer@^1.2.0, to-buffer@^1.2.1, to-buffer@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.2.tgz#ffe59ef7522ada0a2d1cb5dfe03bb8abc3cdc133" + resolved "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz" integrity sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw== dependencies: isarray "^2.0.5" @@ -3584,19 +3810,19 @@ to-buffer@^1.2.0, to-buffer@^1.2.1, to-buffer@^1.2.2: to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== tough-cookie@~2.5.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== dependencies: psl "^1.1.28" @@ -3604,12 +3830,17 @@ tough-cookie@~2.5.0: tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + ts-command-line-args@^2.2.0: version "2.5.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz" integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== dependencies: chalk "^4.1.0" @@ -3619,12 +3850,12 @@ ts-command-line-args@^2.2.0: ts-essentials@^7.0.1: version "7.0.3" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== ts-node@^10.9.2: version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -3643,44 +3874,51 @@ ts-node@^10.9.2: tslib@^1.9.3: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tsort@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== typechain@^8.0.0: version "8.3.2" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" + resolved "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz" integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== dependencies: "@types/prettier" "^2.1.1" @@ -3696,7 +3934,7 @@ typechain@^8.0.0: typed-array-buffer@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: call-bound "^1.0.3" @@ -3705,56 +3943,56 @@ typed-array-buffer@^1.0.3: typescript@^5.9.3: version "5.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== typical@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== typical@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== +underscore@1.12.1: + version "1.12.1" + resolved "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + undici-types@~7.14.0: version "7.14.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.14.0.tgz#4c037b32ca4d7d62fae042174604341588bc0840" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz" integrity sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA== -undici-types@~7.16.0: - version "7.16.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" - integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== - undici@^5.14.0: version "5.29.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.29.0.tgz#419595449ae3f2cdcba3580a2e8903399bd1f5a3" + resolved "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz" integrity sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg== dependencies: "@fastify/busboy" "^2.0.0" universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unpipe@1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url@^0.11.0: version "0.11.4" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.4.tgz#adca77b3562d56b72746e76b330b7f27b6721f3c" + resolved "https://registry.npmjs.org/url/-/url-0.11.4.tgz" integrity sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg== dependencies: punycode "^1.4.1" @@ -3762,34 +4000,34 @@ url@^0.11.0: utf-8-validate@5.0.7: version "5.0.7" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" + resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.7.tgz" integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== dependencies: node-gyp-build "^4.3.0" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^3.3.2: version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== verror@1.10.0: version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: assert-plus "^1.0.0" @@ -3798,29 +4036,29 @@ verror@1.10.0: wasmbuilder@0.0.16: version "0.0.16" - resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" + resolved "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz" integrity sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA== wasmcurves@0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" + resolved "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz" integrity sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ== dependencies: wasmbuilder "0.0.16" web-worker@1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + resolved "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz" integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -3828,7 +4066,7 @@ whatwg-url@^5.0.0: which-typed-array@^1.1.16: version "1.1.19" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== dependencies: available-typed-arrays "^1.0.7" @@ -3841,14 +4079,19 @@ which-typed-array@^1.1.16: widest-line@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== dependencies: string-width "^4.0.0" +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + wordwrapjs@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== dependencies: reduce-flatten "^2.0.0" @@ -3856,12 +4099,12 @@ wordwrapjs@^4.0.0: workerpool@^6.5.1: version "6.5.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -3870,42 +4113,42 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== ws@8.18.0: version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== ws@^7.4.6: version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-unparser@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -3915,7 +4158,7 @@ yargs-unparser@^2.0.0: yargs@^16.2.0: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -3928,10 +4171,10 @@ yargs@^16.2.0: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From f4fdcdbcc7269fda64d4d1e13932f306e8a0bf9a Mon Sep 17 00:00:00 2001 From: parketh Date: Tue, 21 Oct 2025 23:54:32 +0100 Subject: [PATCH 13/41] refactor proof --- package.json | 2 +- src/contracts/PrivateBank.sol | 12 +- src/contracts/Verifier.sol | 393 ++++++++++++++++------------------ src/interfaces/IVerifier.sol | 7 +- 4 files changed, 199 insertions(+), 215 deletions(-) diff --git a/package.json b/package.json index 76160ad..d59207e 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "build:circuit:compile": "circom circuits/withdraw.circom --r1cs --wasm --sym -o build/circuits", "build:circuit:setup": "npx snarkjs groth16 setup build/circuits/withdraw.r1cs build/circuits/ppot_0080_15.ptau build/circuits/withdraw.zkey", "build:circuit:export:key": "npx snarkjs zkey export verificationkey build/circuits/withdraw.zkey build/circuits/verification_key.json", - "build:circuit:export:contract": "npx snarkjs zkey export solidityverifier build/circuits/withdraw.zkey build/circuits/Verifier.sol", + "build:circuit:export:contract": "npx snarkjs zkey export solidityverifier build/circuits/withdraw.zkey build/circuits/Verifier.sol && sed -i '' 's/Groth16Verifier/Verifier/g' build/circuits/Verifier.sol && cp build/circuits/Verifier.sol src/contracts/Verifier.sol", "build:circuit": "npm run build:circuit:compile && npm run build:circuit:setup && npm run build:circuit:export:key && npm run build:circuit:export:contract" }, "devDependencies": { diff --git a/src/contracts/PrivateBank.sol b/src/contracts/PrivateBank.sol index d249474..a8b7199 100644 --- a/src/contracts/PrivateBank.sol +++ b/src/contracts/PrivateBank.sol @@ -24,6 +24,12 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { // TYPES /////////////////////////// + struct Proof { + uint256[2] pA; + uint256[2][2] pB; + uint256[2] pC; + } + struct Inputs { /// merkle root bytes32 root; @@ -107,7 +113,7 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { /// @notice Withdraw a deposit by proving ownership of commmitment /// @param proof SNARK proof data /// @param inputs circuit public inputs - function withdraw(bytes calldata proof, Inputs memory inputs) external payable nonReentrant { + function withdraw(Proof memory proof, Inputs memory inputs) external payable nonReentrant { // validity checks if (inputs.relayerFee > depositAmount) { revert FeeExceedsTransferValue(); @@ -122,7 +128,9 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { // verify proof if ( !verifier.verifyProof( - proof, + proof.pA, + proof.pB, + proof.pC, [ uint256(inputs.root), uint256(inputs.nullifierHash), diff --git a/src/contracts/Verifier.sol b/src/contracts/Verifier.sol index 857f823..a67c36d 100644 --- a/src/contracts/Verifier.sol +++ b/src/contracts/Verifier.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: MIT +// SPDX-License-Identifier: GPL-3.0 /* Copyright 2021 0KIMS association. @@ -18,215 +18,186 @@ along with snarkJS. If not, see . */ -pragma solidity ^0.8.24; +pragma solidity >=0.7.0 <0.9.0; contract Verifier { - // Scalar field size - uint256 constant r = - 21888242871839275222246405745257275088548364400416034343698204186575808495617; - // Base field size - uint256 constant q = - 21888242871839275222246405745257275088696311157297823662689037894645226208583; - - // Verification Key data - uint256 constant alphax = - 16428432848801857252194528405604668803277877773566238944394625302971855135431; - uint256 constant alphay = - 16846502678714586896801519656441059708016666274385668027902869494772365009666; - uint256 constant betax1 = - 3182164110458002340215786955198810119980427837186618912744689678939861918171; - uint256 constant betax2 = - 16348171800823588416173124589066524623406261996681292662100840445103873053252; - uint256 constant betay1 = - 4920802715848186258981584729175884379674325733638798907835771393452862684714; - uint256 constant betay2 = - 19687132236965066906216944365591810874384658708175106803089633851114028275753; - uint256 constant gammax1 = - 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant gammax2 = - 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant gammay1 = - 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant gammay2 = - 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = - 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant deltax2 = - 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant deltay1 = - 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant deltay2 = - 8495653923123431417604973247489272438418190587263600148770280649306958101930; - - uint256 constant IC0x = - 19345027579055691442232030885585358603661387761211135985107572956835645821424; - uint256 constant IC0y = - 6970734058131104011332651160749990650751392498667137665320645656029949031038; - - uint256 constant IC1x = - 14090489076103670597018116520648535856812238729299721181075397277514784393718; - uint256 constant IC1y = - 17571797013621969995736067140027247406932905556801850515510678415761452802073; - - uint256 constant IC2x = - 4050967825025692193456888093898318244575492240770650835291567617213381285954; - uint256 constant IC2y = - 21493757562808989843905945177884706190858964447230823163868375585722894699543; - - uint256 constant IC3x = - 5112752980131522575116927374094828581157087194474483576327716188957360001977; - uint256 constant IC3y = - 13593038714319541077699488665375854782049057687266926183487979978077858256907; - - uint256 constant IC4x = - 13641957649997242479421402730016051359703541440321045845032306239820608864918; - uint256 constant IC4y = - 15236924403742880579660502380396794016475355429085457791907345970652568972555; - - uint256 constant IC5x = - 474321822140723381328860273216999357723214550487194043528076824713580975455; - uint256 constant IC5y = - 5011919448025533158096087868794277175434873567880624898473259049027906972420; - - uint256 constant IC6x = - 10198416267615844257439351470961284035725279158422282821713285143871066671943; - uint256 constant IC6y = - 13916876023165539688312045497383401714445273306984016241679553491287767202329; - - // Memory data - uint16 constant pVk = 0; - uint16 constant pPairing = 128; - - uint16 constant pLastMem = 896; - - function verifyProof( - uint[2] calldata _pA, - uint[2][2] calldata _pB, - uint[2] calldata _pC, - uint[6] calldata _pubSignals - ) public view returns (bool) { - assembly { - function checkField(v) { - if iszero(lt(v, r)) { - mstore(0, 0) - return(0, 0x20) - } - } - - // G1 function to multiply a G1 value(x,y) to value in an address - function g1_mulAccC(pR, x, y, s) { - let success - let mIn := mload(0x40) - mstore(mIn, x) - mstore(add(mIn, 32), y) - mstore(add(mIn, 64), s) - - success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) - - if iszero(success) { - mstore(0, 0) - return(0, 0x20) - } - - mstore(add(mIn, 64), mload(pR)) - mstore(add(mIn, 96), mload(add(pR, 32))) - - success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) - - if iszero(success) { - mstore(0, 0) - return(0, 0x20) - } - } - - function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { - let _pPairing := add(pMem, pPairing) - let _pVk := add(pMem, pVk) - - mstore(_pVk, IC0x) - mstore(add(_pVk, 32), IC0y) - - // Compute the linear combination vk_x - - g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) - - g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) - - g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) - - g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) - - g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) - - g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) - - // -A - mstore(_pPairing, calldataload(pA)) - mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) - - // B - mstore(add(_pPairing, 64), calldataload(pB)) - mstore(add(_pPairing, 96), calldataload(add(pB, 32))) - mstore(add(_pPairing, 128), calldataload(add(pB, 64))) - mstore(add(_pPairing, 160), calldataload(add(pB, 96))) - - // alpha1 - mstore(add(_pPairing, 192), alphax) - mstore(add(_pPairing, 224), alphay) - - // beta2 - mstore(add(_pPairing, 256), betax1) - mstore(add(_pPairing, 288), betax2) - mstore(add(_pPairing, 320), betay1) - mstore(add(_pPairing, 352), betay2) - - // vk_x - mstore(add(_pPairing, 384), mload(add(pMem, pVk))) - mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) - - // gamma2 - mstore(add(_pPairing, 448), gammax1) - mstore(add(_pPairing, 480), gammax2) - mstore(add(_pPairing, 512), gammay1) - mstore(add(_pPairing, 544), gammay2) - - // C - mstore(add(_pPairing, 576), calldataload(pC)) - mstore(add(_pPairing, 608), calldataload(add(pC, 32))) - - // delta2 - mstore(add(_pPairing, 640), deltax1) - mstore(add(_pPairing, 672), deltax2) - mstore(add(_pPairing, 704), deltay1) - mstore(add(_pPairing, 736), deltay2) - - let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) - - isOk := and(success, mload(_pPairing)) - } - - let pMem := mload(0x40) - mstore(0x40, add(pMem, pLastMem)) - - // Validate that all evaluations ∈ F - - checkField(calldataload(add(_pubSignals, 0))) - - checkField(calldataload(add(_pubSignals, 32))) - - checkField(calldataload(add(_pubSignals, 64))) - - checkField(calldataload(add(_pubSignals, 96))) - - checkField(calldataload(add(_pubSignals, 128))) - - checkField(calldataload(add(_pubSignals, 160))) - - // Validate all evaluations - let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) - - mstore(0, isValid) - return(0, 0x20) - } - } -} + // Scalar field size + uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + // Base field size + uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + + // Verification Key data + uint256 constant alphax = 16428432848801857252194528405604668803277877773566238944394625302971855135431; + uint256 constant alphay = 16846502678714586896801519656441059708016666274385668027902869494772365009666; + uint256 constant betax1 = 3182164110458002340215786955198810119980427837186618912744689678939861918171; + uint256 constant betax2 = 16348171800823588416173124589066524623406261996681292662100840445103873053252; + uint256 constant betay1 = 4920802715848186258981584729175884379674325733638798907835771393452862684714; + uint256 constant betay2 = 19687132236965066906216944365591810874384658708175106803089633851114028275753; + uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; + + + uint256 constant IC0x = 19345027579055691442232030885585358603661387761211135985107572956835645821424; + uint256 constant IC0y = 6970734058131104011332651160749990650751392498667137665320645656029949031038; + + uint256 constant IC1x = 14090489076103670597018116520648535856812238729299721181075397277514784393718; + uint256 constant IC1y = 17571797013621969995736067140027247406932905556801850515510678415761452802073; + + uint256 constant IC2x = 4050967825025692193456888093898318244575492240770650835291567617213381285954; + uint256 constant IC2y = 21493757562808989843905945177884706190858964447230823163868375585722894699543; + + uint256 constant IC3x = 5112752980131522575116927374094828581157087194474483576327716188957360001977; + uint256 constant IC3y = 13593038714319541077699488665375854782049057687266926183487979978077858256907; + + uint256 constant IC4x = 13641957649997242479421402730016051359703541440321045845032306239820608864918; + uint256 constant IC4y = 15236924403742880579660502380396794016475355429085457791907345970652568972555; + + uint256 constant IC5x = 474321822140723381328860273216999357723214550487194043528076824713580975455; + uint256 constant IC5y = 5011919448025533158096087868794277175434873567880624898473259049027906972420; + + uint256 constant IC6x = 10198416267615844257439351470961284035725279158422282821713285143871066671943; + uint256 constant IC6y = 13916876023165539688312045497383401714445273306984016241679553491287767202329; + + + // Memory data + uint16 constant pVk = 0; + uint16 constant pPairing = 128; + + uint16 constant pLastMem = 896; + + function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[6] calldata _pubSignals) public view returns (bool) { + assembly { + function checkField(v) { + if iszero(lt(v, r)) { + mstore(0, 0) + return(0, 0x20) + } + } + + // G1 function to multiply a G1 value(x,y) to value in an address + function g1_mulAccC(pR, x, y, s) { + let success + let mIn := mload(0x40) + mstore(mIn, x) + mstore(add(mIn, 32), y) + mstore(add(mIn, 64), s) + + success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + + mstore(add(mIn, 64), mload(pR)) + mstore(add(mIn, 96), mload(add(pR, 32))) + + success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + } + + function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { + let _pPairing := add(pMem, pPairing) + let _pVk := add(pMem, pVk) + + mstore(_pVk, IC0x) + mstore(add(_pVk, 32), IC0y) + + // Compute the linear combination vk_x + + g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) + + g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) + + g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) + + g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) + + g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) + + g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) + + + // -A + mstore(_pPairing, calldataload(pA)) + mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) + + // B + mstore(add(_pPairing, 64), calldataload(pB)) + mstore(add(_pPairing, 96), calldataload(add(pB, 32))) + mstore(add(_pPairing, 128), calldataload(add(pB, 64))) + mstore(add(_pPairing, 160), calldataload(add(pB, 96))) + + // alpha1 + mstore(add(_pPairing, 192), alphax) + mstore(add(_pPairing, 224), alphay) + + // beta2 + mstore(add(_pPairing, 256), betax1) + mstore(add(_pPairing, 288), betax2) + mstore(add(_pPairing, 320), betay1) + mstore(add(_pPairing, 352), betay2) + + // vk_x + mstore(add(_pPairing, 384), mload(add(pMem, pVk))) + mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) + + + // gamma2 + mstore(add(_pPairing, 448), gammax1) + mstore(add(_pPairing, 480), gammax2) + mstore(add(_pPairing, 512), gammay1) + mstore(add(_pPairing, 544), gammay2) + + // C + mstore(add(_pPairing, 576), calldataload(pC)) + mstore(add(_pPairing, 608), calldataload(add(pC, 32))) + + // delta2 + mstore(add(_pPairing, 640), deltax1) + mstore(add(_pPairing, 672), deltax2) + mstore(add(_pPairing, 704), deltay1) + mstore(add(_pPairing, 736), deltay2) + + + let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) + + isOk := and(success, mload(_pPairing)) + } + + let pMem := mload(0x40) + mstore(0x40, add(pMem, pLastMem)) + + // Validate that all evaluations ∈ F + + checkField(calldataload(add(_pubSignals, 0))) + + checkField(calldataload(add(_pubSignals, 32))) + + checkField(calldataload(add(_pubSignals, 64))) + + checkField(calldataload(add(_pubSignals, 96))) + + checkField(calldataload(add(_pubSignals, 128))) + + checkField(calldataload(add(_pubSignals, 160))) + + + // Validate all evaluations + let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) + + mstore(0, isValid) + return(0, 0x20) + } + } + } diff --git a/src/interfaces/IVerifier.sol b/src/interfaces/IVerifier.sol index 744ea1a..88fa858 100644 --- a/src/interfaces/IVerifier.sol +++ b/src/interfaces/IVerifier.sol @@ -2,5 +2,10 @@ pragma solidity ^0.8.24; interface IVerifier { - function verifyProof(bytes memory _proof, uint256[6] memory _input) external returns (bool); + function verifyProof( + uint256[2] calldata _pA, + uint256[2][2] calldata _pB, + uint256[2] calldata _pC, + uint256[6] calldata _pubSignals + ) external view returns (bool); } From 4a89b0d42653548e8efc37f8e94c50b07ee71e2b Mon Sep 17 00:00:00 2001 From: parketh Date: Tue, 21 Oct 2025 23:54:55 +0100 Subject: [PATCH 14/41] add withdraw tests --- test/ETHPrivateBank.test.ts | 79 +++++++++++++++++++++++++++++++++---- types/ffjavascript.d.ts | 8 +--- utils/PrivateBank.utils.ts | 35 ++++++++++++---- utils/types.utils.ts | 4 ++ 4 files changed, 105 insertions(+), 21 deletions(-) diff --git a/test/ETHPrivateBank.test.ts b/test/ETHPrivateBank.test.ts index 82a485f..c7740af 100644 --- a/test/ETHPrivateBank.test.ts +++ b/test/ETHPrivateBank.test.ts @@ -1,12 +1,17 @@ import { Contract } from 'ethers' import { ethers } from 'hardhat' -import { generateDeposit, generateProof, verifyProof } from '../utils/PrivateBank.utils' +import { + generateDeposit, + generateProof, + toSolidityInput, + verifyProof, +} from '../utils/PrivateBank.utils' import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' import { expect } from './shared/expect' import FixedMerkleTree from 'fixed-merkle-tree' import { getMiMCSpongeHasher } from '../utils/MiMCSponge.utils' import { utils } from 'ffjavascript' -import { bufferToBigInt, uint8ArrayToBigInt } from '../utils/types.utils' +import { bigintToHex, bufferToBigInt, padHex, uint8ArrayToBigInt } from '../utils/types.utils' import { poseidon } from '@iden3/js-crypto' describe('ETHPrivateBank', function () { @@ -39,7 +44,7 @@ describe('ETHPrivateBank', function () { it('deposit(): should process deposit and emit event', async () => { // first deposit - const deposit = generateDeposit() + const deposit = generateDeposit('seed1') const tx = await privateBank .connect(sender) .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) @@ -53,7 +58,7 @@ describe('ETHPrivateBank', function () { expect(depositEvt.args.index).to.equal(0) // 2nd deposit - const deposit2 = generateDeposit() + const deposit2 = generateDeposit('seed2') const tx2 = await privateBank .connect(sender) .deposit(deposit2.commitment, { value: DEPOSIT_AMOUNT }) @@ -69,7 +74,7 @@ describe('ETHPrivateBank', function () { it('deposit(): should reject duplicate deposit', async () => { // generate deposit - const deposit = generateDeposit() + const deposit = generateDeposit('seed3') const tx = await privateBank .connect(sender) .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) @@ -83,7 +88,7 @@ describe('ETHPrivateBank', function () { it('snarkjs should correctly generate and verify proof', async () => { // generate deposit - const deposit = generateDeposit() + const deposit = generateDeposit('seed4') // setup tree const hashMiMCSponge = await getMiMCSpongeHasher() @@ -118,7 +123,7 @@ describe('ETHPrivateBank', function () { it('snarkjs proof should be resistant to tampering', async () => { // generate deposit - const deposit = generateDeposit() + const deposit = generateDeposit('seed5') // setup tree const hashMiMCSponge = await getMiMCSpongeHasher() @@ -165,4 +170,64 @@ describe('ETHPrivateBank', function () { isValid = await verifyProof(proof3) expect(isValid).to.be.false }) + + it('withdraw(): should process withdraw and emit event', async () => { + // generate deposit + const deposit = generateDeposit('seed6') + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit.commitment) + + // deposit to contract + const tx = await privateBank + .connect(sender) + .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) + await tx.wait() + + // generate proof + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([uint8ArrayToBigInt(deposit.nullifier)]), + nullifier: bufferToBigInt(deposit.nullifier), + relayer: relayer.address, + recipient: recipient.address, + relayerFee, + gasRefund, + secret: bufferToBigInt(deposit.secret), + pathElements: tree.path(0).pathElements, + pathIndices: tree.path(0).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + + // generate and verify proof + const proofData = await generateProof(input) + const isValid = await verifyProof(proofData) + expect(isValid).to.be.true + + // withdraw + const proof = toSolidityInput(proofData) + const inputs = { + root: padHex(rawInput.root as string), + nullifierHash: bigintToHex(rawInput.nullifierHash), + nullifier: bigintToHex(rawInput.nullifier), + recipient: recipient.address, + relayer: relayer.address, + relayerFee: bigintToHex(rawInput.relayerFee), + gasRefund: bigintToHex(rawInput.gasRefund), + } + const tx2 = await privateBank.connect(sender).withdraw(proof.proof, inputs) + const receipt = await tx2.wait() + + // check event + const withdrawEvt = receipt.events[0] + expect(withdrawEvt.event).to.equal('Withdraw') + expect(withdrawEvt.args.recipient).to.equal(recipient.address) + expect(withdrawEvt.args.relayer).to.equal(relayer.address) + expect(withdrawEvt.args.nullifierHash).to.equal(bigintToHex(rawInput.nullifierHash)) + }) }) diff --git a/types/ffjavascript.d.ts b/types/ffjavascript.d.ts index 2927302..04e3594 100644 --- a/types/ffjavascript.d.ts +++ b/types/ffjavascript.d.ts @@ -7,14 +7,10 @@ declare module 'ffjavascript' { | { [key: string]: Stringifiable } | Stringifiable[] - function stringifyBigInts(o: Stringifiable): Stringifiable - type Unstringifiable = string | bigint | { [key: string]: Unstringifiable } | Unstringifiable[] - function unstringifyBigInts(o: Unstringifiable): Unstringifiable - export const utils: { - stringifyBigInts: (o: Stringifiable) => Stringifiable - unstringifyBigInts: (o: Unstringifiable) => Unstringifiable + stringifyBigInts: (o: Stringifiable) => string[] + unstringifyBigInts: (o: Unstringifiable) => bigint[] } } diff --git a/utils/PrivateBank.utils.ts b/utils/PrivateBank.utils.ts index 9c9e755..484d493 100644 --- a/utils/PrivateBank.utils.ts +++ b/utils/PrivateBank.utils.ts @@ -2,7 +2,7 @@ import crypto from 'crypto' import { bigintToHex, uint8ArrayToBigInt } from './types.utils' import { poseidon } from '@iden3/js-crypto' import { groth16 } from 'snarkjs' -import { Stringifiable } from 'ffjavascript' +import { Stringifiable, utils } from 'ffjavascript' import path from 'path' import fs from 'fs' @@ -17,9 +17,9 @@ export type Proof = { publicSignals: string[] } -export const generateDeposit = () => { - const secret = randomBigInt(31) - const nullifier = randomBigInt(31) +export const generateDeposit = (seed?: string) => { + const secret = randomBigInt(31, seed) + const nullifier = randomBigInt(31, seed) const commitment = bigintToHex( poseidon.hash([uint8ArrayToBigInt(nullifier), uint8ArrayToBigInt(secret)]), ) @@ -27,10 +27,17 @@ export const generateDeposit = () => { return deposit } -const randomBigInt = (numBytes: number) => { - const bytes = crypto.randomBytes(numBytes) - // const littleEndianBigInt = BigInt('0x' + bytes.reverse().toString('hex')) - return bytes.reverse() +const randomBigInt = (numBytes: number, seed?: string) => { + let bytes: Buffer + if (seed) { + // Use seed-based generation + const hash = crypto.createHash('sha256').update(seed).digest() + bytes = hash.subarray(0, numBytes) + } else { + // Fallback to random generation + bytes = crypto.randomBytes(numBytes) + } + return bytes } export const generateProof = async (input: Stringifiable): Promise => { @@ -45,3 +52,15 @@ export const verifyProof = async (proof: Proof): Promise => { const verificationKey = JSON.parse(fs.readFileSync(verificationKeyPath, 'utf8')) return await groth16.verify(verificationKey, proof.publicSignals, proof.proof) } + +export const toSolidityInput = (proof: Proof) => { + const result = { + proof: utils.stringifyBigInts({ + pA: proof.proof.pi_a.slice(0, 2).map((x) => bigintToHex(BigInt(x))), + pB: proof.proof.pi_b.slice(0, 2).map((x) => x.slice(0, 2).reverse().map((y) => bigintToHex(BigInt(y)))), + pC: proof.proof.pi_c.slice(0, 2).map((x) => bigintToHex(BigInt(x))), + }), + publicSignals: utils.unstringifyBigInts(proof.publicSignals).map((x) => bigintToHex(x)), + } + return result +} diff --git a/utils/types.utils.ts b/utils/types.utils.ts index cf47bb2..8adef81 100644 --- a/utils/types.utils.ts +++ b/utils/types.utils.ts @@ -10,6 +10,10 @@ export const bufferToBigInt = (buffer: Buffer) => { return BigInt('0x' + buffer.toString('hex')) } +export const padHex = (hex: string) => { + return '0x' + hex.slice(2).padStart(64, '0') +} + export const bufferToHex = (buffer: Buffer) => { return '0x' + buffer.toString('hex').padStart(64, '0') } From 80cfc953c0d1108f43b1459da981544d83a72ccd Mon Sep 17 00:00:00 2001 From: parketh Date: Wed, 22 Oct 2025 11:36:10 +0100 Subject: [PATCH 15/41] add remaining ETHPrivateBank tests --- test/ETHPrivateBank.test.ts | 470 ++++++++++++++++++++++++++++++++++-- utils/PrivateBank.utils.ts | 9 +- utils/keccak.utils.ts | 2 +- 3 files changed, 464 insertions(+), 17 deletions(-) diff --git a/test/ETHPrivateBank.test.ts b/test/ETHPrivateBank.test.ts index c7740af..366021b 100644 --- a/test/ETHPrivateBank.test.ts +++ b/test/ETHPrivateBank.test.ts @@ -3,6 +3,7 @@ import { ethers } from 'hardhat' import { generateDeposit, generateProof, + randomBigInt, toSolidityInput, verifyProof, } from '../utils/PrivateBank.utils' @@ -11,14 +12,23 @@ import { expect } from './shared/expect' import FixedMerkleTree from 'fixed-merkle-tree' import { getMiMCSpongeHasher } from '../utils/MiMCSponge.utils' import { utils } from 'ffjavascript' -import { bigintToHex, bufferToBigInt, padHex, uint8ArrayToBigInt } from '../utils/types.utils' +import { + bigintToHex, + bufferToBigInt, + bufferToHex, + padHex, + uint8ArrayToBigInt, +} from '../utils/types.utils' import { poseidon } from '@iden3/js-crypto' +import { FIELD_P } from '../utils/keccak.utils' describe('ETHPrivateBank', function () { const ZERO = '0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8' const DEPOSIT_AMOUNT = ethers.utils.parseEther('1') const HEIGHT = 20 - const relayerFee = BigInt(25e15) + const relayerFeePct = 25 // 0.025% = `relayerFeePct` / `relayerFeePctBase` + const relayerFeePctBase = 10000 + const relayerFeeGasUsed = ethers.utils.parseUnits('310000', 'wei') // TODO: update this if contract is updated const gasRefund = BigInt(0) let verifier: Contract @@ -44,7 +54,7 @@ describe('ETHPrivateBank', function () { it('deposit(): should process deposit and emit event', async () => { // first deposit - const deposit = generateDeposit('seed1') + const deposit = generateDeposit() const tx = await privateBank .connect(sender) .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) @@ -58,7 +68,7 @@ describe('ETHPrivateBank', function () { expect(depositEvt.args.index).to.equal(0) // 2nd deposit - const deposit2 = generateDeposit('seed2') + const deposit2 = generateDeposit() const tx2 = await privateBank .connect(sender) .deposit(deposit2.commitment, { value: DEPOSIT_AMOUNT }) @@ -74,7 +84,7 @@ describe('ETHPrivateBank', function () { it('deposit(): should reject duplicate deposit', async () => { // generate deposit - const deposit = generateDeposit('seed3') + const deposit = generateDeposit() const tx = await privateBank .connect(sender) .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) @@ -88,7 +98,7 @@ describe('ETHPrivateBank', function () { it('snarkjs should correctly generate and verify proof', async () => { // generate deposit - const deposit = generateDeposit('seed4') + const deposit = generateDeposit() // setup tree const hashMiMCSponge = await getMiMCSpongeHasher() @@ -98,6 +108,14 @@ describe('ETHPrivateBank', function () { }) tree.insert(deposit.commitment) + // calculate relayer fee + const gasPrice = await ethers.provider.getGasPrice() + const gasFee = relayerFeeGasUsed.mul(gasPrice) + const relayerFee = DEPOSIT_AMOUNT.mul(relayerFeePct) + .div(relayerFeePctBase) + .add(gasFee) + .toBigInt() + // setup proof const rawInput = { root: tree.root, @@ -123,7 +141,7 @@ describe('ETHPrivateBank', function () { it('snarkjs proof should be resistant to tampering', async () => { // generate deposit - const deposit = generateDeposit('seed5') + const deposit = generateDeposit() // setup tree const hashMiMCSponge = await getMiMCSpongeHasher() @@ -133,6 +151,14 @@ describe('ETHPrivateBank', function () { }) tree.insert(deposit.commitment) + // calculate relayer fee + const gasPrice = await ethers.provider.getGasPrice() + const gasFee = relayerFeeGasUsed.mul(gasPrice) + const relayerFee = DEPOSIT_AMOUNT.mul(relayerFeePct) + .div(relayerFeePctBase) + .add(gasFee) + .toBigInt() + // setup proof const rawInput = { root: tree.root, @@ -173,7 +199,7 @@ describe('ETHPrivateBank', function () { it('withdraw(): should process withdraw and emit event', async () => { // generate deposit - const deposit = generateDeposit('seed6') + const deposit = generateDeposit() // setup tree const hashMiMCSponge = await getMiMCSpongeHasher() @@ -189,6 +215,14 @@ describe('ETHPrivateBank', function () { .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) await tx.wait() + // calculate relayer fee + const gasPrice = await ethers.provider.getGasPrice() + const gasFee = relayerFeeGasUsed.mul(gasPrice) + const relayerFee = DEPOSIT_AMOUNT.mul(relayerFeePct) + .div(relayerFeePctBase) + .add(gasFee) + .toBigInt() + // generate proof const rawInput = { root: tree.root, @@ -203,14 +237,16 @@ describe('ETHPrivateBank', function () { pathIndices: tree.path(0).pathIndices, } const input = utils.stringifyBigInts(rawInput) - - // generate and verify proof const proofData = await generateProof(input) - const isValid = await verifyProof(proofData) - expect(isValid).to.be.true + const proof = toSolidityInput(proofData) + + // cache balances + const senderBalanceBefore = await ethers.provider.getBalance(sender.address) + const recipientBalanceBefore = await ethers.provider.getBalance(recipient.address) + const relayerBalanceBefore = await ethers.provider.getBalance(relayer.address) + const contractBalanceBefore = await ethers.provider.getBalance(privateBank.address) // withdraw - const proof = toSolidityInput(proofData) const inputs = { root: padHex(rawInput.root as string), nullifierHash: bigintToHex(rawInput.nullifierHash), @@ -220,7 +256,7 @@ describe('ETHPrivateBank', function () { relayerFee: bigintToHex(rawInput.relayerFee), gasRefund: bigintToHex(rawInput.gasRefund), } - const tx2 = await privateBank.connect(sender).withdraw(proof.proof, inputs) + const tx2 = await privateBank.connect(relayer).withdraw(proof.proof, inputs) const receipt = await tx2.wait() // check event @@ -229,5 +265,411 @@ describe('ETHPrivateBank', function () { expect(withdrawEvt.args.recipient).to.equal(recipient.address) expect(withdrawEvt.args.relayer).to.equal(relayer.address) expect(withdrawEvt.args.nullifierHash).to.equal(bigintToHex(rawInput.nullifierHash)) + expect(withdrawEvt.args.fee).to.equal(bigintToHex(relayerFee)) + + // compute gas use + const actGasUsed = receipt.gasUsed + const actGasPrice = receipt.effectiveGasPrice + const actGasFee = actGasUsed.mul(actGasPrice) + expect(actGasFee).to.be.closeTo(gasFee, ethers.utils.parseUnits('1000', 'gwei')) + + // check balances + const senderBalanceAfter = await ethers.provider.getBalance(sender.address) + const recipientBalanceAfter = await ethers.provider.getBalance(recipient.address) + const relayerBalanceAfter = await ethers.provider.getBalance(relayer.address) + const contractBalanceAfter = await ethers.provider.getBalance(privateBank.address) + + expect(senderBalanceAfter).to.equal(senderBalanceBefore) + expect(recipientBalanceAfter).to.equal( + recipientBalanceBefore.add(DEPOSIT_AMOUNT).sub(relayerFee), + ) + expect(relayerBalanceAfter).to.equal(relayerBalanceBefore.add(relayerFee).sub(actGasFee)) + expect(contractBalanceAfter).to.equal(contractBalanceBefore.sub(DEPOSIT_AMOUNT)) + + // check output is spent + const isSpent = await privateBank.isSpent(inputs.nullifierHash) + expect(isSpent).to.be.true + }) + + it('withdraw(): should prevent double spend', async () => { + // generate deposit + const deposit = generateDeposit() + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit.commitment) + + // deposit to contract + const tx = await privateBank + .connect(sender) + .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) + await tx.wait() + + // calculate relayer fee + const gasPrice = await ethers.provider.getGasPrice() + const gasFee = relayerFeeGasUsed.mul(gasPrice) + const relayerFee = DEPOSIT_AMOUNT.mul(relayerFeePct) + .div(relayerFeePctBase) + .add(gasFee) + .toBigInt() + + // generate proof + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([uint8ArrayToBigInt(deposit.nullifier)]), + nullifier: bufferToBigInt(deposit.nullifier), + relayer: relayer.address, + recipient: recipient.address, + relayerFee, + gasRefund, + secret: bufferToBigInt(deposit.secret), + pathElements: tree.path(0).pathElements, + pathIndices: tree.path(0).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + const proofData = await generateProof(input) + const proof = toSolidityInput(proofData) + + // withdraw + const inputs = { + root: padHex(rawInput.root as string), + nullifierHash: bigintToHex(rawInput.nullifierHash), + nullifier: bigintToHex(rawInput.nullifier), + recipient: recipient.address, + relayer: relayer.address, + relayerFee: bigintToHex(rawInput.relayerFee), + gasRefund: bigintToHex(rawInput.gasRefund), + } + const tx2 = await privateBank.connect(relayer).withdraw(proof.proof, inputs) + await tx2.wait() + + await expect(privateBank.connect(relayer).withdraw(proof.proof, inputs)).to.be.revertedWith( + 'AlreadySpent', + ) + }) + + it('withdraw(): should prevent double spend with overflow', async () => { + // generate deposit + const deposit = generateDeposit() + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit.commitment) + + // deposit to contract + const tx = await privateBank + .connect(sender) + .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) + await tx.wait() + + // calculate relayer fee + const gasPrice = await ethers.provider.getGasPrice() + const gasFee = relayerFeeGasUsed.mul(gasPrice) + const relayerFee = DEPOSIT_AMOUNT.mul(relayerFeePct) + .div(relayerFeePctBase) + .add(gasFee) + .toBigInt() + + // generate proof + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([uint8ArrayToBigInt(deposit.nullifier)]), + nullifier: bufferToBigInt(deposit.nullifier), + relayer: relayer.address, + recipient: recipient.address, + relayerFee, + gasRefund, + secret: bufferToBigInt(deposit.secret), + pathElements: tree.path(0).pathElements, + pathIndices: tree.path(0).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + const proofData = await generateProof(input) + const proof = toSolidityInput(proofData) + + // withdraw + const inputs = { + root: padHex(rawInput.root as string), + nullifierHash: bigintToHex(rawInput.nullifierHash + FIELD_P), + nullifier: bigintToHex(rawInput.nullifier), + recipient: recipient.address, + relayer: relayer.address, + relayerFee: bigintToHex(rawInput.relayerFee), + gasRefund: bigintToHex(rawInput.gasRefund), + } + await expect(privateBank.connect(relayer).withdraw(proof.proof, inputs)).to.be.revertedWith( + 'InvalidProof', + ) + }) + + it('withdraw(): should reject invalid merkle root', async () => { + // generate deposit + const deposit = generateDeposit() + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit.commitment) + + // deposit to contract + const tx = await privateBank + .connect(sender) + .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) + await tx.wait() + + // calculate relayer fee + const gasPrice = await ethers.provider.getGasPrice() + const gasFee = relayerFeeGasUsed.mul(gasPrice) + const relayerFee = DEPOSIT_AMOUNT.mul(relayerFeePct) + .div(relayerFeePctBase) + .add(gasFee) + .toBigInt() + + // generate proof + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([uint8ArrayToBigInt(deposit.nullifier)]), + nullifier: bufferToBigInt(deposit.nullifier), + relayer: relayer.address, + recipient: recipient.address, + relayerFee, + gasRefund, + secret: bufferToBigInt(deposit.secret), + pathElements: tree.path(0).pathElements, + pathIndices: tree.path(0).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + const proofData = await generateProof(input) + const proof = toSolidityInput(proofData) + + // withdraw + const inputs = { + root: bufferToHex(randomBigInt(31)), + nullifierHash: bigintToHex(rawInput.nullifierHash), + nullifier: bigintToHex(rawInput.nullifier), + recipient: recipient.address, + relayer: relayer.address, + relayerFee: bigintToHex(rawInput.relayerFee), + gasRefund: bigintToHex(rawInput.gasRefund), + } + await expect(privateBank.connect(relayer).withdraw(proof.proof, inputs)).to.be.revertedWith( + 'InvalidMerkleRoot', + ) + }) + + it('withdraw(): should reject tampered inputs or proof', async () => { + // generate deposit + const deposit = generateDeposit() + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit.commitment) + + // deposit to contract + const tx = await privateBank + .connect(sender) + .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) + await tx.wait() + + // calculate relayer fee + const gasPrice = await ethers.provider.getGasPrice() + const gasFee = relayerFeeGasUsed.mul(gasPrice) + const relayerFee = DEPOSIT_AMOUNT.mul(relayerFeePct) + .div(relayerFeePctBase) + .add(gasFee) + .toBigInt() + + // generate proof + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([uint8ArrayToBigInt(deposit.nullifier)]), + nullifier: bufferToBigInt(deposit.nullifier), + relayer: relayer.address, + recipient: recipient.address, + relayerFee, + gasRefund, + secret: bufferToBigInt(deposit.secret), + pathElements: tree.path(0).pathElements, + pathIndices: tree.path(0).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + const proofData = await generateProof(input) + const proof = toSolidityInput(proofData) + + // compile inputs + const inputs = { + root: padHex(rawInput.root as string), + nullifierHash: bigintToHex(rawInput.nullifierHash), + nullifier: bigintToHex(rawInput.nullifier), + recipient: recipient.address, + relayer: relayer.address, + relayerFee: bigintToHex(rawInput.relayerFee), + gasRefund: bigintToHex(rawInput.gasRefund), + } + + // withdraw with incorrect recipient + await expect( + privateBank.connect(relayer).withdraw(proof.proof, { ...inputs, recipient: sender.address }), + ).to.be.revertedWith('InvalidProof') + + // withdraw with incorrect relayer fee + await expect( + privateBank.connect(relayer).withdraw(proof.proof, { ...inputs, relayerFee: '0' }), + ).to.be.revertedWith('InvalidProof') + + // // withdraw with incorrect nullifier hash + await expect( + privateBank + .connect(relayer) + .withdraw(proof.proof, { ...inputs, nullifierHash: bufferToHex(randomBigInt(31)) }), + ).to.be.revertedWith('InvalidProof') + + // withdraw with incorrect proof + await expect( + privateBank + .connect(relayer) + .withdraw( + { ...proof.proof, pA: [bufferToHex(randomBigInt(31)), bufferToHex(randomBigInt(31))] }, + inputs, + ), + ).to.be.revertedWith('InvalidProof') + + // works with correct inputs and proof + await expect(privateBank.connect(relayer).withdraw(proof.proof, inputs)).to.not.be.reverted + }) + + it('withdraw(): should reject non zero gas refund', async () => { + // generate deposit + const deposit = generateDeposit() + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit.commitment) + + // deposit to contract + const tx = await privateBank + .connect(sender) + .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) + await tx.wait() + + // calculate relayer fee + const gasPrice = await ethers.provider.getGasPrice() + const gasFee = relayerFeeGasUsed.mul(gasPrice) + const relayerFee = DEPOSIT_AMOUNT.mul(relayerFeePct) + .div(relayerFeePctBase) + .add(gasFee) + .toBigInt() + + // generate proof + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([uint8ArrayToBigInt(deposit.nullifier)]), + nullifier: bufferToBigInt(deposit.nullifier), + relayer: relayer.address, + recipient: recipient.address, + relayerFee, + gasRefund: BigInt(1), + secret: bufferToBigInt(deposit.secret), + pathElements: tree.path(0).pathElements, + pathIndices: tree.path(0).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + const proofData = await generateProof(input) + const proof = toSolidityInput(proofData) + + // withdraw + const inputs = { + root: padHex(rawInput.root as string), + nullifierHash: bigintToHex(rawInput.nullifierHash), + nullifier: bigintToHex(rawInput.nullifier), + recipient: recipient.address, + relayer: relayer.address, + relayerFee: bigintToHex(rawInput.relayerFee), + gasRefund: bigintToHex(rawInput.gasRefund), + } + await expect(privateBank.connect(relayer).withdraw(proof.proof, inputs)).to.be.revertedWith( + 'GasRefundReceivedForEthWithdraw', + ) + }) + + it('is_spent_array(): should work for multiple deposits', async () => { + // generate deposit + const deposit1 = generateDeposit() + const deposit2 = generateDeposit() + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit1.commitment) + tree.insert(deposit2.commitment) + + // deposit to contract + await privateBank.connect(sender).deposit(deposit1.commitment, { value: DEPOSIT_AMOUNT }) + await privateBank.connect(sender).deposit(deposit2.commitment, { value: DEPOSIT_AMOUNT }) + + // calculate relayer fee + const gasPrice = await ethers.provider.getGasPrice() + const gasFee = relayerFeeGasUsed.mul(gasPrice) + const relayerFee = DEPOSIT_AMOUNT.mul(relayerFeePct) + .div(relayerFeePctBase) + .add(gasFee) + .toBigInt() + + // generate proof for deposit2 + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([uint8ArrayToBigInt(deposit2.nullifier)]), + nullifier: bufferToBigInt(deposit2.nullifier), + relayer: relayer.address, + recipient: recipient.address, + relayerFee, + gasRefund, + secret: bufferToBigInt(deposit2.secret), + pathElements: tree.path(1).pathElements, + pathIndices: tree.path(1).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + const proofData = await generateProof(input) + const proof = toSolidityInput(proofData) + + // withdraw deposit2 + const inputs = { + root: padHex(rawInput.root as string), + nullifierHash: bigintToHex(rawInput.nullifierHash), + nullifier: bigintToHex(rawInput.nullifier), + recipient: recipient.address, + relayer: relayer.address, + relayerFee: bigintToHex(rawInput.relayerFee), + gasRefund: bigintToHex(rawInput.gasRefund), + } + await privateBank.connect(relayer).withdraw(proof.proof, inputs) + + const isSpentArray = await privateBank.isSpentArray([ + bigintToHex(poseidon.hash([uint8ArrayToBigInt(deposit1.nullifier)])), + inputs.nullifierHash, + ]) + console.log(isSpentArray) }) }) diff --git a/utils/PrivateBank.utils.ts b/utils/PrivateBank.utils.ts index 484d493..456e480 100644 --- a/utils/PrivateBank.utils.ts +++ b/utils/PrivateBank.utils.ts @@ -27,7 +27,7 @@ export const generateDeposit = (seed?: string) => { return deposit } -const randomBigInt = (numBytes: number, seed?: string) => { +export const randomBigInt = (numBytes: number, seed?: string) => { let bytes: Buffer if (seed) { // Use seed-based generation @@ -57,7 +57,12 @@ export const toSolidityInput = (proof: Proof) => { const result = { proof: utils.stringifyBigInts({ pA: proof.proof.pi_a.slice(0, 2).map((x) => bigintToHex(BigInt(x))), - pB: proof.proof.pi_b.slice(0, 2).map((x) => x.slice(0, 2).reverse().map((y) => bigintToHex(BigInt(y)))), + pB: proof.proof.pi_b.slice(0, 2).map((x) => + x + .slice(0, 2) + .reverse() + .map((y) => bigintToHex(BigInt(y))), + ), pC: proof.proof.pi_c.slice(0, 2).map((x) => bigintToHex(BigInt(x))), }), publicSignals: utils.unstringifyBigInts(proof.publicSignals).map((x) => bigintToHex(x)), diff --git a/utils/keccak.utils.ts b/utils/keccak.utils.ts index bb2bf36..ecd6bd8 100644 --- a/utils/keccak.utils.ts +++ b/utils/keccak.utils.ts @@ -1,6 +1,6 @@ import { keccak256, toUtf8Bytes } from 'ethers/lib/utils' -const FIELD_P = BigInt( +export const FIELD_P = BigInt( '21888242871839275222246405745257275088548364400416034343698204186575808495617', ) From 6780755e71a5180a5445666dd2cb32e0ea84a032 Mon Sep 17 00:00:00 2001 From: parketh Date: Wed, 22 Oct 2025 12:15:29 +0100 Subject: [PATCH 16/41] chore: fmt + lint --- .prettierignore | 2 +- eslint.config.ts | 61 +++ foundry.toml | 3 + package.json | 16 +- src/contracts/ERC20PrivateBank.sol | 11 +- src/contracts/ETHPrivateBank.sol | 20 +- src/contracts/PrivateBank.sol | 29 +- src/contracts/Verifier.sol | 389 ++++++++-------- src/contracts/mocks/MockMerkleTree.sol | 2 +- test/ETHPrivateBank.test.ts | 8 +- types/snarkjs.d.ts | 23 +- utils/PrivateBank.utils.ts | 21 +- yarn.lock | 593 ++++++++++++++++++++++++- 13 files changed, 926 insertions(+), 252 deletions(-) create mode 100644 eslint.config.ts diff --git a/.prettierignore b/.prettierignore index 378eac2..c795b05 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1 @@ -build +build \ No newline at end of file diff --git a/eslint.config.ts b/eslint.config.ts new file mode 100644 index 0000000..f74fb97 --- /dev/null +++ b/eslint.config.ts @@ -0,0 +1,61 @@ +import eslint from '@eslint/js' +import tseslint from 'typescript-eslint' +import prettier from 'eslint-config-prettier' + +export default tseslint.config( + // Ignore patterns + { + ignores: [ + 'node_modules/', + 'build/', + 'out/', + 'dist/', + 'artifacts/', + 'cache/', + 'typechain/', + 'typechain-types/', + 'coverage/', + 'lib/', + '*.config.js', + ], + }, + + // Base config for all files + eslint.configs.recommended, + + // TypeScript-specific config + ...tseslint.configs.recommended, + + // Custom rules + { + languageOptions: { + ecmaVersion: 2020, + sourceType: 'module', + parserOptions: { + project: './tsconfig.json', + }, + globals: { + node: true, + mocha: true, + es2020: true, + }, + }, + rules: { + '@typescript-eslint/no-explicit-any': 'warn', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + }, + ], + '@typescript-eslint/explicit-module-boundary-types': 'off', + 'no-console': 'off', + '@typescript-eslint/no-unused-expressions': 'off', + 'no-unused-expressions': 'off', + }, + }, + + // Prettier must be last to override other configs + prettier, +) diff --git a/foundry.toml b/foundry.toml index e1ac33f..21567d0 100644 --- a/foundry.toml +++ b/foundry.toml @@ -7,5 +7,8 @@ libs = ["lib"] tab_width = 2 bracket_spacing = true line_length = 100 +single_line_statement_blocks = "multi" +quote_style = "single" +number_underscore = "preserve" # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/package.json b/package.json index d59207e..a6121d9 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,15 @@ "build:circuit:setup": "npx snarkjs groth16 setup build/circuits/withdraw.r1cs build/circuits/ppot_0080_15.ptau build/circuits/withdraw.zkey", "build:circuit:export:key": "npx snarkjs zkey export verificationkey build/circuits/withdraw.zkey build/circuits/verification_key.json", "build:circuit:export:contract": "npx snarkjs zkey export solidityverifier build/circuits/withdraw.zkey build/circuits/Verifier.sol && sed -i '' 's/Groth16Verifier/Verifier/g' build/circuits/Verifier.sol && cp build/circuits/Verifier.sol src/contracts/Verifier.sol", - "build:circuit": "npm run build:circuit:compile && npm run build:circuit:setup && npm run build:circuit:export:key && npm run build:circuit:export:contract" + "build:circuit": "npm run build:circuit:compile && npm run build:circuit:setup && npm run build:circuit:export:key && npm run build:circuit:export:contract", + "format:check": "forge fmt --check", + "format": "forge fmt", + "lint:check": "forge lint --check", + "lint": "forge lint", + "test": "npx hardhat test" }, "devDependencies": { + "@eslint/js": "^9.38.0", "@nomiclabs/hardhat-ethers": "^2.2.3", "@nomiclabs/hardhat-waffle": "^2.0.6", "@openzeppelin/contracts": "^5.4.0", @@ -18,16 +24,22 @@ "@types/mocha": "^10.0.10", "@types/node": "^24.8.1", "@types/snarkjs": "^0.7.9", + "@typescript-eslint/eslint-plugin": "^8.46.2", + "@typescript-eslint/parser": "^8.46.2", "chai": "^6.2.0", "circomlibjs": "^0.1.7", + "eslint": "^9", + "eslint-config-prettier": "^10.1.8", "ethereum-waffle": "^4.0.10", "ethers": "^5.7.2", "ffjavascript": "^0.3.1", "fixed-merkle-tree": "^0.7.3", "hardhat": "^2.24.2", + "jiti": "^2.6.1", "snarkjs": "^0.7.5", "ts-node": "^10.9.2", - "typescript": "^5.9.3" + "typescript": "^5.9.3", + "typescript-eslint": "^8.46.2" }, "dependencies": { "@iden3/js-crypto": "^1.3.2", diff --git a/src/contracts/ERC20PrivateBank.sol b/src/contracts/ERC20PrivateBank.sol index fdf644a..8e67c1d 100644 --- a/src/contracts/ERC20PrivateBank.sol +++ b/src/contracts/ERC20PrivateBank.sol @@ -11,12 +11,9 @@ contract ERC20PrivateBank is PrivateBank { using SafeERC20 for IERC20; IERC20 public token; - constructor( - IVerifier _verifier, - uint32 _height, - uint256 _depositAmount, - IERC20 _token - ) PrivateBank(_verifier, _height, _depositAmount) { + constructor(IVerifier _verifier, uint32 _height, uint256 _depositAmount, IERC20 _token) + PrivateBank(_verifier, _height, _depositAmount) + { token = _token; } @@ -38,7 +35,7 @@ contract ERC20PrivateBank is PrivateBank { } if (inputs.gasRefund > 0) { - (bool success, ) = inputs.recipient.call{ value: inputs.gasRefund }(''); + (bool success,) = inputs.recipient.call{ value: inputs.gasRefund }(''); if (!success) { // return refund back to relayer if transfer unsuccessful inputs.relayer.transfer(inputs.gasRefund); diff --git a/src/contracts/ETHPrivateBank.sol b/src/contracts/ETHPrivateBank.sol index cf5563e..aa5587e 100644 --- a/src/contracts/ETHPrivateBank.sol +++ b/src/contracts/ETHPrivateBank.sol @@ -3,14 +3,18 @@ pragma solidity ^0.8.24; import { PrivateBank } from './PrivateBank.sol'; import { IVerifier } from '../interfaces/IVerifier.sol'; -import { WrongAmountTransferred, EthReceivedForWithdraw, GasRefundReceivedForEthWithdraw, WithdrawFailed, RelayerFeePaymentFailed } from '../Errors.sol'; +import { + WrongAmountTransferred, + EthReceivedForWithdraw, + GasRefundReceivedForEthWithdraw, + WithdrawFailed, + RelayerFeePaymentFailed +} from '../Errors.sol'; contract ETHPrivateBank is PrivateBank { - constructor( - IVerifier _verifier, - uint32 _height, - uint256 _depositAmount - ) PrivateBank(_verifier, _height, _depositAmount) {} + constructor(IVerifier _verifier, uint32 _height, uint256 _depositAmount) + PrivateBank(_verifier, _height, _depositAmount) + { } function processDeposit() internal override { if (msg.value != depositAmount) { @@ -27,12 +31,12 @@ contract ETHPrivateBank is PrivateBank { revert GasRefundReceivedForEthWithdraw(); } - (bool success, ) = inputs.recipient.call{ value: depositAmount - inputs.relayerFee }(''); + (bool success,) = inputs.recipient.call{ value: depositAmount - inputs.relayerFee }(''); if (!success) { revert WithdrawFailed(); } if (inputs.relayerFee > 0) { - (success, ) = inputs.relayer.call{ value: inputs.relayerFee }(''); + (success,) = inputs.relayer.call{ value: inputs.relayerFee }(''); if (!success) { revert RelayerFeePaymentFailed(); } diff --git a/src/contracts/PrivateBank.sol b/src/contracts/PrivateBank.sol index a8b7199..c7f54e0 100644 --- a/src/contracts/PrivateBank.sol +++ b/src/contracts/PrivateBank.sol @@ -4,7 +4,15 @@ pragma solidity ^0.8.24; import { ReentrancyGuard } from '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import { MerkleTree } from './MerkleTree.sol'; import { IVerifier } from '../interfaces/IVerifier.sol'; -import { DepositAmountZero, InvalidCaller, InvalidMerkleRoot, AlreadySpent, DuplicateCommitment, FeeExceedsTransferValue, InvalidProof } from '../Errors.sol'; +import { + DepositAmountZero, + InvalidCaller, + InvalidMerkleRoot, + AlreadySpent, + DuplicateCommitment, + FeeExceedsTransferValue, + InvalidProof +} from '../Errors.sol'; abstract contract PrivateBank is MerkleTree, ReentrancyGuard { /////////////////////////// @@ -52,10 +60,7 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { event Register(address indexed user, bytes publicKey); event Deposit(address indexed user, bytes32 indexed commitment, uint32 index, uint256 timestamp); event Withdraw( - address indexed recipient, - address indexed relayer, - bytes32 nullifierHash, - uint256 fee + address indexed recipient, address indexed relayer, bytes32 nullifierHash, uint256 fee ); /////////////////////////// @@ -126,8 +131,7 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { } // verify proof - if ( - !verifier.verifyProof( + if (!verifier.verifyProof( proof.pA, proof.pB, proof.pC, @@ -139,8 +143,7 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { inputs.relayerFee, inputs.gasRefund ] - ) - ) { + )) { revert InvalidProof(); } @@ -162,9 +165,11 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { } /// @notice Whether a list of deposit has already been spent - function isSpentArray( - bytes32[] calldata nullifierHashArray - ) external view returns (bool[] memory spent) { + function isSpentArray(bytes32[] calldata nullifierHashArray) + external + view + returns (bool[] memory spent) + { spent = new bool[](nullifierHashArray.length); for (uint256 i = 0; i < nullifierHashArray.length; i++) { if (isSpent(nullifierHashArray[i])) { diff --git a/src/contracts/Verifier.sol b/src/contracts/Verifier.sol index a67c36d..dcf085e 100644 --- a/src/contracts/Verifier.sol +++ b/src/contracts/Verifier.sol @@ -21,183 +21,212 @@ pragma solidity >=0.7.0 <0.9.0; contract Verifier { - // Scalar field size - uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; - // Base field size - uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; - - // Verification Key data - uint256 constant alphax = 16428432848801857252194528405604668803277877773566238944394625302971855135431; - uint256 constant alphay = 16846502678714586896801519656441059708016666274385668027902869494772365009666; - uint256 constant betax1 = 3182164110458002340215786955198810119980427837186618912744689678939861918171; - uint256 constant betax2 = 16348171800823588416173124589066524623406261996681292662100840445103873053252; - uint256 constant betay1 = 4920802715848186258981584729175884379674325733638798907835771393452862684714; - uint256 constant betay2 = 19687132236965066906216944365591810874384658708175106803089633851114028275753; - uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - - - uint256 constant IC0x = 19345027579055691442232030885585358603661387761211135985107572956835645821424; - uint256 constant IC0y = 6970734058131104011332651160749990650751392498667137665320645656029949031038; - - uint256 constant IC1x = 14090489076103670597018116520648535856812238729299721181075397277514784393718; - uint256 constant IC1y = 17571797013621969995736067140027247406932905556801850515510678415761452802073; - - uint256 constant IC2x = 4050967825025692193456888093898318244575492240770650835291567617213381285954; - uint256 constant IC2y = 21493757562808989843905945177884706190858964447230823163868375585722894699543; - - uint256 constant IC3x = 5112752980131522575116927374094828581157087194474483576327716188957360001977; - uint256 constant IC3y = 13593038714319541077699488665375854782049057687266926183487979978077858256907; - - uint256 constant IC4x = 13641957649997242479421402730016051359703541440321045845032306239820608864918; - uint256 constant IC4y = 15236924403742880579660502380396794016475355429085457791907345970652568972555; - - uint256 constant IC5x = 474321822140723381328860273216999357723214550487194043528076824713580975455; - uint256 constant IC5y = 5011919448025533158096087868794277175434873567880624898473259049027906972420; - - uint256 constant IC6x = 10198416267615844257439351470961284035725279158422282821713285143871066671943; - uint256 constant IC6y = 13916876023165539688312045497383401714445273306984016241679553491287767202329; - - - // Memory data - uint16 constant pVk = 0; - uint16 constant pPairing = 128; - - uint16 constant pLastMem = 896; - - function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[6] calldata _pubSignals) public view returns (bool) { - assembly { - function checkField(v) { - if iszero(lt(v, r)) { - mstore(0, 0) - return(0, 0x20) - } - } - - // G1 function to multiply a G1 value(x,y) to value in an address - function g1_mulAccC(pR, x, y, s) { - let success - let mIn := mload(0x40) - mstore(mIn, x) - mstore(add(mIn, 32), y) - mstore(add(mIn, 64), s) - - success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) - - if iszero(success) { - mstore(0, 0) - return(0, 0x20) - } - - mstore(add(mIn, 64), mload(pR)) - mstore(add(mIn, 96), mload(add(pR, 32))) - - success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) - - if iszero(success) { - mstore(0, 0) - return(0, 0x20) - } - } - - function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { - let _pPairing := add(pMem, pPairing) - let _pVk := add(pMem, pVk) - - mstore(_pVk, IC0x) - mstore(add(_pVk, 32), IC0y) - - // Compute the linear combination vk_x - - g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) - - g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) - - g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) - - g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) - - g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) - - g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) - - - // -A - mstore(_pPairing, calldataload(pA)) - mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) - - // B - mstore(add(_pPairing, 64), calldataload(pB)) - mstore(add(_pPairing, 96), calldataload(add(pB, 32))) - mstore(add(_pPairing, 128), calldataload(add(pB, 64))) - mstore(add(_pPairing, 160), calldataload(add(pB, 96))) - - // alpha1 - mstore(add(_pPairing, 192), alphax) - mstore(add(_pPairing, 224), alphay) - - // beta2 - mstore(add(_pPairing, 256), betax1) - mstore(add(_pPairing, 288), betax2) - mstore(add(_pPairing, 320), betay1) - mstore(add(_pPairing, 352), betay2) - - // vk_x - mstore(add(_pPairing, 384), mload(add(pMem, pVk))) - mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) - - - // gamma2 - mstore(add(_pPairing, 448), gammax1) - mstore(add(_pPairing, 480), gammax2) - mstore(add(_pPairing, 512), gammay1) - mstore(add(_pPairing, 544), gammay2) - - // C - mstore(add(_pPairing, 576), calldataload(pC)) - mstore(add(_pPairing, 608), calldataload(add(pC, 32))) - - // delta2 - mstore(add(_pPairing, 640), deltax1) - mstore(add(_pPairing, 672), deltax2) - mstore(add(_pPairing, 704), deltay1) - mstore(add(_pPairing, 736), deltay2) - - - let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) - - isOk := and(success, mload(_pPairing)) - } - - let pMem := mload(0x40) - mstore(0x40, add(pMem, pLastMem)) - - // Validate that all evaluations ∈ F - - checkField(calldataload(add(_pubSignals, 0))) - - checkField(calldataload(add(_pubSignals, 32))) - - checkField(calldataload(add(_pubSignals, 64))) - - checkField(calldataload(add(_pubSignals, 96))) - - checkField(calldataload(add(_pubSignals, 128))) - - checkField(calldataload(add(_pubSignals, 160))) - - - // Validate all evaluations - let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) - - mstore(0, isValid) - return(0, 0x20) - } - } - } + // Scalar field size + uint256 constant r = + 21888242871839275222246405745257275088548364400416034343698204186575808495617; + // Base field size + uint256 constant q = + 21888242871839275222246405745257275088696311157297823662689037894645226208583; + + // Verification Key data + uint256 constant alphax = + 16428432848801857252194528405604668803277877773566238944394625302971855135431; + uint256 constant alphay = + 16846502678714586896801519656441059708016666274385668027902869494772365009666; + uint256 constant betax1 = + 3182164110458002340215786955198810119980427837186618912744689678939861918171; + uint256 constant betax2 = + 16348171800823588416173124589066524623406261996681292662100840445103873053252; + uint256 constant betay1 = + 4920802715848186258981584729175884379674325733638798907835771393452862684714; + uint256 constant betay2 = + 19687132236965066906216944365591810874384658708175106803089633851114028275753; + uint256 constant gammax1 = + 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant gammax2 = + 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant gammay1 = + 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant gammay2 = + 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant deltax1 = + 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant deltax2 = + 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant deltay1 = + 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant deltay2 = + 8495653923123431417604973247489272438418190587263600148770280649306958101930; + + uint256 constant IC0x = + 19345027579055691442232030885585358603661387761211135985107572956835645821424; + uint256 constant IC0y = + 6970734058131104011332651160749990650751392498667137665320645656029949031038; + + uint256 constant IC1x = + 14090489076103670597018116520648535856812238729299721181075397277514784393718; + uint256 constant IC1y = + 17571797013621969995736067140027247406932905556801850515510678415761452802073; + + uint256 constant IC2x = + 4050967825025692193456888093898318244575492240770650835291567617213381285954; + uint256 constant IC2y = + 21493757562808989843905945177884706190858964447230823163868375585722894699543; + + uint256 constant IC3x = + 5112752980131522575116927374094828581157087194474483576327716188957360001977; + uint256 constant IC3y = + 13593038714319541077699488665375854782049057687266926183487979978077858256907; + + uint256 constant IC4x = + 13641957649997242479421402730016051359703541440321045845032306239820608864918; + uint256 constant IC4y = + 15236924403742880579660502380396794016475355429085457791907345970652568972555; + + uint256 constant IC5x = + 474321822140723381328860273216999357723214550487194043528076824713580975455; + uint256 constant IC5y = + 5011919448025533158096087868794277175434873567880624898473259049027906972420; + + uint256 constant IC6x = + 10198416267615844257439351470961284035725279158422282821713285143871066671943; + uint256 constant IC6y = + 13916876023165539688312045497383401714445273306984016241679553491287767202329; + + // Memory data + uint16 constant pVk = 0; + uint16 constant pPairing = 128; + + uint16 constant pLastMem = 896; + + function verifyProof( + uint256[2] calldata _pA, + uint256[2][2] calldata _pB, + uint256[2] calldata _pC, + uint256[6] calldata _pubSignals + ) public view returns (bool) { + assembly { + function checkField(v) { + if iszero(lt(v, r)) { + mstore(0, 0) + return(0, 0x20) + } + } + + // G1 function to multiply a G1 value(x,y) to value in an address + function g1_mulAccC(pR, x, y, s) { + let success + let mIn := mload(0x40) + mstore(mIn, x) + mstore(add(mIn, 32), y) + mstore(add(mIn, 64), s) + + success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + + mstore(add(mIn, 64), mload(pR)) + mstore(add(mIn, 96), mload(add(pR, 32))) + + success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + } + + function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { + let _pPairing := add(pMem, pPairing) + let _pVk := add(pMem, pVk) + + mstore(_pVk, IC0x) + mstore(add(_pVk, 32), IC0y) + + // Compute the linear combination vk_x + + g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) + + g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) + + g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) + + g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) + + g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) + + g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) + + // -A + mstore(_pPairing, calldataload(pA)) + mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) + + // B + mstore(add(_pPairing, 64), calldataload(pB)) + mstore(add(_pPairing, 96), calldataload(add(pB, 32))) + mstore(add(_pPairing, 128), calldataload(add(pB, 64))) + mstore(add(_pPairing, 160), calldataload(add(pB, 96))) + + // alpha1 + mstore(add(_pPairing, 192), alphax) + mstore(add(_pPairing, 224), alphay) + + // beta2 + mstore(add(_pPairing, 256), betax1) + mstore(add(_pPairing, 288), betax2) + mstore(add(_pPairing, 320), betay1) + mstore(add(_pPairing, 352), betay2) + + // vk_x + mstore(add(_pPairing, 384), mload(add(pMem, pVk))) + mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) + + // gamma2 + mstore(add(_pPairing, 448), gammax1) + mstore(add(_pPairing, 480), gammax2) + mstore(add(_pPairing, 512), gammay1) + mstore(add(_pPairing, 544), gammay2) + + // C + mstore(add(_pPairing, 576), calldataload(pC)) + mstore(add(_pPairing, 608), calldataload(add(pC, 32))) + + // delta2 + mstore(add(_pPairing, 640), deltax1) + mstore(add(_pPairing, 672), deltax2) + mstore(add(_pPairing, 704), deltay1) + mstore(add(_pPairing, 736), deltay2) + + let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) + + isOk := and(success, mload(_pPairing)) + } + + let pMem := mload(0x40) + mstore(0x40, add(pMem, pLastMem)) + + // Validate that all evaluations ∈ F + + checkField(calldataload(add(_pubSignals, 0))) + + checkField(calldataload(add(_pubSignals, 32))) + + checkField(calldataload(add(_pubSignals, 64))) + + checkField(calldataload(add(_pubSignals, 96))) + + checkField(calldataload(add(_pubSignals, 128))) + + checkField(calldataload(add(_pubSignals, 160))) + + // Validate all evaluations + let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) + + mstore(0, isValid) + return(0, 0x20) + } + } +} diff --git a/src/contracts/mocks/MockMerkleTree.sol b/src/contracts/mocks/MockMerkleTree.sol index 1eba3db..671d8a8 100644 --- a/src/contracts/mocks/MockMerkleTree.sol +++ b/src/contracts/mocks/MockMerkleTree.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.24; import { MerkleTree } from '../MerkleTree.sol'; contract MockMerkleTree is MerkleTree { - constructor(uint32 _height) MerkleTree(_height) {} + constructor(uint32 _height) MerkleTree(_height) { } function insert2(bytes32 _leaf) public returns (uint32) { uint32 index = insert(_leaf); diff --git a/test/ETHPrivateBank.test.ts b/test/ETHPrivateBank.test.ts index 366021b..d8f66f4 100644 --- a/test/ETHPrivateBank.test.ts +++ b/test/ETHPrivateBank.test.ts @@ -88,7 +88,7 @@ describe('ETHPrivateBank', function () { const tx = await privateBank .connect(sender) .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) - const receipt = await tx.wait() + await tx.wait() // deposit again await expect( @@ -178,20 +178,20 @@ describe('ETHPrivateBank', function () { const proof = await generateProof(input) // change nullifierHash and verify proof - let proof1 = proof + const proof1 = proof proof1.publicSignals[1] = '20852167369483002368129571733491972748550005954511142719407505103546956288274' let isValid = await verifyProof(proof1) expect(isValid).to.be.false // change recipient and verify proof - let proof2 = proof + const proof2 = proof proof2.publicSignals[2] = '344073830386746567427978432078835137280280269756' isValid = await verifyProof(proof2) expect(isValid).to.be.false // change fee and verify proof - let proof3 = proof + const proof3 = proof proof3.publicSignals[4] = '0' isValid = await verifyProof(proof3) expect(isValid).to.be.false diff --git a/types/snarkjs.d.ts b/types/snarkjs.d.ts index a483e24..6640f11 100644 --- a/types/snarkjs.d.ts +++ b/types/snarkjs.d.ts @@ -1,14 +1,23 @@ declare module 'snarkjs' { + export type ProofObject = { + proof: Proof + publicSignals: string[] + } + + export type Proof = { + pi_a: string[] + pi_b: string[][] + pi_c: string[] + protocol: string + curve: string + } + export const groth16: { fullProve: ( - input: any, + input: Stringifiable, wasmFile: string, zkeyFileName: string, - logger?: any, - wtnsCalcOptions?: any, - proverOptions?: any, - ) => Promise - prove: (input: any, wasmFile: string, zkeyFileName: string, logger?: any) => Promise - verify: (_vk_verifier: any, _publicSignals: any, _proof: any, logger?: any) => Promise + ) => Promise + verify: (_vk_verifier: JsonObject, _publicSignals: string[], _proof: Proof) => Promise } } diff --git a/utils/PrivateBank.utils.ts b/utils/PrivateBank.utils.ts index 456e480..dd55bb5 100644 --- a/utils/PrivateBank.utils.ts +++ b/utils/PrivateBank.utils.ts @@ -1,22 +1,11 @@ import crypto from 'crypto' import { bigintToHex, uint8ArrayToBigInt } from './types.utils' import { poseidon } from '@iden3/js-crypto' -import { groth16 } from 'snarkjs' +import { groth16, ProofObject } from 'snarkjs' import { Stringifiable, utils } from 'ffjavascript' import path from 'path' import fs from 'fs' -export type Proof = { - proof: { - pi_a: string[] - pi_b: string[][] - pi_c: string[] - protocol: string - curve: string - } - publicSignals: string[] -} - export const generateDeposit = (seed?: string) => { const secret = randomBigInt(31, seed) const nullifier = randomBigInt(31, seed) @@ -40,20 +29,20 @@ export const randomBigInt = (numBytes: number, seed?: string) => { return bytes } -export const generateProof = async (input: Stringifiable): Promise => { +export const generateProof = async (input: Stringifiable): Promise => { const wasmPath = path.resolve(__dirname, '../build/circuits/withdraw_js/withdraw.wasm') const provingKeyPath = path.resolve(__dirname, '../build/circuits/withdraw.zkey') - const proof = (await groth16.fullProve(input, wasmPath, provingKeyPath)) as Proof + const proof = await groth16.fullProve(input, wasmPath, provingKeyPath) return proof } -export const verifyProof = async (proof: Proof): Promise => { +export const verifyProof = async (proof: ProofObject): Promise => { const verificationKeyPath = path.resolve(__dirname, '../build/circuits/verification_key.json') const verificationKey = JSON.parse(fs.readFileSync(verificationKeyPath, 'utf8')) return await groth16.verify(verificationKey, proof.publicSignals, proof.proof) } -export const toSolidityInput = (proof: Proof) => { +export const toSolidityInput = (proof: ProofObject) => { const result = { proof: utils.stringifyBigInts({ pA: proof.proof.pi_a.slice(0, 2).map((x) => bigintToHex(BigInt(x))), diff --git a/yarn.lock b/yarn.lock index 58cd281..7be5ce3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,6 +9,74 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" + integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.21.1": + version "0.21.1" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.1.tgz#7d1b0060fea407f8301e932492ba8c18aff29713" + integrity sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA== + dependencies: + "@eslint/object-schema" "^2.1.7" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.1.tgz#7d173a1a35fe256f0989a0fdd8d911ebbbf50037" + integrity sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw== + dependencies: + "@eslint/core" "^0.16.0" + +"@eslint/core@^0.16.0": + version "0.16.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.16.0.tgz#490254f275ba9667ddbab344f4f0a6b7a7bd7209" + integrity sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.38.0", "@eslint/js@^9.38.0": + version "9.38.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.38.0.tgz#f7aa9c7577577f53302c1d795643589d7709ebd1" + integrity sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A== + +"@eslint/object-schema@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" + integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== + +"@eslint/plugin-kit@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz#f6a245b42886abf6fc9c7ab7744a932250335ab2" + integrity sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A== + dependencies: + "@eslint/core" "^0.16.0" + levn "^0.4.1" + "@ethereum-waffle/chai@4.0.10": version "4.0.10" resolved "https://registry.npmjs.org/@ethereum-waffle/chai/-/chai-4.0.10.tgz" @@ -558,6 +626,29 @@ optionalDependencies: "@trufflesuite/bigint-buffer" "1.1.9" +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26" + integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.4.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + "@iden3/bigarray@0.0.2": version "0.0.2" resolved "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz" @@ -640,6 +731,27 @@ resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.2.tgz" integrity sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + "@nomicfoundation/edr-darwin-arm64@0.11.3": version "0.11.3" resolved "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.11.3.tgz" @@ -973,6 +1085,16 @@ resolved "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz" integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== +"@types/estree@^1.0.6": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + "@types/level-errors@*": version "3.0.2" resolved "https://registry.npmjs.org/@types/level-errors/-/level-errors-3.0.2.tgz" @@ -1053,6 +1175,104 @@ resolved "https://registry.npmjs.org/@types/snarkjs/-/snarkjs-0.7.9.tgz" integrity sha512-pb4Bq3GI2YQOQOG0dR/YuQs/mqcuL6k/vnz68LIPtpA2frrUL3twf69a3AUK9eUmNNeW0RIKkq6scDlC75Is+g== +"@typescript-eslint/eslint-plugin@8.46.2", "@typescript-eslint/eslint-plugin@^8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz#dc4ab93ee3d7e6c8e38820a0d6c7c93c7183e2dc" + integrity sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w== + dependencies: + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.46.2" + "@typescript-eslint/type-utils" "8.46.2" + "@typescript-eslint/utils" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" + graphemer "^1.4.0" + ignore "^7.0.0" + natural-compare "^1.4.0" + ts-api-utils "^2.1.0" + +"@typescript-eslint/parser@8.46.2", "@typescript-eslint/parser@^8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.46.2.tgz#dd938d45d581ac8ffa9d8a418a50282b306f7ebf" + integrity sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g== + dependencies: + "@typescript-eslint/scope-manager" "8.46.2" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" + debug "^4.3.4" + +"@typescript-eslint/project-service@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.46.2.tgz#ab2f02a0de4da6a7eeb885af5e059be57819d608" + integrity sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.46.2" + "@typescript-eslint/types" "^8.46.2" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz#7d37df2493c404450589acb3b5d0c69cc0670a88" + integrity sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA== + dependencies: + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" + +"@typescript-eslint/tsconfig-utils@8.46.2", "@typescript-eslint/tsconfig-utils@^8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz#d110451cb93bbd189865206ea37ef677c196828c" + integrity sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag== + +"@typescript-eslint/type-utils@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz#802d027864e6fb752e65425ed09f3e089fb4d384" + integrity sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA== + dependencies: + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" + "@typescript-eslint/utils" "8.46.2" + debug "^4.3.4" + ts-api-utils "^2.1.0" + +"@typescript-eslint/types@8.46.2", "@typescript-eslint/types@^8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.46.2.tgz#2bad7348511b31e6e42579820e62b73145635763" + integrity sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ== + +"@typescript-eslint/typescript-estree@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz#ab547a27e4222bb6a3281cb7e98705272e2c7d08" + integrity sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ== + dependencies: + "@typescript-eslint/project-service" "8.46.2" + "@typescript-eslint/tsconfig-utils" "8.46.2" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/visitor-keys" "8.46.2" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.1.0" + +"@typescript-eslint/utils@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.46.2.tgz#b313d33d67f9918583af205bd7bcebf20f231732" + integrity sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg== + dependencies: + "@eslint-community/eslint-utils" "^4.7.0" + "@typescript-eslint/scope-manager" "8.46.2" + "@typescript-eslint/types" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" + +"@typescript-eslint/visitor-keys@8.46.2": + version "8.46.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz#803fa298948c39acf810af21bdce6f8babfa9738" + integrity sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w== + dependencies: + "@typescript-eslint/types" "8.46.2" + eslint-visitor-keys "^4.2.1" + abstract-leveldown@^6.2.1: version "6.3.0" resolved "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz" @@ -1087,6 +1307,11 @@ abstract-leveldown@~6.2.1: level-supports "~1.0.0" xtend "~4.0.0" +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + acorn-walk@^8.1.1: version "8.3.4" resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz" @@ -1094,7 +1319,7 @@ acorn-walk@^8.1.1: dependencies: acorn "^8.11.0" -acorn@^8.11.0, acorn@^8.4.1: +acorn@^8.11.0, acorn@^8.15.0, acorn@^8.4.1: version "8.15.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== @@ -1124,7 +1349,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.12.3: +ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1392,7 +1617,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -braces@~3.0.2: +braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== @@ -1508,6 +1733,11 @@ call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: call-bind-apply-helpers "^1.0.2" get-intrinsic "^1.3.0" +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" @@ -1537,7 +1767,7 @@ chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1746,6 +1976,15 @@ create-require@^1.1.0: resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" @@ -1753,7 +1992,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: +debug@4, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5: version "4.4.3" resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -1784,7 +2023,7 @@ deep-extend@~0.6.0: resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -1957,6 +2196,78 @@ escodegen@^1.8.1: optionalDependencies: source-map "~0.6.1" +eslint-config-prettier@^10.1.8: + version "10.1.8" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" + integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== + +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== + +eslint@^9: + version "9.38.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.38.0.tgz#3957d2af804e5cf6cc503c618f60acc71acb2e7e" + integrity sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw== + dependencies: + "@eslint-community/eslint-utils" "^4.8.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.21.1" + "@eslint/config-helpers" "^0.4.1" + "@eslint/core" "^0.16.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.38.0" + "@eslint/plugin-kit" "^0.4.0" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.4.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== + dependencies: + acorn "^8.15.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.1" + esprima@1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz" @@ -1967,11 +2278,30 @@ esprima@^4.0.1: resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +esquery@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + estraverse@^4.2.0: version "4.3.0" resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" @@ -2140,17 +2470,28 @@ extsprintf@^1.2.0: resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@~2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -2160,6 +2501,13 @@ fastfile@0.0.20: resolved "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz" integrity sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA== +fastq@^1.6.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + dependencies: + reusify "^1.0.4" + fdir@^6.5.0: version "6.5.0" resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" @@ -2192,6 +2540,13 @@ ffjavascript@^0.2.45: wasmcurves "0.2.2" web-worker "1.2.0" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + filelist@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" @@ -2226,11 +2581,24 @@ fixed-merkle-tree@^0.7.3: resolved "https://registry.npmjs.org/fixed-merkle-tree/-/fixed-merkle-tree-0.7.3.tgz" integrity sha512-b50ZBpDfp/Nru120IdeS0IyqbVjOien1OSdWMDdcxS9uVHLV668xndNkEnn9t1WFOvc5aw1owl6l4N8mP5mkKg== +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + flat@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== +flatted@^3.2.9: + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== + follow-redirects@^1.12.1: version "1.15.11" resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz" @@ -2360,13 +2728,20 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob@7.1.7: version "7.1.7" resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" @@ -2390,6 +2765,11 @@ glob@^8.1.0: minimatch "^5.0.1" once "^1.3.0" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" @@ -2400,6 +2780,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6: resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" @@ -2576,6 +2961,16 @@ ieee754@^1.1.13, ieee754@^1.2.1: resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ignore@^5.2.0: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +ignore@^7.0.0: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + immediate@^3.2.3: version "3.3.0" resolved "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz" @@ -2591,6 +2986,19 @@ immutable@^4.0.0-rc.12: resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz" integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== +import-fresh@^3.2.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" @@ -2643,7 +3051,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -2697,6 +3105,11 @@ isarray@~1.0.0: resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + isstream@~0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" @@ -2711,6 +3124,11 @@ jake@^10.8.5: filelist "^1.0.4" picocolors "^1.1.1" +jiti@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.6.1.tgz#178ef2fc9a1a594248c20627cd820187a4d78d92" + integrity sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ== + js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" @@ -2735,6 +3153,11 @@ json-bigint@^1.0.0: dependencies: bignumber.js "^9.0.0" +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" @@ -2745,6 +3168,11 @@ json-schema@0.4.0: resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + json-stream-stringify@^3.1.4: version "3.1.6" resolved "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz" @@ -2807,6 +3235,13 @@ keccak@^3.0.0, keccak@^3.0.2: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + level-codec@^9.0.0: version "9.0.2" resolved "https://registry.npmjs.org/level-codec/-/level-codec-9.0.2.tgz" @@ -2899,6 +3334,14 @@ levelup@^4.3.2: level-supports "~1.0.0" xtend "~4.0.0" +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + levn@~0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" @@ -2919,6 +3362,11 @@ lodash.camelcase@^4.3.0: resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" @@ -2995,6 +3443,11 @@ memorystream@^0.3.1: resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + merkle-patricia-tree@^4.2.2, merkle-patricia-tree@^4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz" @@ -3023,6 +3476,14 @@ micro-packed@~0.7.2: dependencies: "@scure/base" "~1.2.5" +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" @@ -3053,7 +3514,7 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@^3.0.4: +minimatch@^3.0.4, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -3067,6 +3528,13 @@ minimatch@^5.0.1, minimatch@^5.1.6: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.6: version "1.2.8" resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" @@ -3137,6 +3605,11 @@ napi-macros@~2.0.0: resolved "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz" integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" @@ -3213,6 +3686,18 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" @@ -3239,6 +3724,13 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + path-browserify@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" @@ -3254,6 +3746,11 @@ path-is-absolute@^1.0.0: resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + path-parse@^1.0.6: version "1.0.7" resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" @@ -3281,7 +3778,7 @@ picocolors@^1.1.0, picocolors@^1.1.1: resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -3296,6 +3793,11 @@ possible-typed-array-names@^1.0.0: resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" @@ -3345,7 +3847,7 @@ qs@~6.5.2: resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== -queue-microtask@^1.2.3: +queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== @@ -3447,6 +3949,11 @@ require-directory@^2.1.1: resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve@1.17.0: version "1.17.0" resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" @@ -3454,6 +3961,11 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz" @@ -3476,6 +3988,13 @@ rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^5.2.0" +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + rustbn.js@~0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz" @@ -3539,6 +4058,11 @@ semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.6.0: + version "7.7.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" + integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== + serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" @@ -3577,6 +4101,18 @@ sha.js@^2.4.0, sha.js@^2.4.12, sha.js@^2.4.8: safe-buffer "^5.2.1" to-buffer "^1.2.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + side-channel-list@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" @@ -3838,6 +4374,11 @@ tryer@^1.0.1: resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== +ts-api-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" + integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== + ts-command-line-args@^2.2.0: version "2.5.1" resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz" @@ -3894,6 +4435,13 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + type-check@~0.3.2: version "0.3.2" resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" @@ -3941,6 +4489,16 @@ typed-array-buffer@^1.0.3: es-errors "^1.3.0" is-typed-array "^1.1.14" +typescript-eslint@^8.46.2: + version "8.46.2" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.46.2.tgz#da1adec683ba93a1b6c3850a4efb0922ffbc627d" + integrity sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg== + dependencies: + "@typescript-eslint/eslint-plugin" "8.46.2" + "@typescript-eslint/parser" "8.46.2" + "@typescript-eslint/typescript-estree" "8.46.2" + "@typescript-eslint/utils" "8.46.2" + typescript@^5.9.3: version "5.9.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" @@ -4077,6 +4635,13 @@ which-typed-array@^1.1.16: gopd "^1.2.0" has-tostringtag "^1.0.2" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + widest-line@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" @@ -4084,7 +4649,7 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" -word-wrap@~1.2.3: +word-wrap@^1.2.5, word-wrap@~1.2.3: version "1.2.5" resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== From bb0d34d4039411ad4c923cc931ffa13f7a9044bf Mon Sep 17 00:00:00 2001 From: parketh Date: Wed, 22 Oct 2025 12:18:54 +0100 Subject: [PATCH 17/41] update tests --- test/ETHPrivateBank.test.ts | 61 ++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/test/ETHPrivateBank.test.ts b/test/ETHPrivateBank.test.ts index d8f66f4..6862c00 100644 --- a/test/ETHPrivateBank.test.ts +++ b/test/ETHPrivateBank.test.ts @@ -670,6 +670,65 @@ describe('ETHPrivateBank', function () { bigintToHex(poseidon.hash([uint8ArrayToBigInt(deposit1.nullifier)])), inputs.nullifierHash, ]) - console.log(isSpentArray) + expect(isSpentArray).to.deep.equal([false, true]) + }) + + it.skip('gas estimate: deposit() + withdraw()', async () => { + // generate deposit + const deposit = generateDeposit() + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit.commitment) + + // deposit to contract + const tx = await privateBank + .connect(sender) + .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) + const receipt = await tx.wait() + console.log('Gas used - `deposit()`:', receipt.gasUsed.toString()) + + // calculate relayer fee + const gasPrice = await ethers.provider.getGasPrice() + const gasFee = relayerFeeGasUsed.mul(gasPrice) + const relayerFee = DEPOSIT_AMOUNT.mul(relayerFeePct) + .div(relayerFeePctBase) + .add(gasFee) + .toBigInt() + + // generate proof + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([uint8ArrayToBigInt(deposit.nullifier)]), + nullifier: bufferToBigInt(deposit.nullifier), + relayer: relayer.address, + recipient: recipient.address, + relayerFee, + gasRefund, + secret: bufferToBigInt(deposit.secret), + pathElements: tree.path(0).pathElements, + pathIndices: tree.path(0).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + const proofData = await generateProof(input) + const proof = toSolidityInput(proofData) + + // withdraw + const inputs = { + root: padHex(rawInput.root as string), + nullifierHash: bigintToHex(rawInput.nullifierHash), + nullifier: bigintToHex(rawInput.nullifier), + recipient: recipient.address, + relayer: relayer.address, + relayerFee: bigintToHex(rawInput.relayerFee), + gasRefund: bigintToHex(rawInput.gasRefund), + } + const tx2 = await privateBank.connect(relayer).withdraw(proof.proof, inputs) + const receipt2 = await tx2.wait() + console.log('Gas used - `withdraw()`:', receipt2.gasUsed.toString()) }) }) From 8a24f6b7ba44319fa1abe8429261227403db8bdd Mon Sep 17 00:00:00 2001 From: parketh Date: Wed, 22 Oct 2025 14:30:52 +0100 Subject: [PATCH 18/41] add scripts and deploy contracts --- .env.example | 2 + foundry.toml | 3 ++ package.json | 1 + script/DEPLOYMENTS.md | 16 +++++++ script/deploy.s.ts | 100 ++++++++++++++++++++++++++++++++++++++++++ yarn.lock | 5 +++ 6 files changed, 127 insertions(+) create mode 100644 .env.example create mode 100644 script/DEPLOYMENTS.md create mode 100644 script/deploy.s.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..2c45048 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +WALLET_PRIVATE_KEY= +SIMULATE= \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index 21567d0..cf657bc 100644 --- a/foundry.toml +++ b/foundry.toml @@ -2,6 +2,9 @@ src = "src" out = "out" libs = ["lib"] +optimizer = true +optimizer_runs = 100000 +via_ir = false [fmt] tab_width = 2 diff --git a/package.json b/package.json index a6121d9..f0ed3be 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "@typescript-eslint/parser": "^8.46.2", "chai": "^6.2.0", "circomlibjs": "^0.1.7", + "dotenv": "^17.2.3", "eslint": "^9", "eslint-config-prettier": "^10.1.8", "ethereum-waffle": "^4.0.10", diff --git a/script/DEPLOYMENTS.md b/script/DEPLOYMENTS.md new file mode 100644 index 0000000..29ea032 --- /dev/null +++ b/script/DEPLOYMENTS.md @@ -0,0 +1,16 @@ +## Deploy Logs + +### Base Sepolia (dev) - 22 October 2025 14:10 BST + +Deployer balance: 0.01 ETH + +Deploying Verifier contract... +Verifier deployed to: 0x2a1b7eb09a4b57371fa03019c4de7ea2de85bdba + +Deploying ETHPrivateBank (h=24, amt=0.01 ETH) contract... +Transaction sent: 0x1dc504ce19a7cbc48092e99c6bae8f16158c1ab666612d05d962aa4a8ee61082 +Deployed to: 0xb5d11C714381Db9206f3261e9b5BCa6ebc7aC6c4 + +Deploying ETHPrivateBank (h=24, amt=0.1 ETH) contract... +Transaction sent: 0x5d669c676abc2264c881c786025443c7b70b18339e967513f9916cdcb318da93 +Deployed to: 0x343a5F58b507430644662ad1AE55F2239AdC521D \ No newline at end of file diff --git a/script/deploy.s.ts b/script/deploy.s.ts new file mode 100644 index 0000000..72558d6 --- /dev/null +++ b/script/deploy.s.ts @@ -0,0 +1,100 @@ +import fs from 'fs' +import path from 'path' +import { ethers } from 'ethers' +import { config } from 'dotenv' + +config() + +const deployContracts = async () => { + // parse envs + const { WALLET_PRIVATE_KEY, SIMULATE } = parseEnvs() + + // constants + const DEPOSIT_AMOUNTS = [ethers.utils.parseEther('0.01'), ethers.utils.parseEther('0.1')] + const HEIGHT = 24 // merkle tree height + + // setup provider + const provider = new ethers.providers.JsonRpcProvider('https://sepolia.base.org') + const wallet = new ethers.Wallet(WALLET_PRIVATE_KEY, provider) + + // import contracts + const VerifierFactory = await getContractFactory('Verifier', wallet) + const ETHPrivateBankFactory = await getContractFactory('ETHPrivateBank', wallet) + + // print deployer balance + const balance = await wallet.getBalance() + console.log(`Deployer balance: ${ethers.utils.formatEther(balance)} ETH\n`) + + // deploy contracts + const verifier = await sendOrSimulateDeployTx(provider, VerifierFactory, 'Verifier', [], SIMULATE) + for (const depositAmount of DEPOSIT_AMOUNTS) { + await sendOrSimulateDeployTx( + provider, + ETHPrivateBankFactory, + `ETHPrivateBank (h=${HEIGHT}, amt=${ethers.utils.formatEther(depositAmount)} ETH)`, + [ + verifier && !SIMULATE ? verifier.address : ethers.constants.AddressZero, + HEIGHT, + depositAmount, + ], + SIMULATE, + ) + // wait to ensure nonce is incremented + await new Promise((resolve) => setTimeout(resolve, 3000)) + } +} + +const parseEnvs = () => { + const { WALLET_PRIVATE_KEY, SIMULATE } = process.env + if (!WALLET_PRIVATE_KEY) { + throw new Error('WALLET_PRIVATE_KEY is not set') + } + if (!SIMULATE) { + console.warn('SIMULATE is not set, setting it to false') + process.env.SIMULATE = 'false' + } + return { WALLET_PRIVATE_KEY, SIMULATE: SIMULATE === 'true' } +} + +const getContractFactory = async (contractName: string, wallet: ethers.Wallet) => { + const contractFilePath = path.resolve( + __dirname, + `../out/${contractName}.sol/${contractName}.json`, + ) + const contractFile = fs.readFileSync(contractFilePath) + const contract = JSON.parse(contractFile.toString()) + return new ethers.ContractFactory(contract.abi, contract.bytecode, wallet) +} + +const sendOrSimulateDeployTx = async ( + provider: ethers.providers.JsonRpcProvider, + factory: ethers.ContractFactory, + contractName: string, + constructorArgs: ethers.BigNumberish[], + simulate: boolean, +) => { + if (simulate) { + console.log(`Simulating deploy ${contractName}...`) + const deployTx = factory.getDeployTransaction(...constructorArgs) + const gasEstimate = await provider.estimateGas(deployTx) + const gasPrice = await provider.getGasPrice() + const estimatedCost = gasEstimate.mul(gasPrice) + console.log(`Est. gas cost: ${ethers.utils.formatUnits(estimatedCost, 'ether')} ETH\n`) + return null + } else { + console.log(`Deploying ${contractName}...`) + const contract = await factory.deploy(...constructorArgs) + console.log(`Transaction sent: ${contract.deployTransaction.hash}`) + await contract.deployed() + await contract.deployTransaction.wait() + console.log(`Deployed to: ${contract.address}\n`) + return contract + } +} + +deployContracts() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error) + process.exit(1) + }) diff --git a/yarn.lock b/yarn.lock index 7be5ce3..fb5ccb9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2065,6 +2065,11 @@ diff@^5.2.0: resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== +dotenv@^17.2.3: + version "17.2.3" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.3.tgz#ad995d6997f639b11065f419a22fabf567cdb9a2" + integrity sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w== + dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" From c6221000465b29f7518fa1771da426cfd1ef71d3 Mon Sep 17 00:00:00 2001 From: parketh Date: Wed, 22 Oct 2025 14:55:34 +0100 Subject: [PATCH 19/41] chore: fmt --- .prettierrc | 3 ++- .vscode/settings.json | 18 ++++++++++++++ package.json | 3 +++ src/contracts/ERC20PrivateBank.sol | 11 +++++---- src/contracts/ETHPrivateBank.sol | 12 ++++++---- src/contracts/mocks/MockMerkleTree.sol | 2 +- yarn.lock | 33 +++++++++++++++++++++++++- 7 files changed, 70 insertions(+), 12 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.prettierrc b/.prettierrc index 60ee4c3..00d86ce 100644 --- a/.prettierrc +++ b/.prettierrc @@ -4,5 +4,6 @@ "bracketSpacing": true, "semi": false, "printWidth": 100, - "tabWidth": 2 + "tabWidth": 2, + "plugins": ["prettier-plugin-solidity"] } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..44c57f7 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,18 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[solidity]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "prettier.configPath": ".prettierrc", + "solidity.formatter": "prettier" +} diff --git a/package.json b/package.json index f0ed3be..be5154b 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "build:circuit:export:key": "npx snarkjs zkey export verificationkey build/circuits/withdraw.zkey build/circuits/verification_key.json", "build:circuit:export:contract": "npx snarkjs zkey export solidityverifier build/circuits/withdraw.zkey build/circuits/Verifier.sol && sed -i '' 's/Groth16Verifier/Verifier/g' build/circuits/Verifier.sol && cp build/circuits/Verifier.sol src/contracts/Verifier.sol", "build:circuit": "npm run build:circuit:compile && npm run build:circuit:setup && npm run build:circuit:export:key && npm run build:circuit:export:contract", + "build:contract": "forge build", "format:check": "forge fmt --check", "format": "forge fmt", "lint:check": "forge lint --check", @@ -37,6 +38,8 @@ "fixed-merkle-tree": "^0.7.3", "hardhat": "^2.24.2", "jiti": "^2.6.1", + "prettier": "^3.0.0", + "prettier-plugin-solidity": "^2.1.0", "snarkjs": "^0.7.5", "ts-node": "^10.9.2", "typescript": "^5.9.3", diff --git a/src/contracts/ERC20PrivateBank.sol b/src/contracts/ERC20PrivateBank.sol index 8e67c1d..fdf644a 100644 --- a/src/contracts/ERC20PrivateBank.sol +++ b/src/contracts/ERC20PrivateBank.sol @@ -11,9 +11,12 @@ contract ERC20PrivateBank is PrivateBank { using SafeERC20 for IERC20; IERC20 public token; - constructor(IVerifier _verifier, uint32 _height, uint256 _depositAmount, IERC20 _token) - PrivateBank(_verifier, _height, _depositAmount) - { + constructor( + IVerifier _verifier, + uint32 _height, + uint256 _depositAmount, + IERC20 _token + ) PrivateBank(_verifier, _height, _depositAmount) { token = _token; } @@ -35,7 +38,7 @@ contract ERC20PrivateBank is PrivateBank { } if (inputs.gasRefund > 0) { - (bool success,) = inputs.recipient.call{ value: inputs.gasRefund }(''); + (bool success, ) = inputs.recipient.call{ value: inputs.gasRefund }(''); if (!success) { // return refund back to relayer if transfer unsuccessful inputs.relayer.transfer(inputs.gasRefund); diff --git a/src/contracts/ETHPrivateBank.sol b/src/contracts/ETHPrivateBank.sol index aa5587e..9203f82 100644 --- a/src/contracts/ETHPrivateBank.sol +++ b/src/contracts/ETHPrivateBank.sol @@ -12,9 +12,11 @@ import { } from '../Errors.sol'; contract ETHPrivateBank is PrivateBank { - constructor(IVerifier _verifier, uint32 _height, uint256 _depositAmount) - PrivateBank(_verifier, _height, _depositAmount) - { } + constructor( + IVerifier _verifier, + uint32 _height, + uint256 _depositAmount + ) PrivateBank(_verifier, _height, _depositAmount) {} function processDeposit() internal override { if (msg.value != depositAmount) { @@ -31,12 +33,12 @@ contract ETHPrivateBank is PrivateBank { revert GasRefundReceivedForEthWithdraw(); } - (bool success,) = inputs.recipient.call{ value: depositAmount - inputs.relayerFee }(''); + (bool success, ) = inputs.recipient.call{ value: depositAmount - inputs.relayerFee }(''); if (!success) { revert WithdrawFailed(); } if (inputs.relayerFee > 0) { - (success,) = inputs.relayer.call{ value: inputs.relayerFee }(''); + (success, ) = inputs.relayer.call{ value: inputs.relayerFee }(''); if (!success) { revert RelayerFeePaymentFailed(); } diff --git a/src/contracts/mocks/MockMerkleTree.sol b/src/contracts/mocks/MockMerkleTree.sol index 671d8a8..1eba3db 100644 --- a/src/contracts/mocks/MockMerkleTree.sol +++ b/src/contracts/mocks/MockMerkleTree.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.24; import { MerkleTree } from '../MerkleTree.sol'; contract MockMerkleTree is MerkleTree { - constructor(uint32 _height) MerkleTree(_height) { } + constructor(uint32 _height) MerkleTree(_height) {} function insert2(bytes32 _leaf) public returns (uint32) { uint32 index = insert(_leaf); diff --git a/yarn.lock b/yarn.lock index fb5ccb9..9fc5be7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@bytecodealliance/preview2-shim@0.17.2": + version "0.17.2" + resolved "https://registry.yarnpkg.com/@bytecodealliance/preview2-shim/-/preview2-shim-0.17.2.tgz#8d0c732cba29169a85aa3e603c767e039378f89b" + integrity sha512-mNm/lblgES8UkVle8rGImXOz4TtL3eU3inHay/7TVchkKrb/lgcVvTK0+VAw8p5zQ0rgQsXm1j5dOlAAd+MeoA== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" @@ -800,6 +805,13 @@ "@nomicfoundation/edr-linux-x64-musl" "0.11.3" "@nomicfoundation/edr-win32-x64-msvc" "0.11.3" +"@nomicfoundation/slang@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/slang/-/slang-1.2.0.tgz#38a389729bf2bc882b75e3feada9995bedc50091" + integrity sha512-+04Z1RHbbz0ldDbHKQFOzveCdI9Rd3TZZu7fno5hHy3OsqTo9UK5Jgqo68wMvRovCO99POv6oCEyO7+urGeN8Q== + dependencies: + "@bytecodealliance/preview2-shim" "0.17.2" + "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": version "0.1.2" resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz" @@ -1012,6 +1024,11 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" +"@solidity-parser/parser@^0.20.1": + version "0.20.2" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.20.2.tgz#e07053488ed60dae1b54f6fe37bb6d2c5fe146a7" + integrity sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA== + "@trufflesuite/bigint-buffer@1.1.10": version "1.1.10" resolved "https://registry.npmjs.org/@trufflesuite/bigint-buffer/-/bigint-buffer-1.1.10.tgz" @@ -3808,11 +3825,25 @@ prelude-ls@~1.1.2: resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== +prettier-plugin-solidity@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/prettier-plugin-solidity/-/prettier-plugin-solidity-2.1.0.tgz#2298aefc92c5ebd3a0323f98151d2a82f38fc7c6" + integrity sha512-O5HX4/PCE5aqiaEiNGbSRLbSBZQ6kLswAav5LBSewwzhT+sZlN6iAaLZlZcJzPEnIAxwLEHP03xKEg92fflT9Q== + dependencies: + "@nomicfoundation/slang" "1.2.0" + "@solidity-parser/parser" "^0.20.1" + semver "^7.7.2" + prettier@^2.3.1: version "2.8.8" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" + integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" @@ -4063,7 +4094,7 @@ semver@^6.3.0: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.6.0: +semver@^7.6.0, semver@^7.7.2: version "7.7.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== From 01563be92bc1ec2946f94faffc20f2f58ea4718b Mon Sep 17 00:00:00 2001 From: parketh Date: Wed, 22 Oct 2025 14:55:56 +0100 Subject: [PATCH 20/41] refactor Register -> Backup --- src/Errors.sol | 3 --- src/contracts/PrivateBank.sol | 41 +++++++++++++++-------------------- 2 files changed, 18 insertions(+), 26 deletions(-) diff --git a/src/Errors.sol b/src/Errors.sol index 8f0c534..39ca67d 100644 --- a/src/Errors.sol +++ b/src/Errors.sol @@ -10,9 +10,6 @@ error TreeHeightOverflow(uint32 level, uint32 max); /// @notice Merkle tree is full error MerkleTreeFull(); -/// @notice Invalid caller -error InvalidCaller(); - /// @notice Merkle root not found in buffer error InvalidMerkleRoot(); diff --git a/src/contracts/PrivateBank.sol b/src/contracts/PrivateBank.sol index c7f54e0..08e13ef 100644 --- a/src/contracts/PrivateBank.sol +++ b/src/contracts/PrivateBank.sol @@ -6,7 +6,6 @@ import { MerkleTree } from './MerkleTree.sol'; import { IVerifier } from '../interfaces/IVerifier.sol'; import { DepositAmountZero, - InvalidCaller, InvalidMerkleRoot, AlreadySpent, DuplicateCommitment, @@ -57,10 +56,13 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { // EVENTS /////////////////////////// - event Register(address indexed user, bytes publicKey); event Deposit(address indexed user, bytes32 indexed commitment, uint32 index, uint256 timestamp); + event Backup(address indexed user, bytes encryptedData); event Withdraw( - address indexed recipient, address indexed relayer, bytes32 nullifierHash, uint256 fee + address indexed recipient, + address indexed relayer, + bytes32 nullifierHash, + uint256 fee ); /////////////////////////// @@ -79,19 +81,6 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { depositAmount = _depositAmount; } - /// @notice Register public key used to sign commitments for user - /// @param user depositing user - /// @param publicKey public key of keypair used to sign commitments - function register(address user, bytes memory publicKey) public { - if (user != msg.sender) { - revert InvalidCaller(); - } - - // TODO: consider if useful to store mapping publicKey -> user - - emit Register(user, publicKey); - } - /// @notice Deposit funds into the contract /// @param commitment commitment of (nullifier + secret) signed with user's registered public key function deposit(bytes32 commitment) external payable nonReentrant { @@ -115,6 +104,12 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { /// @notice Implemented by child contract function processDeposit() internal virtual; + /// @notice Backup of deposit data encrypted with keypair + /// @param encryptedData secret + nullifier encrypted with backup keypair + function backup(bytes calldata encryptedData) public { + emit Backup(msg.sender, encryptedData); + } + /// @notice Withdraw a deposit by proving ownership of commmitment /// @param proof SNARK proof data /// @param inputs circuit public inputs @@ -131,7 +126,8 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { } // verify proof - if (!verifier.verifyProof( + if ( + !verifier.verifyProof( proof.pA, proof.pB, proof.pC, @@ -143,7 +139,8 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { inputs.relayerFee, inputs.gasRefund ] - )) { + ) + ) { revert InvalidProof(); } @@ -165,11 +162,9 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { } /// @notice Whether a list of deposit has already been spent - function isSpentArray(bytes32[] calldata nullifierHashArray) - external - view - returns (bool[] memory spent) - { + function isSpentArray( + bytes32[] calldata nullifierHashArray + ) external view returns (bool[] memory spent) { spent = new bool[](nullifierHashArray.length); for (uint256 i = 0; i < nullifierHashArray.length; i++) { if (isSpent(nullifierHashArray[i])) { From ba04b2013bda3079c02f3802042b87366fbac3ba Mon Sep 17 00:00:00 2001 From: parketh Date: Wed, 22 Oct 2025 16:16:47 +0100 Subject: [PATCH 21/41] test: add Backup tests + utils --- test/ETHPrivateBank.test.ts | 74 +++++++++++++++++++++++++++++++++++++ tsconfig.json | 2 +- utils/PrivateBank.utils.ts | 10 +++++ utils/aes256.utils.ts | 44 ++++++++++++++++++++++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 utils/aes256.utils.ts diff --git a/test/ETHPrivateBank.test.ts b/test/ETHPrivateBank.test.ts index 6862c00..0f3e642 100644 --- a/test/ETHPrivateBank.test.ts +++ b/test/ETHPrivateBank.test.ts @@ -3,8 +3,10 @@ import { ethers } from 'hardhat' import { generateDeposit, generateProof, + packBackupData, randomBigInt, toSolidityInput, + unpackBackupData, verifyProof, } from '../utils/PrivateBank.utils' import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' @@ -21,6 +23,7 @@ import { } from '../utils/types.utils' import { poseidon } from '@iden3/js-crypto' import { FIELD_P } from '../utils/keccak.utils' +import { decrypt, encrypt, generateEncryptionKey } from '../utils/aes256.utils' describe('ETHPrivateBank', function () { const ZERO = '0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8' @@ -291,6 +294,77 @@ describe('ETHPrivateBank', function () { expect(isSpent).to.be.true }) + it('backup(): should backup note and emit event, be able to withdraw using the note', async () => { + // generate deposit + const deposit = generateDeposit() + + // encrypt backup data + const plainText = packBackupData(deposit.secret, deposit.nullifier) + const encryptionKey = generateEncryptionKey() + const encryptedData = encrypt(encryptionKey, plainText) + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit.commitment) + + // deposit to contract + await expect(privateBank.connect(sender).deposit(deposit.commitment, { value: DEPOSIT_AMOUNT })) + .to.not.be.reverted + + // backup note + const tx = await privateBank.connect(sender).backup(encryptedData) + const receipt = await tx.wait() + const backupEvt = receipt.events[0] + expect(backupEvt.event).to.equal('Backup') + expect(backupEvt.args.user).to.equal(sender.address) + expect(backupEvt.args.encryptedData).to.equal(encryptedData) + + // calculate relayer fee + const gasPrice = await ethers.provider.getGasPrice() + const gasFee = relayerFeeGasUsed.mul(gasPrice) + const relayerFee = DEPOSIT_AMOUNT.mul(relayerFeePct) + .div(relayerFeePctBase) + .add(gasFee) + .toBigInt() + + // retrieve backed up data + const decrypted = decrypt(backupEvt.args.encryptedData, encryptionKey) + const { secret: retrievedSecret, nullifier: retrievedNullifier } = unpackBackupData(decrypted) + + // generate proof + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([retrievedNullifier]), + nullifier: retrievedNullifier, + relayer: relayer.address, + recipient: recipient.address, + relayerFee, + gasRefund, + secret: retrievedSecret, + pathElements: tree.path(0).pathElements, + pathIndices: tree.path(0).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + const proofData = await generateProof(input) + const proof = toSolidityInput(proofData) + + // withdraw + const inputs = { + root: padHex(rawInput.root as string), + nullifierHash: bigintToHex(rawInput.nullifierHash), + nullifier: bigintToHex(rawInput.nullifier), + recipient: recipient.address, + relayer: relayer.address, + relayerFee: bigintToHex(rawInput.relayerFee), + gasRefund: bigintToHex(rawInput.gasRefund), + } + await expect(privateBank.connect(relayer).withdraw(proof.proof, inputs)).to.not.be.reverted + }) + it('withdraw(): should prevent double spend', async () => { // generate deposit const deposit = generateDeposit() diff --git a/tsconfig.json b/tsconfig.json index 0873780..96e1221 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "strict": true, "skipLibCheck": true, "resolveJsonModule": true, - "types": ["chai", "mocha"], + "types": ["node", "chai", "mocha"], "typeRoots": ["./types", "./node_modules/@types"] } } diff --git a/utils/PrivateBank.utils.ts b/utils/PrivateBank.utils.ts index dd55bb5..05ee27a 100644 --- a/utils/PrivateBank.utils.ts +++ b/utils/PrivateBank.utils.ts @@ -16,6 +16,16 @@ export const generateDeposit = (seed?: string) => { return deposit } +export const packBackupData = (secret: Buffer, nullifier: Buffer) => { + return secret.toString('hex').padStart(64, '0') + nullifier.toString('hex').padStart(64, '0') +} + +export const unpackBackupData = (backupData: string) => { + const secret = BigInt('0x' + backupData.slice(0, 64)) + const nullifier = BigInt('0x' + backupData.slice(64, 128)) + return { secret, nullifier } +} + export const randomBigInt = (numBytes: number, seed?: string) => { let bytes: Buffer if (seed) { diff --git a/utils/aes256.utils.ts b/utils/aes256.utils.ts new file mode 100644 index 0000000..8ed573e --- /dev/null +++ b/utils/aes256.utils.ts @@ -0,0 +1,44 @@ +import crypto from 'crypto' + +const KEY_BITS = 256 +const IV_LEN = 16 + +export const generateEncryptionKey = () => { + return crypto.randomBytes(KEY_BITS / 8) +} + +export const encrypt = (encryptionKey: Buffer, plainText: string) => { + const iv = crypto.randomBytes(IV_LEN) + const cipher = crypto.createCipheriv(`aes-${KEY_BITS}-cbc`, encryptionKey, iv) + + let cipherText = cipher.update(plainText, 'utf8', 'hex') + cipherText += cipher.final('hex') + + const ivString = iv.toString('hex') + const encryptedData = `0x${ivString}${cipherText}` + return encryptedData +} + +export const decrypt = (encryptedData: string, encryptionKey: Buffer) => { + const withoutPrefix = encryptedData.startsWith('0x') ? encryptedData.slice(2) : encryptedData + const ivString = withoutPrefix.slice(0, 32) + const cipherText = withoutPrefix.slice(32) + const iv = Buffer.from(ivString, 'hex') + const decipher = crypto.createDecipheriv(`aes-${KEY_BITS}-cbc`, encryptionKey, iv) + let decrypted = decipher.update(cipherText, 'hex', 'utf8') + decrypted += decipher.final('utf8') + return decrypted +} + +// EXAMPLE + +// const example = () => { +// const encryptionKey = generateEncryptionKey() +// const plainText = +// '657cee92c25a700343dbfef8501d5d2952f5f20206f827dac22af39f974ca7b085f978041c8be47cd250821d1512bd9c60576da0f6d42a012c5f75180b02' +// const encryptedData = encrypt(encryptionKey, plainText) +// const decrypted = decrypt(encryptedData, encryptionKey) +// console.log({ decrypted }) +// } + +// example() From 61b3d4d65e768bd47826467e148f004c3d22673c Mon Sep 17 00:00:00 2001 From: parketh Date: Wed, 22 Oct 2025 22:43:15 +0100 Subject: [PATCH 22/41] rm unused timestamp --- src/contracts/PrivateBank.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/contracts/PrivateBank.sol b/src/contracts/PrivateBank.sol index 08e13ef..71e652c 100644 --- a/src/contracts/PrivateBank.sol +++ b/src/contracts/PrivateBank.sol @@ -56,7 +56,7 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { // EVENTS /////////////////////////// - event Deposit(address indexed user, bytes32 indexed commitment, uint32 index, uint256 timestamp); + event Deposit(address indexed user, bytes32 indexed commitment, uint32 index); event Backup(address indexed user, bytes encryptedData); event Withdraw( address indexed recipient, @@ -98,7 +98,7 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { commitments[commitment] = true; // emit event - emit Deposit(msg.sender, commitment, index, block.timestamp); + emit Deposit(msg.sender, commitment, index); } /// @notice Implemented by child contract From 03d7ffaccfee20ef07f40f56b9418acfc8e3928a Mon Sep 17 00:00:00 2001 From: parketh Date: Wed, 22 Oct 2025 22:43:20 +0100 Subject: [PATCH 23/41] update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index a36771d..957cba8 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ Private Money is a modernized fork of Tornado Cash allowing private money transfers on Base. +This repo contains the core contracts and circuits. + ## Setup 1. Install npm dependencies From 1a354550d6fc1a5f93d86a054390027d7bede9ec Mon Sep 17 00:00:00 2001 From: parketh Date: Thu, 23 Oct 2025 00:18:28 +0100 Subject: [PATCH 24/41] remove conflicting types --- package.json | 1 - yarn.lock | 5 ----- 2 files changed, 6 deletions(-) diff --git a/package.json b/package.json index be5154b..398e33f 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,6 @@ "@types/chai": "^5.2.2", "@types/mocha": "^10.0.10", "@types/node": "^24.8.1", - "@types/snarkjs": "^0.7.9", "@typescript-eslint/eslint-plugin": "^8.46.2", "@typescript-eslint/parser": "^8.46.2", "chai": "^6.2.0", diff --git a/yarn.lock b/yarn.lock index 9fc5be7..cb26b95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1187,11 +1187,6 @@ resolved "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-3.0.1.tgz" integrity sha512-giB9gzDeiCeloIXDgzFBCgjj1k4WxcDrZtGl6h1IqmUPlxF+Nx8Ve+96QCyDZ/HseB/uvDsKbpib9hU5cU53pw== -"@types/snarkjs@^0.7.9": - version "0.7.9" - resolved "https://registry.npmjs.org/@types/snarkjs/-/snarkjs-0.7.9.tgz" - integrity sha512-pb4Bq3GI2YQOQOG0dR/YuQs/mqcuL6k/vnz68LIPtpA2frrUL3twf69a3AUK9eUmNNeW0RIKkq6scDlC75Is+g== - "@typescript-eslint/eslint-plugin@8.46.2", "@typescript-eslint/eslint-plugin@^8.46.2": version "8.46.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz#dc4ab93ee3d7e6c8e38820a0d6c7c93c7183e2dc" From e28ac89d0b290af53171f6e848ee3850b9935847 Mon Sep 17 00:00:00 2001 From: parketh Date: Thu, 23 Oct 2025 00:18:53 +0100 Subject: [PATCH 25/41] refactor gen fn --- utils/aes256.utils.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/utils/aes256.utils.ts b/utils/aes256.utils.ts index 8ed573e..8d09f86 100644 --- a/utils/aes256.utils.ts +++ b/utils/aes256.utils.ts @@ -1,10 +1,11 @@ import crypto from 'crypto' +import { randomBigInt } from './PrivateBank.utils' const KEY_BITS = 256 const IV_LEN = 16 -export const generateEncryptionKey = () => { - return crypto.randomBytes(KEY_BITS / 8) +export const generateEncryptionKey = (seed?: string) => { + return randomBigInt(KEY_BITS / 8, seed) } export const encrypt = (encryptionKey: Buffer, plainText: string) => { From 766a5bf0cfff8df532a80bf7ec73a341ffd886c9 Mon Sep 17 00:00:00 2001 From: parketh Date: Thu, 23 Oct 2025 00:36:36 +0100 Subject: [PATCH 26/41] refactor env --- script/deploy.s.ts | 13 +------------ script/env.ts | 11 +++++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 script/env.ts diff --git a/script/deploy.s.ts b/script/deploy.s.ts index 72558d6..114ae8c 100644 --- a/script/deploy.s.ts +++ b/script/deploy.s.ts @@ -2,6 +2,7 @@ import fs from 'fs' import path from 'path' import { ethers } from 'ethers' import { config } from 'dotenv' +import { parseEnvs } from './env' config() @@ -44,18 +45,6 @@ const deployContracts = async () => { } } -const parseEnvs = () => { - const { WALLET_PRIVATE_KEY, SIMULATE } = process.env - if (!WALLET_PRIVATE_KEY) { - throw new Error('WALLET_PRIVATE_KEY is not set') - } - if (!SIMULATE) { - console.warn('SIMULATE is not set, setting it to false') - process.env.SIMULATE = 'false' - } - return { WALLET_PRIVATE_KEY, SIMULATE: SIMULATE === 'true' } -} - const getContractFactory = async (contractName: string, wallet: ethers.Wallet) => { const contractFilePath = path.resolve( __dirname, diff --git a/script/env.ts b/script/env.ts new file mode 100644 index 0000000..3ea6583 --- /dev/null +++ b/script/env.ts @@ -0,0 +1,11 @@ +export const parseEnvs = () => { + const { WALLET_PRIVATE_KEY, SIMULATE } = process.env + if (!WALLET_PRIVATE_KEY) { + throw new Error('WALLET_PRIVATE_KEY is not set') + } + if (!SIMULATE) { + console.warn('SIMULATE is not set, setting it to false') + process.env.SIMULATE = 'false' + } + return { WALLET_PRIVATE_KEY, SIMULATE: SIMULATE === 'true' } +} From bae5d647107a5b93a69719e89f96719ce901e3b3 Mon Sep 17 00:00:00 2001 From: parketh Date: Thu, 23 Oct 2025 00:37:05 +0100 Subject: [PATCH 27/41] setup transfer script --- script/transfer.s.ts | 93 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 script/transfer.s.ts diff --git a/script/transfer.s.ts b/script/transfer.s.ts new file mode 100644 index 0000000..c9d5429 --- /dev/null +++ b/script/transfer.s.ts @@ -0,0 +1,93 @@ +import 'dotenv/config' +import FixedMerkleTree from 'fixed-merkle-tree' +import { encrypt, generateEncryptionKey } from '../utils/aes256.utils' +import { getMiMCSpongeHasher } from '../utils/MiMCSponge.utils' +import { + generateDeposit, + generateProof, + packBackupData, + toSolidityInput, +} from '../utils/PrivateBank.utils' +import { poseidon } from '@iden3/js-crypto' +import { ethers } from 'ethers' +import { + bigintToHex, + bufferToBigInt, + bufferToHex, + padHex, + uint8ArrayToBigInt, +} from '../utils/types.utils' +import { utils } from 'ffjavascript' + +const HEIGHT = 20 +const ZERO = '0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8' +const AMOUNT = ethers.utils.parseEther('0.01') +const RELAYER_FEE_PCT = 25 // 0.025% = `relayerFeePct` / `relayerFeePctBase` +const RELAYER_FEE_PCT_BASE = 10000 +const RELAYER_FEE_GAS_USED = ethers.utils.parseUnits('310000', 'wei') +const GAS_REFUND = BigInt(0) + +const relayer = '0xb5d11C714381Db9206f3261e9b5BCa6ebc7aC6c4' +const recipient = '0x0000000000000000000000000000000000000000' // TODO: add recipient +const index = 0 // TODO: update this if other deposits are made + +const transfer = async () => { + // setup provider + const provider = new ethers.providers.JsonRpcProvider('https://sepolia.base.org') + + // generate deposit + const deposit = generateDeposit('deposit') // use seed + console.log({ commitment: deposit.commitment }) + + // encrypt backup data + const plainText = packBackupData(deposit.secret, deposit.nullifier) + const encryptionKey = generateEncryptionKey('key') // use seed + const encryptedData = encrypt(encryptionKey, plainText) + console.log({ plainText, encryptedData, encryptionKey: bufferToHex(encryptionKey) }) + + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + tree.insert(deposit.commitment) + + // calculate relayer fee + const gasPrice = await provider.getGasPrice() + const gasFee = RELAYER_FEE_GAS_USED.mul(gasPrice) + const relayerFee = AMOUNT.mul(RELAYER_FEE_PCT).div(RELAYER_FEE_PCT_BASE).add(gasFee).toBigInt() + + // generate proof + const rawInput = { + root: tree.root, + nullifierHash: poseidon.hash([uint8ArrayToBigInt(deposit.nullifier)]), + nullifier: bufferToBigInt(deposit.nullifier), + relayer, + recipient, + relayerFee, + gasRefund: GAS_REFUND, + secret: bufferToBigInt(deposit.secret), + pathElements: tree.path(index).pathElements, + pathIndices: tree.path(index).pathIndices, + } + const input = utils.stringifyBigInts(rawInput) + const proofData = await generateProof(input) + const proof = toSolidityInput(proofData) + + // withdraw + const inputs = { + root: padHex(rawInput.root as string), + nullifierHash: bigintToHex(rawInput.nullifierHash), + nullifier: bigintToHex(rawInput.nullifier), + recipient, + relayer, + relayerFee: bigintToHex(rawInput.relayerFee), + gasRefund: bigintToHex(rawInput.gasRefund), + } + console.log({ proof: { ...proof, proof: JSON.stringify(proof.proof) }, inputs }) + + process.exit(0) +} + +transfer() From 5184ae092498ea38bd33af6ff48cbd9dba37ff59 Mon Sep 17 00:00:00 2001 From: parketh Date: Thu, 23 Oct 2025 08:22:41 +0100 Subject: [PATCH 28/41] fix height + redeploy contracts --- circuits/withdraw.circom | 2 +- constants.ts | 2 + script/DEPLOYMENTS.md | 16 ++ script/deploy.s.ts | 8 +- script/env.ts | 8 +- script/transfer.s.ts | 7 +- script/transfer.sh | 26 +++ src/contracts/Verifier.sol | 389 +++++++++++++++++------------------- test/ETHPrivateBank.test.ts | 7 +- 9 files changed, 242 insertions(+), 223 deletions(-) create mode 100644 constants.ts create mode 100644 script/transfer.sh diff --git a/circuits/withdraw.circom b/circuits/withdraw.circom index 0319211..7a14cb9 100644 --- a/circuits/withdraw.circom +++ b/circuits/withdraw.circom @@ -61,4 +61,4 @@ template Withdraw(levels) { gasRefundSquare <== gasRefund * gasRefund; } -component main {public [root, nullifierHash, recipient, relayer, relayerFee, gasRefund]} = Withdraw(20); +component main {public [root, nullifierHash, recipient, relayer, relayerFee, gasRefund]} = Withdraw(24); diff --git a/constants.ts b/constants.ts new file mode 100644 index 0000000..2909da3 --- /dev/null +++ b/constants.ts @@ -0,0 +1,2 @@ +export const HEIGHT = 24 +export const ZERO = '0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8' diff --git a/script/DEPLOYMENTS.md b/script/DEPLOYMENTS.md index 29ea032..04c4411 100644 --- a/script/DEPLOYMENTS.md +++ b/script/DEPLOYMENTS.md @@ -1,5 +1,21 @@ ## Deploy Logs +### Base Sepolia (dev) - 23 October 2025 08:08 BST + +Deployer balance: 0.036857196532137154 ETH + +Deploying Verifier... +Transaction sent: 0x2ea65340376c9ba785b620af0ddc7c73635d50340cd6e3c4415391605d04a4c4 +Deployed to: 0x9B7e8AF4e1f99b053B455002C80ad2cd9a4728e0 + +Deploying ETHPrivateBank (h=24, amt=0.01 ETH)... +Transaction sent: 0xb4c4766f75aba8c7c544665fe5cea593473cfff29e43e5055d96bb8fa46147f5 +Deployed to: 0xB96Ad826389F5FfA508AC259DCB5BeFbd72dc42f + +Deploying ETHPrivateBank (h=24, amt=0.1 ETH)... +Transaction sent: 0x8e2e8eadfc87ac0dec1fcce8891d4098c37fe43b9e2dd4466091385755a145b2 +Deployed to: 0xC818ccCFBCe9999491EebAb8B9125E6aaC9625e0 + ### Base Sepolia (dev) - 22 October 2025 14:10 BST Deployer balance: 0.01 ETH diff --git a/script/deploy.s.ts b/script/deploy.s.ts index 114ae8c..589a070 100644 --- a/script/deploy.s.ts +++ b/script/deploy.s.ts @@ -3,20 +3,20 @@ import path from 'path' import { ethers } from 'ethers' import { config } from 'dotenv' import { parseEnvs } from './env' +import { HEIGHT } from '../constants' config() const deployContracts = async () => { // parse envs - const { WALLET_PRIVATE_KEY, SIMULATE } = parseEnvs() + const { DEPLOYER_PRIVATE_KEY, SIMULATE } = parseEnvs() // constants const DEPOSIT_AMOUNTS = [ethers.utils.parseEther('0.01'), ethers.utils.parseEther('0.1')] - const HEIGHT = 24 // merkle tree height // setup provider const provider = new ethers.providers.JsonRpcProvider('https://sepolia.base.org') - const wallet = new ethers.Wallet(WALLET_PRIVATE_KEY, provider) + const wallet = new ethers.Wallet(DEPLOYER_PRIVATE_KEY, provider) // import contracts const VerifierFactory = await getContractFactory('Verifier', wallet) @@ -28,6 +28,8 @@ const deployContracts = async () => { // deploy contracts const verifier = await sendOrSimulateDeployTx(provider, VerifierFactory, 'Verifier', [], SIMULATE) + // wait to ensure nonce is incremented + await new Promise((resolve) => setTimeout(resolve, 3000)) for (const depositAmount of DEPOSIT_AMOUNTS) { await sendOrSimulateDeployTx( provider, diff --git a/script/env.ts b/script/env.ts index 3ea6583..54fb6f1 100644 --- a/script/env.ts +++ b/script/env.ts @@ -1,11 +1,11 @@ export const parseEnvs = () => { - const { WALLET_PRIVATE_KEY, SIMULATE } = process.env - if (!WALLET_PRIVATE_KEY) { - throw new Error('WALLET_PRIVATE_KEY is not set') + const { DEPLOYER_PRIVATE_KEY, SIMULATE } = process.env + if (!DEPLOYER_PRIVATE_KEY) { + throw new Error('DEPLOYER_PRIVATE_KEY is not set') } if (!SIMULATE) { console.warn('SIMULATE is not set, setting it to false') process.env.SIMULATE = 'false' } - return { WALLET_PRIVATE_KEY, SIMULATE: SIMULATE === 'true' } + return { DEPLOYER_PRIVATE_KEY, SIMULATE: SIMULATE === 'true' } } diff --git a/script/transfer.s.ts b/script/transfer.s.ts index c9d5429..b2a62ae 100644 --- a/script/transfer.s.ts +++ b/script/transfer.s.ts @@ -18,17 +18,16 @@ import { uint8ArrayToBigInt, } from '../utils/types.utils' import { utils } from 'ffjavascript' +import { HEIGHT, ZERO } from '../constants' -const HEIGHT = 20 -const ZERO = '0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8' const AMOUNT = ethers.utils.parseEther('0.01') const RELAYER_FEE_PCT = 25 // 0.025% = `relayerFeePct` / `relayerFeePctBase` const RELAYER_FEE_PCT_BASE = 10000 const RELAYER_FEE_GAS_USED = ethers.utils.parseUnits('310000', 'wei') const GAS_REFUND = BigInt(0) -const relayer = '0xb5d11C714381Db9206f3261e9b5BCa6ebc7aC6c4' -const recipient = '0x0000000000000000000000000000000000000000' // TODO: add recipient +const relayer = '0xbB0dadcC63806bE0f597f05d86051CCFa0Ee17d8' +const recipient = '0xaC3281AeCB096918F2bC75eAe581AbB798459379' const index = 0 // TODO: update this if other deposits are made const transfer = async () => { diff --git a/script/transfer.sh b/script/transfer.sh new file mode 100644 index 0000000..b694a6f --- /dev/null +++ b/script/transfer.sh @@ -0,0 +1,26 @@ +# create accounts +cast wallet new ~/.foundry/keystores pm-deployer-base-sepolia-dev +cast wallet new ~/.foundry/keystores pm-alice-base-sepolia-dev +cast wallet new ~/.foundry/keystores pm-bob-base-sepolia-dev + +# fund them with a faucet +# - https://www.alchemy.com/faucets/base-sepolia +# - https://portal.cdp.coinbase.com/products/faucet?&token=ETH&network=base-sepolia + +# deposit from alice +cast send 0xB96Ad826389F5FfA508AC259DCB5BeFbd72dc42f "deposit(bytes32)" 0x05f8757826367ace948ba691733b005ad249ff7244bb35b41baff9729a18b3b6 --value 0.01ether --rpc-url https://sepolia.base.org --account pm-alice-base-sepolia-dev + +# backup note by alice +cast send 0xB96Ad826389F5FfA508AC259DCB5BeFbd72dc42f "backup(bytes)" 0x55c95039d4f876d17071b0399d394b72505207fbfde58669329fbda7b7296814f13e3057052a3c49fe4cbeecea63b1ccb374bd58ac4191ee8a00f2db964ce6c1e281acf4d594936c7ff01a63a3b601c8037dc14a45df9d170e63ad78cf5d28ade4b7ece6f33beda134305c26dad05e744d1057512ff775beb2482989fe821c8b9ec41ceeb84424b3a7715d573a66a0c7143b1b4fd82d60360070a0811b9cab75 --rpc-url https://sepolia.base.org --account pm-alice-base-sepolia-dev + +# check commitment +cast call 0xB96Ad826389F5FfA508AC259DCB5BeFbd72dc42f "commitments(bytes32)" 0x05f8757826367ace948ba691733b005ad249ff7244bb35b41baff9729a18b3b6 --rpc-url https://sepolia.base.org + +# check merkle root +cast call 0xB96Ad826389F5FfA508AC259DCB5BeFbd72dc42f "getLastRoot()" --rpc-url https://sepolia.base.org + +# withdraw to bob by relayer +cast send 0xB96Ad826389F5FfA508AC259DCB5BeFbd72dc42f "withdraw((uint256[2],uint256[2][2],uint256[2]),(bytes32,bytes32,address,address,uint256,uint256))" "([0x046767ad7a8ccfb990e4454e3692605a100f78a83198a8fe588652190ac5ba96,0x18ef29d953247eae43fbe55c818a1e75ef39b42f156bb965140bb2ea621718aa],[[0x265b89cef2803f6d37cc87f957ba2e86a3f823ebf3c93a75e38b07e2e42e540e,0x19dabd33b9d7a43cd684d70b89d75eccb408c185d68d44c328ba383296ce0cdd],[0x2e7f7b85e0a543e9e54a1a459b6c7e515a168ba8444b90d13e820dfa1f08a1c9,0x1467b388ff74cd1591f6c9aa20b0198e557d5371a16877196f81349380b4dfc5]],[0x1b1c2723c050d4fa788cc7ebedd856c955fd1db3b00595fd4b0cf62b60ebdd92,0x22522620ffd29a22524b47718ba14266305a2919863f49b5d29c67f75a136a72])" "(0x118622d6ea1c876e8bca444550f18d44b6ea4f86ed9d0a178047152120604e5a,0x16e6d5a4c1b49e6486031a53be5927ded6e940072d3fe8e38e0810a9fbff7a19,0xaC3281AeCB096918F2bC75eAe581AbB798459379,0xbB0dadcC63806bE0f597f05d86051CCFa0Ee17d8,0x00000000000000000000000000000000000000000000000000001704f2c2a2f0,0x0000000000000000000000000000000000000000000000000000000000000000)" --rpc-url https://sepolia.base.org --account pm-deployer-base-sepolia-dev + +# decode execution errors +cast 4byte-decode \ No newline at end of file diff --git a/src/contracts/Verifier.sol b/src/contracts/Verifier.sol index dcf085e..666b70f 100644 --- a/src/contracts/Verifier.sol +++ b/src/contracts/Verifier.sol @@ -21,212 +21,183 @@ pragma solidity >=0.7.0 <0.9.0; contract Verifier { - // Scalar field size - uint256 constant r = - 21888242871839275222246405745257275088548364400416034343698204186575808495617; - // Base field size - uint256 constant q = - 21888242871839275222246405745257275088696311157297823662689037894645226208583; - - // Verification Key data - uint256 constant alphax = - 16428432848801857252194528405604668803277877773566238944394625302971855135431; - uint256 constant alphay = - 16846502678714586896801519656441059708016666274385668027902869494772365009666; - uint256 constant betax1 = - 3182164110458002340215786955198810119980427837186618912744689678939861918171; - uint256 constant betax2 = - 16348171800823588416173124589066524623406261996681292662100840445103873053252; - uint256 constant betay1 = - 4920802715848186258981584729175884379674325733638798907835771393452862684714; - uint256 constant betay2 = - 19687132236965066906216944365591810874384658708175106803089633851114028275753; - uint256 constant gammax1 = - 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant gammax2 = - 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant gammay1 = - 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant gammay2 = - 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = - 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant deltax2 = - 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant deltay1 = - 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant deltay2 = - 8495653923123431417604973247489272438418190587263600148770280649306958101930; - - uint256 constant IC0x = - 19345027579055691442232030885585358603661387761211135985107572956835645821424; - uint256 constant IC0y = - 6970734058131104011332651160749990650751392498667137665320645656029949031038; - - uint256 constant IC1x = - 14090489076103670597018116520648535856812238729299721181075397277514784393718; - uint256 constant IC1y = - 17571797013621969995736067140027247406932905556801850515510678415761452802073; - - uint256 constant IC2x = - 4050967825025692193456888093898318244575492240770650835291567617213381285954; - uint256 constant IC2y = - 21493757562808989843905945177884706190858964447230823163868375585722894699543; - - uint256 constant IC3x = - 5112752980131522575116927374094828581157087194474483576327716188957360001977; - uint256 constant IC3y = - 13593038714319541077699488665375854782049057687266926183487979978077858256907; - - uint256 constant IC4x = - 13641957649997242479421402730016051359703541440321045845032306239820608864918; - uint256 constant IC4y = - 15236924403742880579660502380396794016475355429085457791907345970652568972555; - - uint256 constant IC5x = - 474321822140723381328860273216999357723214550487194043528076824713580975455; - uint256 constant IC5y = - 5011919448025533158096087868794277175434873567880624898473259049027906972420; - - uint256 constant IC6x = - 10198416267615844257439351470961284035725279158422282821713285143871066671943; - uint256 constant IC6y = - 13916876023165539688312045497383401714445273306984016241679553491287767202329; - - // Memory data - uint16 constant pVk = 0; - uint16 constant pPairing = 128; - - uint16 constant pLastMem = 896; - - function verifyProof( - uint256[2] calldata _pA, - uint256[2][2] calldata _pB, - uint256[2] calldata _pC, - uint256[6] calldata _pubSignals - ) public view returns (bool) { - assembly { - function checkField(v) { - if iszero(lt(v, r)) { - mstore(0, 0) - return(0, 0x20) - } - } - - // G1 function to multiply a G1 value(x,y) to value in an address - function g1_mulAccC(pR, x, y, s) { - let success - let mIn := mload(0x40) - mstore(mIn, x) - mstore(add(mIn, 32), y) - mstore(add(mIn, 64), s) - - success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) - - if iszero(success) { - mstore(0, 0) - return(0, 0x20) - } - - mstore(add(mIn, 64), mload(pR)) - mstore(add(mIn, 96), mload(add(pR, 32))) - - success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) - - if iszero(success) { - mstore(0, 0) - return(0, 0x20) - } - } - - function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { - let _pPairing := add(pMem, pPairing) - let _pVk := add(pMem, pVk) - - mstore(_pVk, IC0x) - mstore(add(_pVk, 32), IC0y) - - // Compute the linear combination vk_x - - g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) - - g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) - - g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) - - g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) - - g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) - - g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) - - // -A - mstore(_pPairing, calldataload(pA)) - mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) - - // B - mstore(add(_pPairing, 64), calldataload(pB)) - mstore(add(_pPairing, 96), calldataload(add(pB, 32))) - mstore(add(_pPairing, 128), calldataload(add(pB, 64))) - mstore(add(_pPairing, 160), calldataload(add(pB, 96))) - - // alpha1 - mstore(add(_pPairing, 192), alphax) - mstore(add(_pPairing, 224), alphay) - - // beta2 - mstore(add(_pPairing, 256), betax1) - mstore(add(_pPairing, 288), betax2) - mstore(add(_pPairing, 320), betay1) - mstore(add(_pPairing, 352), betay2) - - // vk_x - mstore(add(_pPairing, 384), mload(add(pMem, pVk))) - mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) - - // gamma2 - mstore(add(_pPairing, 448), gammax1) - mstore(add(_pPairing, 480), gammax2) - mstore(add(_pPairing, 512), gammay1) - mstore(add(_pPairing, 544), gammay2) - - // C - mstore(add(_pPairing, 576), calldataload(pC)) - mstore(add(_pPairing, 608), calldataload(add(pC, 32))) - - // delta2 - mstore(add(_pPairing, 640), deltax1) - mstore(add(_pPairing, 672), deltax2) - mstore(add(_pPairing, 704), deltay1) - mstore(add(_pPairing, 736), deltay2) - - let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) - - isOk := and(success, mload(_pPairing)) - } - - let pMem := mload(0x40) - mstore(0x40, add(pMem, pLastMem)) - - // Validate that all evaluations ∈ F - - checkField(calldataload(add(_pubSignals, 0))) - - checkField(calldataload(add(_pubSignals, 32))) - - checkField(calldataload(add(_pubSignals, 64))) - - checkField(calldataload(add(_pubSignals, 96))) - - checkField(calldataload(add(_pubSignals, 128))) - - checkField(calldataload(add(_pubSignals, 160))) - - // Validate all evaluations - let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) - - mstore(0, isValid) - return(0, 0x20) - } - } -} + // Scalar field size + uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + // Base field size + uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + + // Verification Key data + uint256 constant alphax = 16428432848801857252194528405604668803277877773566238944394625302971855135431; + uint256 constant alphay = 16846502678714586896801519656441059708016666274385668027902869494772365009666; + uint256 constant betax1 = 3182164110458002340215786955198810119980427837186618912744689678939861918171; + uint256 constant betax2 = 16348171800823588416173124589066524623406261996681292662100840445103873053252; + uint256 constant betay1 = 4920802715848186258981584729175884379674325733638798907835771393452862684714; + uint256 constant betay2 = 19687132236965066906216944365591810874384658708175106803089633851114028275753; + uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; + + + uint256 constant IC0x = 12529479452956127675024459808848000904790018898984952703960643659294244949246; + uint256 constant IC0y = 5612080593568643575775287946950806237617684639242041674206193259225120194180; + + uint256 constant IC1x = 11057789602510195361853728333022727393098523626947160954187385904434686177425; + uint256 constant IC1y = 9013555119584244552720056691971198858173073519651399374346435789956172554332; + + uint256 constant IC2x = 14144453769368534987694415391067852785707323076053814991509628601451493249771; + uint256 constant IC2y = 456501837803359594243863119332541136550030300478519252251176915936927777123; + + uint256 constant IC3x = 5947717406749211076868983067048996375124029539085789190396254460828498014007; + uint256 constant IC3y = 7576430075376767228173827439481509412237726938986929593973306968142540554335; + + uint256 constant IC4x = 1756237987495175990742866966578041970501757424223442950502861705985864118488; + uint256 constant IC4y = 3733359410038206328839368753513188754563934184126124638525494789549864825956; + + uint256 constant IC5x = 5748960766069636305150692947828999000266820615270351431024295848929129482592; + uint256 constant IC5y = 1855074759978781127911308799924785818051214976250127040406241677253562743548; + + uint256 constant IC6x = 13195752375907490293746853861322041211655630233206715794284363012769140204774; + uint256 constant IC6y = 13331910036265866883222439610157287803090988818663392898569352537457001414197; + + + // Memory data + uint16 constant pVk = 0; + uint16 constant pPairing = 128; + + uint16 constant pLastMem = 896; + + function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[6] calldata _pubSignals) public view returns (bool) { + assembly { + function checkField(v) { + if iszero(lt(v, r)) { + mstore(0, 0) + return(0, 0x20) + } + } + + // G1 function to multiply a G1 value(x,y) to value in an address + function g1_mulAccC(pR, x, y, s) { + let success + let mIn := mload(0x40) + mstore(mIn, x) + mstore(add(mIn, 32), y) + mstore(add(mIn, 64), s) + + success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + + mstore(add(mIn, 64), mload(pR)) + mstore(add(mIn, 96), mload(add(pR, 32))) + + success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + } + + function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { + let _pPairing := add(pMem, pPairing) + let _pVk := add(pMem, pVk) + + mstore(_pVk, IC0x) + mstore(add(_pVk, 32), IC0y) + + // Compute the linear combination vk_x + + g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) + + g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) + + g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) + + g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) + + g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) + + g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) + + + // -A + mstore(_pPairing, calldataload(pA)) + mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) + + // B + mstore(add(_pPairing, 64), calldataload(pB)) + mstore(add(_pPairing, 96), calldataload(add(pB, 32))) + mstore(add(_pPairing, 128), calldataload(add(pB, 64))) + mstore(add(_pPairing, 160), calldataload(add(pB, 96))) + + // alpha1 + mstore(add(_pPairing, 192), alphax) + mstore(add(_pPairing, 224), alphay) + + // beta2 + mstore(add(_pPairing, 256), betax1) + mstore(add(_pPairing, 288), betax2) + mstore(add(_pPairing, 320), betay1) + mstore(add(_pPairing, 352), betay2) + + // vk_x + mstore(add(_pPairing, 384), mload(add(pMem, pVk))) + mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) + + + // gamma2 + mstore(add(_pPairing, 448), gammax1) + mstore(add(_pPairing, 480), gammax2) + mstore(add(_pPairing, 512), gammay1) + mstore(add(_pPairing, 544), gammay2) + + // C + mstore(add(_pPairing, 576), calldataload(pC)) + mstore(add(_pPairing, 608), calldataload(add(pC, 32))) + + // delta2 + mstore(add(_pPairing, 640), deltax1) + mstore(add(_pPairing, 672), deltax2) + mstore(add(_pPairing, 704), deltay1) + mstore(add(_pPairing, 736), deltay2) + + + let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) + + isOk := and(success, mload(_pPairing)) + } + + let pMem := mload(0x40) + mstore(0x40, add(pMem, pLastMem)) + + // Validate that all evaluations ∈ F + + checkField(calldataload(add(_pubSignals, 0))) + + checkField(calldataload(add(_pubSignals, 32))) + + checkField(calldataload(add(_pubSignals, 64))) + + checkField(calldataload(add(_pubSignals, 96))) + + checkField(calldataload(add(_pubSignals, 128))) + + checkField(calldataload(add(_pubSignals, 160))) + + + // Validate all evaluations + let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) + + mstore(0, isValid) + return(0, 0x20) + } + } + } diff --git a/test/ETHPrivateBank.test.ts b/test/ETHPrivateBank.test.ts index 0f3e642..d165512 100644 --- a/test/ETHPrivateBank.test.ts +++ b/test/ETHPrivateBank.test.ts @@ -24,11 +24,10 @@ import { import { poseidon } from '@iden3/js-crypto' import { FIELD_P } from '../utils/keccak.utils' import { decrypt, encrypt, generateEncryptionKey } from '../utils/aes256.utils' +import { HEIGHT, ZERO } from '../constants' describe('ETHPrivateBank', function () { - const ZERO = '0x29319238daf40223d6021718c846ac2a0c0ef028ecc765972e999a8ac79662a8' const DEPOSIT_AMOUNT = ethers.utils.parseEther('1') - const HEIGHT = 20 const relayerFeePct = 25 // 0.025% = `relayerFeePct` / `relayerFeePctBase` const relayerFeePctBase = 10000 const relayerFeeGasUsed = ethers.utils.parseUnits('310000', 'wei') // TODO: update this if contract is updated @@ -218,6 +217,10 @@ describe('ETHPrivateBank', function () { .deposit(deposit.commitment, { value: DEPOSIT_AMOUNT }) await tx.wait() + // check root + const root = await privateBank.getLastRoot() + expect(root).to.equal(tree.root) + // calculate relayer fee const gasPrice = await ethers.provider.getGasPrice() const gasFee = relayerFeeGasUsed.mul(gasPrice) From d030282c30c6bd74f4adbafaa1f54480d2a11b56 Mon Sep 17 00:00:00 2001 From: parketh Date: Thu, 23 Oct 2025 17:55:58 +0100 Subject: [PATCH 29/41] backup leafIndex --- script/transfer.s.ts | 8 ++++---- src/contracts/PrivateBank.sol | 2 +- test/ETHPrivateBank.test.ts | 21 +++++++++++++-------- utils/PrivateBank.utils.ts | 15 ++++++++++----- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/script/transfer.s.ts b/script/transfer.s.ts index b2a62ae..20d4776 100644 --- a/script/transfer.s.ts +++ b/script/transfer.s.ts @@ -28,7 +28,7 @@ const GAS_REFUND = BigInt(0) const relayer = '0xbB0dadcC63806bE0f597f05d86051CCFa0Ee17d8' const recipient = '0xaC3281AeCB096918F2bC75eAe581AbB798459379' -const index = 0 // TODO: update this if other deposits are made +const leafIndex = 0 // TODO: update this if other deposits are made const transfer = async () => { // setup provider @@ -39,7 +39,7 @@ const transfer = async () => { console.log({ commitment: deposit.commitment }) // encrypt backup data - const plainText = packBackupData(deposit.secret, deposit.nullifier) + const plainText = packBackupData(leafIndex, deposit.secret, deposit.nullifier) const encryptionKey = generateEncryptionKey('key') // use seed const encryptedData = encrypt(encryptionKey, plainText) console.log({ plainText, encryptedData, encryptionKey: bufferToHex(encryptionKey) }) @@ -67,8 +67,8 @@ const transfer = async () => { relayerFee, gasRefund: GAS_REFUND, secret: bufferToBigInt(deposit.secret), - pathElements: tree.path(index).pathElements, - pathIndices: tree.path(index).pathIndices, + pathElements: tree.path(leafIndex).pathElements, + pathIndices: tree.path(leafIndex).pathIndices, } const input = utils.stringifyBigInts(rawInput) const proofData = await generateProof(input) diff --git a/src/contracts/PrivateBank.sol b/src/contracts/PrivateBank.sol index 71e652c..0fdb339 100644 --- a/src/contracts/PrivateBank.sol +++ b/src/contracts/PrivateBank.sol @@ -105,7 +105,7 @@ abstract contract PrivateBank is MerkleTree, ReentrancyGuard { function processDeposit() internal virtual; /// @notice Backup of deposit data encrypted with keypair - /// @param encryptedData secret + nullifier encrypted with backup keypair + /// @param encryptedData index + secret + nullifier encrypted with backup keypair function backup(bytes calldata encryptedData) public { emit Backup(msg.sender, encryptedData); } diff --git a/test/ETHPrivateBank.test.ts b/test/ETHPrivateBank.test.ts index d165512..1eee365 100644 --- a/test/ETHPrivateBank.test.ts +++ b/test/ETHPrivateBank.test.ts @@ -301,8 +301,13 @@ describe('ETHPrivateBank', function () { // generate deposit const deposit = generateDeposit() + // deposit to contract + await expect(privateBank.connect(sender).deposit(deposit.commitment, { value: DEPOSIT_AMOUNT })) + .to.not.be.reverted + // encrypt backup data - const plainText = packBackupData(deposit.secret, deposit.nullifier) + const leafIndex = 0 + const plainText = packBackupData(leafIndex, deposit.secret, deposit.nullifier) const encryptionKey = generateEncryptionKey() const encryptedData = encrypt(encryptionKey, plainText) @@ -314,10 +319,6 @@ describe('ETHPrivateBank', function () { }) tree.insert(deposit.commitment) - // deposit to contract - await expect(privateBank.connect(sender).deposit(deposit.commitment, { value: DEPOSIT_AMOUNT })) - .to.not.be.reverted - // backup note const tx = await privateBank.connect(sender).backup(encryptedData) const receipt = await tx.wait() @@ -336,7 +337,11 @@ describe('ETHPrivateBank', function () { // retrieve backed up data const decrypted = decrypt(backupEvt.args.encryptedData, encryptionKey) - const { secret: retrievedSecret, nullifier: retrievedNullifier } = unpackBackupData(decrypted) + const { + leafIndex: retrievedLeafIndex, + secret: retrievedSecret, + nullifier: retrievedNullifier, + } = unpackBackupData(decrypted) // generate proof const rawInput = { @@ -348,8 +353,8 @@ describe('ETHPrivateBank', function () { relayerFee, gasRefund, secret: retrievedSecret, - pathElements: tree.path(0).pathElements, - pathIndices: tree.path(0).pathIndices, + pathElements: tree.path(retrievedLeafIndex).pathElements, + pathIndices: tree.path(retrievedLeafIndex).pathIndices, } const input = utils.stringifyBigInts(rawInput) const proofData = await generateProof(input) diff --git a/utils/PrivateBank.utils.ts b/utils/PrivateBank.utils.ts index 05ee27a..e398cee 100644 --- a/utils/PrivateBank.utils.ts +++ b/utils/PrivateBank.utils.ts @@ -16,14 +16,19 @@ export const generateDeposit = (seed?: string) => { return deposit } -export const packBackupData = (secret: Buffer, nullifier: Buffer) => { - return secret.toString('hex').padStart(64, '0') + nullifier.toString('hex').padStart(64, '0') +export const packBackupData = (leafIndex: number, secret: Buffer, nullifier: Buffer) => { + return ( + leafIndex.toString(16).padStart(8, '0') + // fits max index of 2^32 for tree of max height + secret.toString('hex').padStart(64, '0') + + nullifier.toString('hex').padStart(64, '0') + ) } export const unpackBackupData = (backupData: string) => { - const secret = BigInt('0x' + backupData.slice(0, 64)) - const nullifier = BigInt('0x' + backupData.slice(64, 128)) - return { secret, nullifier } + const leafIndex = parseInt(backupData.slice(0, 8), 16) + const secret = BigInt('0x' + backupData.slice(8, 72)) + const nullifier = BigInt('0x' + backupData.slice(72, 136)) + return { leafIndex, secret, nullifier } } export const randomBigInt = (numBytes: number, seed?: string) => { From b54d486722df5623f927e9c80c98e81fba477653 Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 14:52:47 +0100 Subject: [PATCH 30/41] fix initial root bug --- script/transfer.s.ts | 5 +++++ src/contracts/MerkleTree.sol | 2 +- test/ETHPrivateBank.test.ts | 33 +++++++++++++++++++++++++++++++++ test/MerkleTree.test.ts | 2 +- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/script/transfer.s.ts b/script/transfer.s.ts index 20d4776..f6a1764 100644 --- a/script/transfer.s.ts +++ b/script/transfer.s.ts @@ -50,6 +50,10 @@ const transfer = async () => { hashFunction: hashMiMCSponge, zeroElement: ZERO, }) + console.log({ + initialRoot: tree.root, + height: HEIGHT, + }) tree.insert(deposit.commitment) // calculate relayer fee @@ -70,6 +74,7 @@ const transfer = async () => { pathElements: tree.path(leafIndex).pathElements, pathIndices: tree.path(leafIndex).pathIndices, } + console.log({ rawInput }) const input = utils.stringifyBigInts(rawInput) const proofData = await generateProof(input) const proof = toSolidityInput(proofData) diff --git a/src/contracts/MerkleTree.sol b/src/contracts/MerkleTree.sol index 79300f9..4ed833f 100644 --- a/src/contracts/MerkleTree.sol +++ b/src/contracts/MerkleTree.sol @@ -46,7 +46,7 @@ contract MerkleTree { // init state height = _height; - roots[0] = HasherLib.zeros(_height - 1); + roots[0] = HasherLib.zeros(_height); for (uint32 i = 0; i < _height; i++) { latestHashAtHeight[i] = HasherLib.zeros(i); } diff --git a/test/ETHPrivateBank.test.ts b/test/ETHPrivateBank.test.ts index 1eee365..07a04d7 100644 --- a/test/ETHPrivateBank.test.ts +++ b/test/ETHPrivateBank.test.ts @@ -54,6 +54,39 @@ describe('ETHPrivateBank', function () { ;[sender, recipient, relayer] = await ethers.getSigners() }) + it('constructor(): should init state correctly', async () => { + // setup tree + const hashMiMCSponge = await getMiMCSpongeHasher() + const tree = new FixedMerkleTree(HEIGHT, [], { + hashFunction: hashMiMCSponge, + zeroElement: ZERO, + }) + + // check root matches + const expRoot = padHex(tree.root.toString()) + const root = await privateBank.getLastRoot() + expect(root).to.equal(expRoot) + + const isKnownRoot = await privateBank.isKnownRoot(expRoot) + expect(isKnownRoot).to.be.true + + // check height matches + const height = await privateBank.height() + expect(height).to.equal(HEIGHT) + + // check deposit amount matches + const depositAmount = await privateBank.depositAmount() + expect(depositAmount).to.equal(DEPOSIT_AMOUNT) + + // check next leaf index + const nextLeafIndex = await privateBank.nextLeafIndex() + expect(nextLeafIndex).to.equal(0) + + // check current root index in buffer + const currRootIndex = await privateBank.currRootIndex() + expect(currRootIndex).to.equal(0) + }) + it('deposit(): should process deposit and emit event', async () => { // first deposit const deposit = generateDeposit() diff --git a/test/MerkleTree.test.ts b/test/MerkleTree.test.ts index ccdd5a5..f1f0176 100644 --- a/test/MerkleTree.test.ts +++ b/test/MerkleTree.test.ts @@ -29,7 +29,7 @@ describe('MerkleTree', function () { const hashAtHeight0 = await merkleTree.latestHashAtHeight(0) expect(hashAtHeight0).to.equal(ZERO) - const expRoot = '0x17759758524a3bbf2ce748d4a4178ab6a7a6d252143bda097a0673232a569dfc' + const expRoot = '0x25df1e2387a112355ba3932d0c86491ab0c23d6b8d4257a00bb295b61de3c70b' const root = await merkleTree.roots(0) expect(root).to.equal(expRoot) }) From 0c563d08b06487fa8aee1f90db0f262fec17f206 Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 15:21:59 +0100 Subject: [PATCH 31/41] deploy new contract --- script/DEPLOYMENTS.md | 8 ++++++++ script/deploy.s.ts | 1 + 2 files changed, 9 insertions(+) diff --git a/script/DEPLOYMENTS.md b/script/DEPLOYMENTS.md index 04c4411..cd141ca 100644 --- a/script/DEPLOYMENTS.md +++ b/script/DEPLOYMENTS.md @@ -1,5 +1,13 @@ ## Deploy Logs +### Base Sepolia (dev) - 24 October 2025 15:21 BST + +Deployer balance: 0.020130233963503097 ETH + +Deploying ETHPrivateBank (h=24, amt=0.1 ETH)... +Transaction sent: 0x23969c91f0eea072bbe64f118656ba70373537d8eb573c137558b108e990ca2f +Deployed to: 0xd2042C17F70C225547e51d4D05198B31c92F04De + ### Base Sepolia (dev) - 23 October 2025 08:08 BST Deployer balance: 0.036857196532137154 ETH diff --git a/script/deploy.s.ts b/script/deploy.s.ts index 589a070..a4f1ce4 100644 --- a/script/deploy.s.ts +++ b/script/deploy.s.ts @@ -37,6 +37,7 @@ const deployContracts = async () => { `ETHPrivateBank (h=${HEIGHT}, amt=${ethers.utils.formatEther(depositAmount)} ETH)`, [ verifier && !SIMULATE ? verifier.address : ethers.constants.AddressZero, + // '0x9B7e8AF4e1f99b053B455002C80ad2cd9a4728e0', HEIGHT, depositAmount, ], From b6978f748bed2ecc6caa1ea5e6be7f9bac5c5a19 Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 15:28:03 +0100 Subject: [PATCH 32/41] redeploy --- script/DEPLOYMENTS.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/script/DEPLOYMENTS.md b/script/DEPLOYMENTS.md index cd141ca..9a0b7d3 100644 --- a/script/DEPLOYMENTS.md +++ b/script/DEPLOYMENTS.md @@ -2,11 +2,11 @@ ### Base Sepolia (dev) - 24 October 2025 15:21 BST -Deployer balance: 0.020130233963503097 ETH +Deployer balance: 0.012088735056057486 ETH Deploying ETHPrivateBank (h=24, amt=0.1 ETH)... -Transaction sent: 0x23969c91f0eea072bbe64f118656ba70373537d8eb573c137558b108e990ca2f -Deployed to: 0xd2042C17F70C225547e51d4D05198B31c92F04De +Transaction sent: 0x9790a1c5a115263304f38376750f82db8f49f6b8ee279760a251fb4019957bc9 +Deployed to: 0x69334A445A4bC2d6Ada25148A8CDea3B4001472b ### Base Sepolia (dev) - 23 October 2025 08:08 BST From 13de7afc0fbd8dc562a269d0185ed4aeb0c3e851 Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 18:38:13 +0100 Subject: [PATCH 33/41] update readme instructions --- README.md | 14 ++++++++++---- package.json | 1 + 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 957cba8..a295749 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ This repo contains the core contracts and circuits. 1. Install npm dependencies ```bash -yarn install +yarn ``` 2. Install `circom` (note: requires `rust`) @@ -40,11 +40,17 @@ The `withdraw` circuit has 27.4k constraints, so we use the `ppot_0080_15.ptau` To download the file, run: ```bash -yarn run setup +yarn setup ``` -5. Build circuits +5. Build circuits and contracts ```bash -yarn run build:circuit +yarn build +``` + +7. Run tests + +```bash +yarn test ``` \ No newline at end of file diff --git a/package.json b/package.json index 398e33f..0acb8eb 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "build:circuit:export:contract": "npx snarkjs zkey export solidityverifier build/circuits/withdraw.zkey build/circuits/Verifier.sol && sed -i '' 's/Groth16Verifier/Verifier/g' build/circuits/Verifier.sol && cp build/circuits/Verifier.sol src/contracts/Verifier.sol", "build:circuit": "npm run build:circuit:compile && npm run build:circuit:setup && npm run build:circuit:export:key && npm run build:circuit:export:contract", "build:contract": "forge build", + "build": "npm run build:circuit && npm run build:contract", "format:check": "forge fmt --check", "format": "forge fmt", "lint:check": "forge lint --check", From b7bd358f0717fde35bf84b4a1e45262947bb7e15 Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 18:50:09 +0100 Subject: [PATCH 34/41] fix ci + format --- .github/workflows/test.yml | 14 +- .prettierignore | 7 +- .prettierrc | 2 +- README.md | 2 +- foundry.toml | 8 - package.json | 4 +- script/DEPLOYMENTS.md | 2 +- src/contracts/Verifier.sol | 359 ++++++++++++++++++------------------- 8 files changed, 197 insertions(+), 201 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c24b983..a3b9e4e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ env: jobs: check: - name: Foundry project + name: Build contracts and run tests runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 @@ -27,11 +27,11 @@ jobs: - name: Show Forge version run: forge --version - - name: Run Forge fmt - run: forge fmt --check + - name: Check formatting + run: yarn format:check - - name: Run Forge build - run: forge build --sizes + - name: Build contracts + run: yarn build - - name: Run Forge tests - run: forge test -vvv + - name: Run tests + run: yarn test diff --git a/.prettierignore b/.prettierignore index c795b05..434f928 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,6 @@ -build \ No newline at end of file +build +cache +lib +artifacts +out +node_modules \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 00d86ce..c34f844 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,7 +3,7 @@ "trailingComma": "all", "bracketSpacing": true, "semi": false, - "printWidth": 100, + "printWidth": 120, "tabWidth": 2, "plugins": ["prettier-plugin-solidity"] } diff --git a/README.md b/README.md index a295749..1fd3c71 100644 --- a/README.md +++ b/README.md @@ -53,4 +53,4 @@ yarn build ```bash yarn test -``` \ No newline at end of file +``` diff --git a/foundry.toml b/foundry.toml index cf657bc..1981a63 100644 --- a/foundry.toml +++ b/foundry.toml @@ -6,12 +6,4 @@ optimizer = true optimizer_runs = 100000 via_ir = false -[fmt] -tab_width = 2 -bracket_spacing = true -line_length = 100 -single_line_statement_blocks = "multi" -quote_style = "single" -number_underscore = "preserve" - # See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/package.json b/package.json index 0acb8eb..803e04d 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "build:circuit": "npm run build:circuit:compile && npm run build:circuit:setup && npm run build:circuit:export:key && npm run build:circuit:export:contract", "build:contract": "forge build", "build": "npm run build:circuit && npm run build:contract", - "format:check": "forge fmt --check", - "format": "forge fmt", + "format:check": "npx prettier --check .", + "format": "npx prettier --write .", "lint:check": "forge lint --check", "lint": "forge lint", "test": "npx hardhat test" diff --git a/script/DEPLOYMENTS.md b/script/DEPLOYMENTS.md index 9a0b7d3..d80f266 100644 --- a/script/DEPLOYMENTS.md +++ b/script/DEPLOYMENTS.md @@ -37,4 +37,4 @@ Deployed to: 0xb5d11C714381Db9206f3261e9b5BCa6ebc7aC6c4 Deploying ETHPrivateBank (h=24, amt=0.1 ETH) contract... Transaction sent: 0x5d669c676abc2264c881c786025443c7b70b18339e967513f9916cdcb318da93 -Deployed to: 0x343a5F58b507430644662ad1AE55F2239AdC521D \ No newline at end of file +Deployed to: 0x343a5F58b507430644662ad1AE55F2239AdC521D diff --git a/src/contracts/Verifier.sol b/src/contracts/Verifier.sol index 666b70f..83bccec 100644 --- a/src/contracts/Verifier.sol +++ b/src/contracts/Verifier.sol @@ -21,183 +21,182 @@ pragma solidity >=0.7.0 <0.9.0; contract Verifier { - // Scalar field size - uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; - // Base field size - uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; - - // Verification Key data - uint256 constant alphax = 16428432848801857252194528405604668803277877773566238944394625302971855135431; - uint256 constant alphay = 16846502678714586896801519656441059708016666274385668027902869494772365009666; - uint256 constant betax1 = 3182164110458002340215786955198810119980427837186618912744689678939861918171; - uint256 constant betax2 = 16348171800823588416173124589066524623406261996681292662100840445103873053252; - uint256 constant betay1 = 4920802715848186258981584729175884379674325733638798907835771393452862684714; - uint256 constant betay2 = 19687132236965066906216944365591810874384658708175106803089633851114028275753; - uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - - - uint256 constant IC0x = 12529479452956127675024459808848000904790018898984952703960643659294244949246; - uint256 constant IC0y = 5612080593568643575775287946950806237617684639242041674206193259225120194180; - - uint256 constant IC1x = 11057789602510195361853728333022727393098523626947160954187385904434686177425; - uint256 constant IC1y = 9013555119584244552720056691971198858173073519651399374346435789956172554332; - - uint256 constant IC2x = 14144453769368534987694415391067852785707323076053814991509628601451493249771; - uint256 constant IC2y = 456501837803359594243863119332541136550030300478519252251176915936927777123; - - uint256 constant IC3x = 5947717406749211076868983067048996375124029539085789190396254460828498014007; - uint256 constant IC3y = 7576430075376767228173827439481509412237726938986929593973306968142540554335; - - uint256 constant IC4x = 1756237987495175990742866966578041970501757424223442950502861705985864118488; - uint256 constant IC4y = 3733359410038206328839368753513188754563934184126124638525494789549864825956; - - uint256 constant IC5x = 5748960766069636305150692947828999000266820615270351431024295848929129482592; - uint256 constant IC5y = 1855074759978781127911308799924785818051214976250127040406241677253562743548; - - uint256 constant IC6x = 13195752375907490293746853861322041211655630233206715794284363012769140204774; - uint256 constant IC6y = 13331910036265866883222439610157287803090988818663392898569352537457001414197; - - - // Memory data - uint16 constant pVk = 0; - uint16 constant pPairing = 128; - - uint16 constant pLastMem = 896; - - function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[6] calldata _pubSignals) public view returns (bool) { - assembly { - function checkField(v) { - if iszero(lt(v, r)) { - mstore(0, 0) - return(0, 0x20) - } - } - - // G1 function to multiply a G1 value(x,y) to value in an address - function g1_mulAccC(pR, x, y, s) { - let success - let mIn := mload(0x40) - mstore(mIn, x) - mstore(add(mIn, 32), y) - mstore(add(mIn, 64), s) - - success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) - - if iszero(success) { - mstore(0, 0) - return(0, 0x20) - } - - mstore(add(mIn, 64), mload(pR)) - mstore(add(mIn, 96), mload(add(pR, 32))) - - success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) - - if iszero(success) { - mstore(0, 0) - return(0, 0x20) - } - } - - function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { - let _pPairing := add(pMem, pPairing) - let _pVk := add(pMem, pVk) - - mstore(_pVk, IC0x) - mstore(add(_pVk, 32), IC0y) - - // Compute the linear combination vk_x - - g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) - - g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) - - g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) - - g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) - - g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) - - g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) - - - // -A - mstore(_pPairing, calldataload(pA)) - mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) - - // B - mstore(add(_pPairing, 64), calldataload(pB)) - mstore(add(_pPairing, 96), calldataload(add(pB, 32))) - mstore(add(_pPairing, 128), calldataload(add(pB, 64))) - mstore(add(_pPairing, 160), calldataload(add(pB, 96))) - - // alpha1 - mstore(add(_pPairing, 192), alphax) - mstore(add(_pPairing, 224), alphay) - - // beta2 - mstore(add(_pPairing, 256), betax1) - mstore(add(_pPairing, 288), betax2) - mstore(add(_pPairing, 320), betay1) - mstore(add(_pPairing, 352), betay2) - - // vk_x - mstore(add(_pPairing, 384), mload(add(pMem, pVk))) - mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) - - - // gamma2 - mstore(add(_pPairing, 448), gammax1) - mstore(add(_pPairing, 480), gammax2) - mstore(add(_pPairing, 512), gammay1) - mstore(add(_pPairing, 544), gammay2) - - // C - mstore(add(_pPairing, 576), calldataload(pC)) - mstore(add(_pPairing, 608), calldataload(add(pC, 32))) - - // delta2 - mstore(add(_pPairing, 640), deltax1) - mstore(add(_pPairing, 672), deltax2) - mstore(add(_pPairing, 704), deltay1) - mstore(add(_pPairing, 736), deltay2) - - - let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) - - isOk := and(success, mload(_pPairing)) - } - - let pMem := mload(0x40) - mstore(0x40, add(pMem, pLastMem)) - - // Validate that all evaluations ∈ F - - checkField(calldataload(add(_pubSignals, 0))) - - checkField(calldataload(add(_pubSignals, 32))) - - checkField(calldataload(add(_pubSignals, 64))) - - checkField(calldataload(add(_pubSignals, 96))) - - checkField(calldataload(add(_pubSignals, 128))) - - checkField(calldataload(add(_pubSignals, 160))) - - - // Validate all evaluations - let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) - - mstore(0, isValid) - return(0, 0x20) - } - } - } + // Scalar field size + uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + // Base field size + uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + + // Verification Key data + uint256 constant alphax = 16428432848801857252194528405604668803277877773566238944394625302971855135431; + uint256 constant alphay = 16846502678714586896801519656441059708016666274385668027902869494772365009666; + uint256 constant betax1 = 3182164110458002340215786955198810119980427837186618912744689678939861918171; + uint256 constant betax2 = 16348171800823588416173124589066524623406261996681292662100840445103873053252; + uint256 constant betay1 = 4920802715848186258981584729175884379674325733638798907835771393452862684714; + uint256 constant betay2 = 19687132236965066906216944365591810874384658708175106803089633851114028275753; + uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; + + uint256 constant IC0x = 12529479452956127675024459808848000904790018898984952703960643659294244949246; + uint256 constant IC0y = 5612080593568643575775287946950806237617684639242041674206193259225120194180; + + uint256 constant IC1x = 11057789602510195361853728333022727393098523626947160954187385904434686177425; + uint256 constant IC1y = 9013555119584244552720056691971198858173073519651399374346435789956172554332; + + uint256 constant IC2x = 14144453769368534987694415391067852785707323076053814991509628601451493249771; + uint256 constant IC2y = 456501837803359594243863119332541136550030300478519252251176915936927777123; + + uint256 constant IC3x = 5947717406749211076868983067048996375124029539085789190396254460828498014007; + uint256 constant IC3y = 7576430075376767228173827439481509412237726938986929593973306968142540554335; + + uint256 constant IC4x = 1756237987495175990742866966578041970501757424223442950502861705985864118488; + uint256 constant IC4y = 3733359410038206328839368753513188754563934184126124638525494789549864825956; + + uint256 constant IC5x = 5748960766069636305150692947828999000266820615270351431024295848929129482592; + uint256 constant IC5y = 1855074759978781127911308799924785818051214976250127040406241677253562743548; + + uint256 constant IC6x = 13195752375907490293746853861322041211655630233206715794284363012769140204774; + uint256 constant IC6y = 13331910036265866883222439610157287803090988818663392898569352537457001414197; + + // Memory data + uint16 constant pVk = 0; + uint16 constant pPairing = 128; + + uint16 constant pLastMem = 896; + + function verifyProof( + uint256[2] calldata _pA, + uint256[2][2] calldata _pB, + uint256[2] calldata _pC, + uint256[6] calldata _pubSignals + ) public view returns (bool) { + assembly { + function checkField(v) { + if iszero(lt(v, r)) { + mstore(0, 0) + return(0, 0x20) + } + } + + // G1 function to multiply a G1 value(x,y) to value in an address + function g1_mulAccC(pR, x, y, s) { + let success + let mIn := mload(0x40) + mstore(mIn, x) + mstore(add(mIn, 32), y) + mstore(add(mIn, 64), s) + + success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + + mstore(add(mIn, 64), mload(pR)) + mstore(add(mIn, 96), mload(add(pR, 32))) + + success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + } + + function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { + let _pPairing := add(pMem, pPairing) + let _pVk := add(pMem, pVk) + + mstore(_pVk, IC0x) + mstore(add(_pVk, 32), IC0y) + + // Compute the linear combination vk_x + + g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) + + g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) + + g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) + + g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) + + g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) + + g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) + + // -A + mstore(_pPairing, calldataload(pA)) + mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) + + // B + mstore(add(_pPairing, 64), calldataload(pB)) + mstore(add(_pPairing, 96), calldataload(add(pB, 32))) + mstore(add(_pPairing, 128), calldataload(add(pB, 64))) + mstore(add(_pPairing, 160), calldataload(add(pB, 96))) + + // alpha1 + mstore(add(_pPairing, 192), alphax) + mstore(add(_pPairing, 224), alphay) + + // beta2 + mstore(add(_pPairing, 256), betax1) + mstore(add(_pPairing, 288), betax2) + mstore(add(_pPairing, 320), betay1) + mstore(add(_pPairing, 352), betay2) + + // vk_x + mstore(add(_pPairing, 384), mload(add(pMem, pVk))) + mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) + + // gamma2 + mstore(add(_pPairing, 448), gammax1) + mstore(add(_pPairing, 480), gammax2) + mstore(add(_pPairing, 512), gammay1) + mstore(add(_pPairing, 544), gammay2) + + // C + mstore(add(_pPairing, 576), calldataload(pC)) + mstore(add(_pPairing, 608), calldataload(add(pC, 32))) + + // delta2 + mstore(add(_pPairing, 640), deltax1) + mstore(add(_pPairing, 672), deltax2) + mstore(add(_pPairing, 704), deltay1) + mstore(add(_pPairing, 736), deltay2) + + let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) + + isOk := and(success, mload(_pPairing)) + } + + let pMem := mload(0x40) + mstore(0x40, add(pMem, pLastMem)) + + // Validate that all evaluations ∈ F + + checkField(calldataload(add(_pubSignals, 0))) + + checkField(calldataload(add(_pubSignals, 32))) + + checkField(calldataload(add(_pubSignals, 64))) + + checkField(calldataload(add(_pubSignals, 96))) + + checkField(calldataload(add(_pubSignals, 128))) + + checkField(calldataload(add(_pubSignals, 160))) + + // Validate all evaluations + let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) + + mstore(0, isValid) + return(0, 0x20) + } + } +} From b08ae1e4fc0457e070e6066a7ac671b0a9e15427 Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 18:51:20 +0100 Subject: [PATCH 35/41] formatting --- .prettierrc | 2 +- src/contracts/Verifier.sol | 104 ++++++++++++++++++++++++------------- 2 files changed, 68 insertions(+), 38 deletions(-) diff --git a/.prettierrc b/.prettierrc index c34f844..00d86ce 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,7 +3,7 @@ "trailingComma": "all", "bracketSpacing": true, "semi": false, - "printWidth": 120, + "printWidth": 100, "tabWidth": 2, "plugins": ["prettier-plugin-solidity"] } diff --git a/src/contracts/Verifier.sol b/src/contracts/Verifier.sol index 83bccec..5725d7f 100644 --- a/src/contracts/Verifier.sol +++ b/src/contracts/Verifier.sol @@ -22,46 +22,76 @@ pragma solidity >=0.7.0 <0.9.0; contract Verifier { // Scalar field size - uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + uint256 constant r = + 21888242871839275222246405745257275088548364400416034343698204186575808495617; // Base field size - uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + uint256 constant q = + 21888242871839275222246405745257275088696311157297823662689037894645226208583; // Verification Key data - uint256 constant alphax = 16428432848801857252194528405604668803277877773566238944394625302971855135431; - uint256 constant alphay = 16846502678714586896801519656441059708016666274385668027902869494772365009666; - uint256 constant betax1 = 3182164110458002340215786955198810119980427837186618912744689678939861918171; - uint256 constant betax2 = 16348171800823588416173124589066524623406261996681292662100840445103873053252; - uint256 constant betay1 = 4920802715848186258981584729175884379674325733638798907835771393452862684714; - uint256 constant betay2 = 19687132236965066906216944365591810874384658708175106803089633851114028275753; - uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; - uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; - uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; - uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - - uint256 constant IC0x = 12529479452956127675024459808848000904790018898984952703960643659294244949246; - uint256 constant IC0y = 5612080593568643575775287946950806237617684639242041674206193259225120194180; - - uint256 constant IC1x = 11057789602510195361853728333022727393098523626947160954187385904434686177425; - uint256 constant IC1y = 9013555119584244552720056691971198858173073519651399374346435789956172554332; - - uint256 constant IC2x = 14144453769368534987694415391067852785707323076053814991509628601451493249771; - uint256 constant IC2y = 456501837803359594243863119332541136550030300478519252251176915936927777123; - - uint256 constant IC3x = 5947717406749211076868983067048996375124029539085789190396254460828498014007; - uint256 constant IC3y = 7576430075376767228173827439481509412237726938986929593973306968142540554335; - - uint256 constant IC4x = 1756237987495175990742866966578041970501757424223442950502861705985864118488; - uint256 constant IC4y = 3733359410038206328839368753513188754563934184126124638525494789549864825956; - - uint256 constant IC5x = 5748960766069636305150692947828999000266820615270351431024295848929129482592; - uint256 constant IC5y = 1855074759978781127911308799924785818051214976250127040406241677253562743548; - - uint256 constant IC6x = 13195752375907490293746853861322041211655630233206715794284363012769140204774; - uint256 constant IC6y = 13331910036265866883222439610157287803090988818663392898569352537457001414197; + uint256 constant alphax = + 16428432848801857252194528405604668803277877773566238944394625302971855135431; + uint256 constant alphay = + 16846502678714586896801519656441059708016666274385668027902869494772365009666; + uint256 constant betax1 = + 3182164110458002340215786955198810119980427837186618912744689678939861918171; + uint256 constant betax2 = + 16348171800823588416173124589066524623406261996681292662100840445103873053252; + uint256 constant betay1 = + 4920802715848186258981584729175884379674325733638798907835771393452862684714; + uint256 constant betay2 = + 19687132236965066906216944365591810874384658708175106803089633851114028275753; + uint256 constant gammax1 = + 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant gammax2 = + 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant gammay1 = + 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant gammay2 = + 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant deltax1 = + 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant deltax2 = + 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant deltay1 = + 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant deltay2 = + 8495653923123431417604973247489272438418190587263600148770280649306958101930; + + uint256 constant IC0x = + 12529479452956127675024459808848000904790018898984952703960643659294244949246; + uint256 constant IC0y = + 5612080593568643575775287946950806237617684639242041674206193259225120194180; + + uint256 constant IC1x = + 11057789602510195361853728333022727393098523626947160954187385904434686177425; + uint256 constant IC1y = + 9013555119584244552720056691971198858173073519651399374346435789956172554332; + + uint256 constant IC2x = + 14144453769368534987694415391067852785707323076053814991509628601451493249771; + uint256 constant IC2y = + 456501837803359594243863119332541136550030300478519252251176915936927777123; + + uint256 constant IC3x = + 5947717406749211076868983067048996375124029539085789190396254460828498014007; + uint256 constant IC3y = + 7576430075376767228173827439481509412237726938986929593973306968142540554335; + + uint256 constant IC4x = + 1756237987495175990742866966578041970501757424223442950502861705985864118488; + uint256 constant IC4y = + 3733359410038206328839368753513188754563934184126124638525494789549864825956; + + uint256 constant IC5x = + 5748960766069636305150692947828999000266820615270351431024295848929129482592; + uint256 constant IC5y = + 1855074759978781127911308799924785818051214976250127040406241677253562743548; + + uint256 constant IC6x = + 13195752375907490293746853861322041211655630233206715794284363012769140204774; + uint256 constant IC6y = + 13331910036265866883222439610157287803090988818663392898569352537457001414197; // Memory data uint16 constant pVk = 0; From 4d486713bd6691e8d70d0b4f187842e342e73c3c Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 18:52:44 +0100 Subject: [PATCH 36/41] remove ci for push --- .github/workflows/test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a3b9e4e..5d74382 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,6 +5,7 @@ permissions: on: push: + branches: [main] pull_request: workflow_dispatch: From 78ac74778dbb8aef4fe7fa5f8436b03a1d47b1f9 Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 18:55:20 +0100 Subject: [PATCH 37/41] fix ci --- .github/workflows/test.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5d74382..a0c5b83 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,6 +28,16 @@ jobs: - name: Show Forge version run: forge --version + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '23' + cache: 'yarn' + cache-dependency-path: yarn.lock + + - name: Install dependencies + run: yarn + - name: Check formatting run: yarn format:check From c8329b2dee035543ecdc5c56fe848fcfd57a9683 Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 18:58:20 +0100 Subject: [PATCH 38/41] fix ci --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 803e04d..291e97f 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "build:circuit": "npm run build:circuit:compile && npm run build:circuit:setup && npm run build:circuit:export:key && npm run build:circuit:export:contract", "build:contract": "forge build", "build": "npm run build:circuit && npm run build:contract", - "format:check": "npx prettier --check .", - "format": "npx prettier --write .", + "format:check": "prettier --check .", + "format": "prettier --write .", "lint:check": "forge lint --check", "lint": "forge lint", "test": "npx hardhat test" From 83f336fec0f1a98bcc486fbb713671f366caf562 Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 18:59:17 +0100 Subject: [PATCH 39/41] fix test --- test/ETHPrivateBank.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/ETHPrivateBank.test.ts b/test/ETHPrivateBank.test.ts index 07a04d7..f61f615 100644 --- a/test/ETHPrivateBank.test.ts +++ b/test/ETHPrivateBank.test.ts @@ -252,7 +252,7 @@ describe('ETHPrivateBank', function () { // check root const root = await privateBank.getLastRoot() - expect(root).to.equal(tree.root) + expect(root).to.equal(padHex(tree.root.toString())) // calculate relayer fee const gasPrice = await ethers.provider.getGasPrice() From b2844c878589808b45873d01bd5ad30adb151067 Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 19:01:18 +0100 Subject: [PATCH 40/41] fix ci --- .github/workflows/test.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a0c5b83..b1bf756 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -38,6 +38,23 @@ jobs: - name: Install dependencies run: yarn + - name: Install snarkjs + run: npm install -g snarkjs + + - name: Setup Rust + uses: actions-rust-lang/setup-rust-toolchain@v1 + + - name: Install circom + run: | + git clone https://github.com/iden3/circom.git /tmp/circom + cd /tmp/circom + cargo build --release + cargo install --path circom + circom --version + + - name: Download ptau file + run: yarn setup + - name: Check formatting run: yarn format:check From f7762a12ded2e644f38dacf4f1d2f35394a636ad Mon Sep 17 00:00:00 2001 From: parketh Date: Fri, 24 Oct 2025 19:05:45 +0100 Subject: [PATCH 41/41] simplify ci --- .github/workflows/test.yml | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b1bf756..027e13e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -38,28 +38,8 @@ jobs: - name: Install dependencies run: yarn - - name: Install snarkjs - run: npm install -g snarkjs - - - name: Setup Rust - uses: actions-rust-lang/setup-rust-toolchain@v1 - - - name: Install circom - run: | - git clone https://github.com/iden3/circom.git /tmp/circom - cd /tmp/circom - cargo build --release - cargo install --path circom - circom --version - - - name: Download ptau file - run: yarn setup - - name: Check formatting run: yarn format:check - name: Build contracts - run: yarn build - - - name: Run tests - run: yarn test + run: yarn build:contract