diff --git a/cspell-config/cspell-misc.txt b/cspell-config/cspell-misc.txt index b7033af1..80a1e342 100644 --- a/cspell-config/cspell-misc.txt +++ b/cspell-config/cspell-misc.txt @@ -9,6 +9,7 @@ Nuxt nuxtjs testid vueuse +dockerized ethereum // examples/bank-demo diff --git a/packages/auth-server/stores/client.ts b/packages/auth-server/stores/client.ts index 67658197..0c9a0dbb 100644 --- a/packages/auth-server/stores/client.ts +++ b/packages/auth-server/stores/client.ts @@ -27,10 +27,10 @@ export const contractsByChain: Record = { accountPaymaster: "0x685af8Bc672D5916A4a97536e73bce0407CB4BEf", }, [zksyncInMemoryNode.id]: { - session: "0x8543528a4561E3a5EC7d51Bfd3776457b0E7b7dc", - passkey: "0x975df0c7f5CB728ae9F96480491Ec5d1E17296f4", - accountFactory: "0xaAF5f437fB0524492886fbA64D703df15BF619AE", - accountPaymaster: "0xcE98d6E9456CdFE5eDC1Ce6c32eEce8F71AF6b74", + session: "0x261ECD81AD63b9b255454b54F591A037368d80eC", + passkey: "0x59Cc87808FCAdB73BeBC13294A28Cdf126fbE5f7", + accountFactory: "0x35938C70af13d0c3bBb4e852A9Ab10B20797AeD5", + accountPaymaster: "0x3F536ED8a9c228f6Db449Bae484F7d792Bb2dB28", }, }; diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index 931864dc..1faa15b6 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -1,6 +1,7 @@ import "@typechain/hardhat"; import "@matterlabs/hardhat-zksync"; import "@nomicfoundation/hardhat-chai-matchers"; +import "./scripts/deploy"; import { HardhatUserConfig } from "hardhat/config"; @@ -43,7 +44,7 @@ const config: HardhatUserConfig = { }, }, zksolc: { - version: "1.5.6", + version: "1.5.7", settings: { // https://era.zksync.io/docs/tools/hardhat/hardhat-zksync-solc.html#configuration // Native AA calls an internal system contract, so it needs extra permissions diff --git a/packages/contracts/package.json b/packages/contracts/package.json index a51efc53..649eac3c 100644 --- a/packages/contracts/package.json +++ b/packages/contracts/package.json @@ -38,6 +38,7 @@ "dependencies": { "@matterlabs/zksync-contracts": "^0.6.1", "@nomad-xyz/excessively-safe-call": "^0.0.1-rc.1", + "@nomicfoundation/hardhat-toolbox": "^5.0.0", "@openzeppelin/contracts": "4.9.6", "@openzeppelin/contracts-upgradeable": "4.9", "bigint-conversion": "^2.4.3", diff --git a/packages/contracts/project.json b/packages/contracts/project.json index bb927a61..02467dee 100644 --- a/packages/contracts/project.json +++ b/packages/contracts/project.json @@ -44,7 +44,7 @@ "executor": "nx:run-commands", "options": { "cwd": "packages/contracts", - "command": "pnpm hardhat test --grep 'should deploy all contracts'" + "command": "pnpm hardhat deploy" }, "inputs": ["production", "outputs", "^production"], "dependsOn": ["build"] diff --git a/packages/contracts/scripts/deploy.ts b/packages/contracts/scripts/deploy.ts new file mode 100644 index 00000000..a6ada9fd --- /dev/null +++ b/packages/contracts/scripts/deploy.ts @@ -0,0 +1,100 @@ +import "@nomicfoundation/hardhat-toolbox"; + +import { ethers } from "ethers"; +import { task } from "hardhat/config"; +import { Wallet } from "zksync-ethers"; + +const ethersStaticSalt = new Uint8Array([ + 205, 241, 161, 186, 101, 105, 79, + 248, 98, 64, 50, 124, 168, 204, + 200, 71, 214, 169, 195, 118, 199, + 62, 140, 111, 128, 47, 32, 21, + 177, 177, 174, 166, +]); + +async function deploy(name: string, deployer: Wallet, proxy: boolean, args?: any[]): Promise { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const { deployFactory, create2 } = require("../test/utils"); + console.log("Deploying", name, "contract..."); + let implContract; + if (name == "AAFactory") { + implContract = await deployFactory(deployer, args![0]); + } else { + implContract = await create2(name, deployer, ethersStaticSalt, args); + } + const implAddress = await implContract.getAddress(); + if (!proxy) { + console.log(name, "contract deployed at:", implAddress, "\n"); + return implAddress; + } + const proxyContract = await create2("TransparentProxy", deployer, ethersStaticSalt, [implAddress]); + const proxyAddress = await proxyContract.getAddress(); + console.log(name, "proxy contract deployed at:", proxyAddress, "\n"); + return proxyAddress; +} + +task("deploy", "Deploys ZKsync SSO contracts") + .addOptionalParam("privateKey", "private key to the account to deploy the contracts from") + .addOptionalParam("only", "name of a specific contract to deploy") + .addFlag("noProxy", "do not deploy transparent proxies for factory and modules") + .addOptionalParam("implementation", "address of the account implementation to use in the factory") + .addOptionalParam("factory", "address of the factory to use in the paymaster") + .addOptionalParam("sessions", "address of the sessions module to use in the paymaster") + .addOptionalParam("fund", "amount of ETH to send to the paymaster", "0") + .setAction(async (cmd, hre) => { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const { LOCAL_RICH_WALLETS, getProvider } = require("../test/utils"); + console.log("Deploying to:", hre.network.name); + const provider = getProvider(); + + let privateKey: string; + if (cmd.privateKey) { + privateKey = cmd.privateKey; + } else if (hre.network.name == "inMemoryNode" || hre.network.name == "dockerizedNode") { + console.log("Using local rich wallet"); + privateKey = LOCAL_RICH_WALLETS[0].privateKey; + cmd.fund = "1"; + } else { + throw new Error("Private key must be provided to deploy on non-local network"); + } + + const deployer = new Wallet(privateKey, provider); + console.log("Deployer address:", deployer.address); + + if (!cmd.only) { + await deploy("WebAuthValidator", deployer, !cmd.noProxy); + const sessions = await deploy("SessionKeyValidator", deployer, !cmd.noProxy); + const implementation = await deploy("SsoAccount", deployer, false); + // TODO: enable proxy for factory -- currently it's not working + const factory = await deploy("AAFactory", deployer, false, [implementation]); + const paymaster = await deploy("ExampleAuthServerPaymaster", deployer, false, [factory, sessions]); + + if (cmd.fund != 0) { + console.log("Funding paymaster with", cmd.fund, "ETH..."); + await ( + await deployer.sendTransaction({ + to: paymaster, + value: ethers.parseEther(cmd.fund), + }) + ).wait(); + console.log("Paymaster funded\n"); + } else { + console.log("--fund flag not provided, skipping funding paymaster\n"); + } + } else { + let args: any[] = []; + if (cmd.only == "AAFactory") { + if (!cmd.implementation) { + throw new Error("Implementation address must be provided to deploy factory"); + } + args = [cmd.implementation]; + } + if (cmd.only == "ExampleAuthServerPaymaster") { + if (!cmd.factory || !cmd.sessions) { + throw new Error("Factory and SessionModule addresses must be provided to deploy paymaster"); + } + args = [cmd.factory, cmd.sessions]; + } + await deploy(cmd.only, deployer, false, args); + } + }); diff --git a/packages/contracts/src/AAFactory.sol b/packages/contracts/src/AAFactory.sol index 1e31580a..4eef51fd 100644 --- a/packages/contracts/src/AAFactory.sol +++ b/packages/contracts/src/AAFactory.sol @@ -1,31 +1,52 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import "@matterlabs/zksync-contracts/l2/system-contracts/Constants.sol"; -import "@matterlabs/zksync-contracts/l2/system-contracts/libraries/SystemContractsCaller.sol"; +import { UpgradeableBeacon } from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; +import { DEPLOYER_SYSTEM_CONTRACT, IContractDeployer } from "@matterlabs/zksync-contracts/l2/system-contracts/Constants.sol"; +import { SystemContractsCaller } from "@matterlabs/zksync-contracts/l2/system-contracts/libraries/SystemContractsCaller.sol"; import { ISsoAccount } from "./interfaces/ISsoAccount.sol"; -import { UpgradeableBeacon } from "./UpgradeableBeacon.sol"; - -import "./helpers/Logger.sol"; +/// @title AAFactory +/// @author Matter Labs +/// @custom:security-contact security@matterlabs.dev +/// @dev This contract is used to deploy SSO accounts as beacon proxies. contract AAFactory is UpgradeableBeacon { - bytes32 public immutable beaconProxyBytecodeHash; + /// @notice Emitted when a new account is successfully created. + /// @param accountAddress The address of the newly created account. + /// @param uniqueAccountId A unique identifier for the account. + event AccountCreated(address indexed accountAddress, string uniqueAccountId); + + /// @dev The bytecode hash of the beacon proxy, used for deploying proxy accounts. + bytes32 private immutable beaconProxyBytecodeHash; - // This is a mapping from unique id => account address + /// @notice A mapping from unique account IDs to their corresponding deployed account addresses. mapping(string => address) public accountMappings; - constructor(bytes32 _beaconProxyBytecodeHash, address implementation) UpgradeableBeacon(implementation) { + /// @notice Constructor that initializes the factory with a beacon proxy bytecode hash and implementation contract address. + /// @param _beaconProxyBytecodeHash The bytecode hash of the beacon proxy. + /// @param _implementation The address of the implementation contract used by the beacon. + constructor(bytes32 _beaconProxyBytecodeHash, address _implementation) UpgradeableBeacon(_implementation) { beaconProxyBytecodeHash = _beaconProxyBytecodeHash; } + /// @notice Deploys a new SSO account as a beacon proxy with the specified parameters. + /// @dev Uses `create2` to deploy a proxy account, allowing for deterministic addresses based on the provided salt. + /// @param _salt The salt used for the `create2` deployment to make the address deterministic. + /// @param _uniqueAccountId A unique identifier for the new account. + /// @param _initialValidators An array of initial validators for the new account. + /// @param _initialModules An array of initial modules to be added to the new account. + /// @param _initialK1Owners An array of initial owners of the K1 key for the new account. + /// @return accountAddress The address of the newly deployed SSO account. function deployProxySsoAccount( - bytes32 salt, - string calldata uniqueAccountId, - bytes[] calldata initialValidators, - bytes[] calldata initialModules, - address[] calldata initialK1Owners + bytes32 _salt, + string calldata _uniqueAccountId, + bytes[] calldata _initialValidators, + bytes[] calldata _initialModules, + address[] calldata _initialK1Owners ) external returns (address accountAddress) { + require(accountMappings[_uniqueAccountId] == address(0), "Account already exists"); + (bool success, bytes memory returnData) = SystemContractsCaller.systemCallWithReturndata( uint32(gasleft()), address(DEPLOYER_SYSTEM_CONTRACT), @@ -33,26 +54,21 @@ contract AAFactory is UpgradeableBeacon { abi.encodeCall( DEPLOYER_SYSTEM_CONTRACT.create2Account, ( - salt, + _salt, beaconProxyBytecodeHash, - abi.encode(address(this), bytes("")), + abi.encode(address(this)), IContractDeployer.AccountAbstractionVersion.Version1 ) ) ); require(success, "Deployment failed"); - (accountAddress) = abi.decode(returnData, (address)); - Logger.logString("accountAddress"); - Logger.logAddress(accountAddress); + // Initialize the newly deployed account with validators, modules, and K1 owners. + ISsoAccount(accountAddress).initialize(_initialValidators, _initialModules, _initialK1Owners); - // add session-key/spend-limit module (similar code) - ISsoAccount(accountAddress).initialize(initialValidators, initialModules, initialK1Owners); + accountMappings[_uniqueAccountId] = accountAddress; - if (accountMappings[uniqueAccountId] != address(0)) { - revert("Account already exists"); - } - accountMappings[uniqueAccountId] = accountAddress; + emit AccountCreated(accountAddress, _uniqueAccountId); } } diff --git a/packages/contracts/src/AccountProxy.sol b/packages/contracts/src/AccountProxy.sol index 4b29caba..d68cb4fe 100644 --- a/packages/contracts/src/AccountProxy.sol +++ b/packages/contracts/src/AccountProxy.sol @@ -1,10 +1,19 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.8.17; +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; -// TODO: use this to optimize gas? -// import { EfficientCall } from "@matterlabs/zksync-contracts/l2/system-contracts/libraries/EfficientCall.sol"; +import { Proxy } from "@openzeppelin/contracts/proxy/Proxy.sol"; +import { EfficientProxy } from "./EfficientProxy.sol"; import { BeaconProxy } from "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol"; -contract AccountProxy is BeaconProxy { - constructor(address beacon, bytes memory data) BeaconProxy(beacon, data) {} +/// @title AccountProxy +/// @author Matter Labs +/// @custom:security-contact security@matterlabs.dev +/// @notice This contract is modification of OpenZeppelin `BeaconProxy` with optimisation for +/// cheap delegate calls on ZKsync. +contract AccountProxy is BeaconProxy, EfficientProxy { + constructor(address beacon) BeaconProxy(beacon, bytes("")) {} + + function _delegate(address implementation) internal override(EfficientProxy, Proxy) { + EfficientProxy._delegate(implementation); + } } diff --git a/packages/contracts/src/EfficientProxy.sol b/packages/contracts/src/EfficientProxy.sol new file mode 100644 index 00000000..cecd93e9 --- /dev/null +++ b/packages/contracts/src/EfficientProxy.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import { EfficientCall } from "@matterlabs/zksync-contracts/l2/system-contracts/libraries/EfficientCall.sol"; + +/// @title EfficientProxy +/// @author Matter Labs +/// @custom:security-contact security@matterlabs.dev +/// @notice This contract implement ultra-efficient way for executing delegate calls. It is compatible with +/// OpenZeppelin proxy implementations. +abstract contract EfficientProxy { + function _delegate(address implementation) internal virtual { + // Use the EfficientCall library to forward calldata to the implementation contract, + // instead of copying it from calldata to memory. + bytes memory data = EfficientCall.delegateCall(gasleft(), implementation, msg.data); + assembly { + return(add(data, 0x20), mload(data)) + } + } +} diff --git a/packages/contracts/src/SsoAccount.sol b/packages/contracts/src/SsoAccount.sol index 0fb78d04..42b87573 100644 --- a/packages/contracts/src/SsoAccount.sol +++ b/packages/contracts/src/SsoAccount.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.24; import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; -import { IAccount, ACCOUNT_VALIDATION_SUCCESS_MAGIC } from "@matterlabs/zksync-contracts/l2/system-contracts/interfaces/IAccount.sol"; +import { ACCOUNT_VALIDATION_SUCCESS_MAGIC } from "@matterlabs/zksync-contracts/l2/system-contracts/interfaces/IAccount.sol"; import { Transaction, TransactionHelper } from "@matterlabs/zksync-contracts/l2/system-contracts/libraries/TransactionHelper.sol"; import { EfficientCall } from "@matterlabs/zksync-contracts/l2/system-contracts/libraries/EfficientCall.sol"; import { NONCE_HOLDER_SYSTEM_CONTRACT, DEPLOYER_SYSTEM_CONTRACT, INonceHolder } from "@matterlabs/zksync-contracts/l2/system-contracts/Constants.sol"; @@ -12,29 +12,26 @@ import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/I import { HookManager } from "./managers/HookManager.sol"; import { ModuleManager } from "./managers/ModuleManager.sol"; -import { UpgradeManager } from "./managers/UpgradeManager.sol"; import { TokenCallbackHandler, IERC165 } from "./helpers/TokenCallbackHandler.sol"; import { Errors } from "./libraries/Errors.sol"; import { SignatureDecoder } from "./libraries/SignatureDecoder.sol"; -import { ModeCode } from "./libraries/ERC7579Mode.sol"; import { ERC1271Handler } from "./handlers/ERC1271Handler.sol"; import { BatchCaller } from "./batch/BatchCaller.sol"; import { ISsoAccount } from "./interfaces/ISsoAccount.sol"; -import "./helpers/Logger.sol"; - -/** - * @title Main account contract from the Clave wallet infrastructure in ZKsync Era - * @author https://getclave.io - */ - +/// @title SSO Account +/// @author Matter Labs +/// @custom:security-contact security@matterlabs.dev +/// @notice The implementation is inspired by Clave wallet. +/// @notice This contract is a modular and extensible account implementation with support of +/// multi-ownership, custom modules, validation/execution hooks and different signature validation formats. +/// @dev Contract is expected to be used as Beacon proxy implementation. contract SsoAccount is Initializable, - UpgradeManager, HookManager, ModuleManager, ERC1271Handler, @@ -44,140 +41,120 @@ contract SsoAccount is { // Helper library for the Transaction struct using TransactionHelper for Transaction; - // Batch transaction helper contract - // TODO: Address should probably be keccak256("BatchCaller"), but for now it is "0xbatch" - address public constant BATCH_CALLER = address(0xba7c4); - /** - * @notice Constructor for the account implementation - */ constructor() { - // address batchCaller _disableInitializers(); } - /** - * @notice Initializer function for the account contract - * @dev Sets passkey and passkey validator within account storage - * @param initialValidators bytes[] calldata - Validator addresses and init data for validation modules - * @param initialModules bytes[] - Non-validator modules and init data for validation modules - */ + /// @notice Initializer function that sets account initial configuration. Expected to be used in the proxy. + /// @dev Sets passkey and passkey validator within account storage + /// @param _initialValidators An array of module validator addresses and initial validation keys + /// in an ABI encoded format of `abi.encode(validatorAddr,validationKey))`. + /// @param _initialModules An array of native module addresses and their initialize data + /// in an ABI encoded format of `abi.encode(moduleAddr,initData))`. + /// @param _initialK1Owners An array of addresses with full control over the account. function initialize( - bytes[] calldata initialValidators, - bytes[] calldata initialModules, - address[] calldata initialK1Owners + bytes[] calldata _initialValidators, + bytes[] calldata _initialModules, + address[] calldata _initialK1Owners ) external initializer { - for (uint256 validatorIndex = 0; validatorIndex < initialValidators.length; validatorIndex++) { - (address validatorAddress, bytes memory validatorData) = abi.decode( - initialValidators[validatorIndex], - (address, bytes) - ); - _addModuleValidator(validatorAddress, validatorData); + for (uint256 i = 0; i < _initialValidators.length; ++i) { + (address validatorAddr, bytes memory validationKey) = abi.decode(_initialValidators[i], (address, bytes)); + _addModuleValidator(validatorAddr, validationKey); } - for (uint256 moduleIndex = 0; moduleIndex < initialModules.length; moduleIndex++) { - (address moduleAddress, bytes memory moduleData) = abi.decode(initialModules[moduleIndex], (address, bytes)); - _addNativeModule(moduleAddress, moduleData); + for (uint256 i = 0; i < _initialModules.length; ++i) { + (address moduleAddr, bytes memory initData) = abi.decode(_initialModules[i], (address, bytes)); + _addNativeModule(moduleAddr, initData); } - for (uint256 ownerIndex = 0; ownerIndex < initialK1Owners.length; ownerIndex++) { - _k1AddOwner(initialK1Owners[ownerIndex]); + for (uint256 i = 0; i < _initialK1Owners.length; ++i) { + _k1AddOwner(_initialK1Owners[i]); } } - // Receive function to allow ETHs + /// @dev Account might receive/hold base tokens. receive() external payable {} - /** - * @notice Called by the bootloader to validate that an account agrees to process the transaction - * (and potentially pay for it). - * @dev The developer should strive to preserve as many steps as possible both for valid - * and invalid transactions as this very method is also used during the gas fee estimation - * (without some of the necessary data, e.g. signature). - * @param - bytes32 - Not used - * @param suggestedSignedHash bytes32 - The suggested hash of the transaction that is signed by the signer - * @param transaction Transaction calldata - The transaction itself - * @return magic bytes4 - The magic value that should be equal to the signature of this function - * if the user agrees to proceed with the transaction. - */ + /// @notice Called by the bootloader to validate that an account agrees to process the transaction + /// (and potentially pay for it). + /// @dev The developer should strive to preserve as many steps as possible both for valid + /// and invalid transactions as this very method is also used during the gas fee estimation + /// (without some of the necessary data, e.g. signature). + /// @param _suggestedSignedHash The suggested hash of the transaction that is signed by the signer. + /// @param _transaction The transaction data. + /// @return magic The magic value that should be equal to the signature of this function. + /// if the user agrees to proceed with the transaction. function validateTransaction( bytes32, - bytes32 suggestedSignedHash, - Transaction calldata transaction + bytes32 _suggestedSignedHash, + Transaction calldata _transaction ) external payable override onlyBootloader returns (bytes4 magic) { - // FIXME session txs have their own nonce managers, - // so they have to not alter this nonce - _incrementNonce(transaction.nonce); + // TODO: session txs have their own nonce managers, so they have to not alter this nonce + _incrementNonce(_transaction.nonce); - // The fact there is enough balance for the account - // should be checked explicitly to prevent user paying for fee for a - // transaction that wouldn't be included on Ethereum. - if (transaction.totalRequiredBalance() > address(this).balance) { + // If there is not enough balance for the transaction, the account should reject it + // on the validation step to prevent paying fees for revertable transactions. + if (_transaction.totalRequiredBalance() > address(this).balance) { revert Errors.INSUFFICIENT_FUNDS(); } // While the suggested signed hash is usually provided, it is generally // not recommended to rely on it to be present, since in the future // there may be tx types with no suggested signed hash. - bytes32 signedHash = suggestedSignedHash == bytes32(0) - ? transaction.encodeHash() // TODO: this hash needs to depend on the signature type? - : suggestedSignedHash; + bytes32 signedHash = _suggestedSignedHash == bytes32(0) ? _transaction.encodeHash() : _suggestedSignedHash; - magic = _validateTransaction(signedHash, transaction); + magic = _validateTransaction(signedHash, _transaction); } - /** - * @notice Called by the bootloader to make the account execute the transaction. - * @dev The transaction is considered successful if this function does not revert - * @param - bytes32 - Not used - * @param - bytes32 - Not used - * @param transaction Transaction calldata - The transaction itself - */ + /// @notice Called by the bootloader to make the account execute the transaction. + /// @dev The transaction is considered successful if this function does not revert + /// @param _transaction The transaction data. function executeTransaction( bytes32, bytes32, - Transaction calldata transaction - ) external payable override onlyBootloader { - _executeTransaction(transaction); - } + Transaction calldata _transaction + ) external payable override onlyBootloader runExecutionHooks(_transaction) { + address to = _safeCastToAddress(_transaction.to); + uint128 value = Utils.safeCastToU128(_transaction.value); - /** - * @notice This function allows an EOA to start a transaction for the account. - * @dev There is no point in providing possible signed hash in the `executeTransactionFromOutside` method, - * since it typically should not be trusted. - * @param transaction Transaction calldata - The transaction itself - */ - function executeTransactionFromOutside(Transaction calldata transaction) external payable override { - // Check if msg.sender is authorized - if (!_k1IsOwner(msg.sender)) { - revert Errors.UNAUTHORIZED_OUTSIDE_TRANSACTION(); - } - - // Extract hook data from transaction.signature - bytes[] memory hookData = SignatureDecoder.decodeSignatureOnlyHookData(transaction.signature); + _executeCall(to, value, _transaction.data); + } - // Get the hash of the transaction - bytes32 signedHash = transaction.encodeHash(); + /// @notice Executes a call to a given address with a specified value and calldata. + /// @param _to The address to which the call is made. + /// @param _value The value to send along with the call. + /// @param _data The calldata to pass along with the call. + function _executeCall(address _to, uint128 _value, bytes calldata _data) internal { + uint32 gas = Utils.safeCastToU32(gasleft()); - // Run the validation hooks - if (!runValidationHooks(signedHash, transaction, hookData)) { - revert Errors.VALIDATION_HOOK_FAILED(); + if (_to == address(DEPLOYER_SYSTEM_CONTRACT)) { + // Note, that the deployer contract can only be called with a "systemCall" flag. + SystemContractsCaller.systemCallWithPropagatedRevert(gas, _to, _value, _data); + } else { + bool success = EfficientCall.rawCall(gas, _to, _value, _data, false); + if (!success) { + EfficientCall.propagateRevert(); + } } + } - _executeTransaction(transaction); + /// @notice This function allows an EOA to start a transaction for the account. The main purpose of which is + /// to have and entry point for escaping funds when L2 transactions are censored by the chain, and only + /// forced transactions are accepted by the network. + /// @dev It is not implemented yet. + /// @param _transaction The transaction data. + function executeTransactionFromOutside(Transaction calldata _transaction) external payable override { + revert Errors.METHOD_NOT_IMPLEMENTED(); } - /** - * @notice This function allows the account to pay for its own gas and used when there is no paymaster - * @param - bytes32 - not used - * @param - bytes32 - not used - * @param transaction Transaction calldata - Transaction to pay for - * @dev "This method must send at least `tx.gasprice * tx.gasLimit` ETH to the bootloader address." - */ + /// @notice This function allows the account to pay for its own gas and used when there is no paymaster. + /// @param _transaction The transaction data. + /// @dev This method must send at least `tx.gasprice * tx.gasLimit` ETH to the bootloader address. function payForTransaction( bytes32, bytes32, - Transaction calldata transaction + Transaction calldata _transaction ) external payable override onlyBootloader { - bool success = transaction.payToTheBootloader(); + bool success = _transaction.payToTheBootloader(); if (!success) { revert Errors.FEE_PAYMENT_FAILED(); @@ -186,19 +163,15 @@ contract SsoAccount is emit FeePaid(); } - /** - * @notice This function is called by the system if the transaction has a paymaster - and prepares the interaction with the paymaster - * @param - bytes32 - not used - * @param - bytes32 - not used - * @param transaction Transaction - The transaction itself - */ + /// @notice This function is called by the system if the transaction has a paymaster + /// and prepares the interaction with the paymaster. + /// @param _transaction The transaction data. function prepareForPaymaster( bytes32, bytes32, - Transaction calldata transaction + Transaction calldata _transaction ) external payable override onlyBootloader { - transaction.processPaymasterInput(); + _transaction.processPaymasterInput(); } /// @dev type(ISsoAccount).interfaceId indicates SSO accounts @@ -206,85 +179,48 @@ contract SsoAccount is return interfaceId == type(ISsoAccount).interfaceId || super.supportsInterface(interfaceId); } - function _validateTransaction( - bytes32 signedHash, - Transaction calldata transaction - ) internal returns (bytes4 magicValue) { - if (transaction.signature.length == 65) { - (address signer, ) = ECDSA.tryRecover(signedHash, transaction.signature); - Logger.logString("recovered EOA signer"); - Logger.logAddress(signer); - if (signer == address(0)) { - return bytes4(0); - } + /// @notice Validates the provided transaction by validating signature of ECDSA k1 owner. + /// or running validation hooks and signature validation in the provided validator address. + /// @param _signedHash The signed hash of the transaction. + /// @param _transaction The transaction data. + /// @return The magic value if the validation was successful and bytes4(0) otherwise. + function _validateTransaction(bytes32 _signedHash, Transaction calldata _transaction) internal returns (bytes4) { + if (_transaction.signature.length == 65) { + (address signer, ) = ECDSA.tryRecover(_signedHash, _transaction.signature); return _k1IsOwner(signer) ? ACCOUNT_VALIDATION_SUCCESS_MAGIC : bytes4(0); } - // Extract the signature, validator address and hook data from the transaction.signature + // Extract the signature, validator address and hook data from the _transaction.signature (bytes memory signature, address validator, bytes[] memory hookData) = SignatureDecoder.decodeSignature( - transaction.signature + _transaction.signature ); - Logger.logString("validator address"); - Logger.logAddress(validator); - // Run validation hooks - bool hookSuccess = runValidationHooks(signedHash, transaction, hookData); + bool hookSuccess = runValidationHooks(_signedHash, _transaction, hookData); if (!hookSuccess) { - Logger.logString("failed hook validation"); return bytes4(0); } - bool valid = _handleValidation(validator, signedHash, signature); - - magicValue = valid ? ACCOUNT_VALIDATION_SUCCESS_MAGIC : bytes4(0); - } - - function _executeTransaction(Transaction calldata transaction) internal runExecutionHooks(transaction) { - address to = _safeCastToAddress(transaction.to); - uint128 value = Utils.safeCastToU128(transaction.value); - bytes calldata data = transaction.data; - - _executeCall(to, value, data, false); - } - - function _executeCall(address to, uint128 value, bytes calldata data, bool allowFailure) internal { - uint32 gas = Utils.safeCastToU32(gasleft()); - - if (to == address(DEPLOYER_SYSTEM_CONTRACT)) { - // Note, that the deployer contract can only be called - // with a "systemCall" flag. - (bool success, bytes memory returnData) = SystemContractsCaller.systemCallWithReturndata(gas, to, value, data); - if (!success && !allowFailure) { - assembly { - let size := mload(returnData) - revert(add(returnData, 0x20), size) - } - } - } else if (to == BATCH_CALLER) { - bool success = EfficientCall.rawDelegateCall(gas, address(this), data); - if (!success && !allowFailure) { - EfficientCall.propagateRevert(); - } - } else { - bool success = EfficientCall.rawCall(gas, to, value, data, false); - if (!success && !allowFailure) { - EfficientCall.propagateRevert(); - } - } + bool validationSuccess = _handleValidation(validator, _signedHash, signature); + return validationSuccess ? ACCOUNT_VALIDATION_SUCCESS_MAGIC : bytes4(0); } - function _incrementNonce(uint256 nonce) internal { + /// @dev Increments the nonce value in Nonce Holder system contract to ensure replay attack protection. + /// @dev Reverts if the Nonce Holder stores different `_nonce` value from the expected one. + /// @param _expectedNonce The nonce value expected for the account to be stored in the Nonce Holder. + function _incrementNonce(uint256 _expectedNonce) internal { SystemContractsCaller.systemCallWithPropagatedRevert( uint32(gasleft()), address(NONCE_HOLDER_SYSTEM_CONTRACT), 0, - abi.encodeCall(INonceHolder.incrementMinNonceIfEquals, (nonce)) + abi.encodeCall(INonceHolder.incrementMinNonceIfEquals, (_expectedNonce)) ); } - function _safeCastToAddress(uint256 value) internal pure returns (address) { - if (value > type(uint160).max) revert(); - return address(uint160(value)); + /// @dev Safely casts a uint256 to an address. + /// @dev Revert if the value exceeds the maximum size for an address (160 bits). + function _safeCastToAddress(uint256 _value) internal pure returns (address) { + if (_value > type(uint160).max) revert(); + return address(uint160(_value)); } } diff --git a/packages/contracts/src/TransparentProxy.sol b/packages/contracts/src/TransparentProxy.sol new file mode 100644 index 00000000..678ad40e --- /dev/null +++ b/packages/contracts/src/TransparentProxy.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + +import { EfficientProxy } from "./EfficientProxy.sol"; +import { Proxy } from "@openzeppelin/contracts/proxy/Proxy.sol"; +import { TransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; + +/// @title TransparentProxy +/// @author Matter Labs +/// @custom:security-contact security@matterlabs.dev +/// @notice This contract is modification of OpenZeppelin `TransparentUpgradeableProxy` with optimisation for +/// cheap delegate calls on ZKsync. +/// @dev This proxy is placed in front of `AAFactory` and all modules (`WebAuthValidator`, `SessionKeyValidator`). +contract TransparentProxy is TransparentUpgradeableProxy, EfficientProxy { + constructor(address implementation) TransparentUpgradeableProxy(implementation, msg.sender, bytes("")) {} + + function _delegate(address implementation) internal override(EfficientProxy, Proxy) { + EfficientProxy._delegate(implementation); + } +} diff --git a/packages/contracts/src/UpgradeableBeacon.sol b/packages/contracts/src/UpgradeableBeacon.sol deleted file mode 100644 index 1cdcd17f..00000000 --- a/packages/contracts/src/UpgradeableBeacon.sol +++ /dev/null @@ -1,74 +0,0 @@ -// SPDX-License-Identifier: MIT -// OpenZeppelin Contracts v4.4.1 (proxy/beacon/UpgradeableBeacon.sol) -// Modified by Matter Labs - -pragma solidity ^0.8.0; - -import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; -import "@openzeppelin/contracts/utils/StorageSlot.sol"; - -/** - * @dev This contract is used in conjunction with one or more instances of {BeaconProxy} to determine their - * implementation contract, which is where they will delegate all function calls. - * - * An owner is able to change the implementation the beacon points to, thus upgrading the proxies that use this beacon. - */ -contract UpgradeableBeacon is IBeacon, Ownable { - // obtained as keccak256('eip1967.proxy.implementation') - 1 - bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /** - * @dev Emitted when the implementation returned by the beacon is changed. - */ - event Upgraded(address indexed implementation); - - /** - * @dev The `implementation` of the beacon is invalid. - */ - error BeaconInvalidImplementation(address implementation); - - /** - * @dev Sets the address of the initial implementation, and the deployer account as the owner who can upgrade the - * beacon. - */ - constructor(address implementation_) { - _setImplementation(implementation_); - } - - /** - * @dev Returns the current implementation address. - */ - function implementation() external view returns (address) { - return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value; - } - - /** - * @dev Upgrades the beacon to a new implementation. - * - * Emits an {Upgraded} event. - * - * Requirements: - * - * - msg.sender must be the owner of the contract. - * - `newImplementation` must be a contract. - */ - function upgradeTo(address newImplementation) public virtual onlyOwner { - _setImplementation(newImplementation); - } - - /** - * @dev Sets the implementation contract address for this beacon - * - * Requirements: - * - * - `newImplementation` must be a contract. - */ - function _setImplementation(address newImplementation) private { - if (newImplementation.code.length == 0) { - revert BeaconInvalidImplementation(newImplementation); - } - StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation; - emit Upgraded(newImplementation); - } -} diff --git a/packages/contracts/src/batch/BatchCaller.sol b/packages/contracts/src/batch/BatchCaller.sol index e6725cbe..8071da58 100644 --- a/packages/contracts/src/batch/BatchCaller.sol +++ b/packages/contracts/src/batch/BatchCaller.sol @@ -1,47 +1,62 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; -import { SystemContractHelper } from "@matterlabs/zksync-contracts/l2/system-contracts/libraries/SystemContractHelper.sol"; +import { SystemContractsCaller } from "@matterlabs/zksync-contracts/l2/system-contracts/libraries/SystemContractsCaller.sol"; import { EfficientCall } from "@matterlabs/zksync-contracts/l2/system-contracts/libraries/EfficientCall.sol"; +import { DEPLOYER_SYSTEM_CONTRACT } from "@matterlabs/zksync-contracts/l2/system-contracts/Constants.sol"; import { Errors } from "../libraries/Errors.sol"; -// Each call data for batches +/// @dev Represents an external call data. +/// @param target The address to which the call will be made. +/// @param allowFailure Flag that represents whether to revert the whole batch if the call fails. +/// @param value The amount of Ether (in wei) to be sent along with the call. +/// @param callData The calldata to be executed on the `target` address. struct Call { - address target; // Target contract address - bool allowFailure; // Whether to revert if the call fails - uint256 value; // Amount of ETH to send with call - bytes callData; // Calldata to send + address target; + bool allowFailure; + uint256 value; + bytes callData; } -/// @title BatchCaller -/// @notice Make multiple calls in a single transaction -contract BatchCaller { - /// @notice Make multiple calls, ensure success if required - /// @dev Reverts if not called via delegatecall - /// @param calls Call[] calldata - An array of Call structs - function batchCall(Call[] calldata calls) external { - bool isDelegateCall = SystemContractHelper.getCodeAddress() != address(this); - if (!isDelegateCall) { - revert Errors.ONLY_DELEGATECALL(); +/// @title SSO Account +/// @author Matter Labs +/// @custom:security-contact security@matterlabs.dev +/// @notice Make multiple calls from Account in a single transaction. +/// @notice The implementation is inspired by Clave wallet. +abstract contract BatchCaller { + /// @notice Make multiple calls, ensure success if required. + /// @dev The total Ether sent across all calls must be equal to `msg.value` to maintain the invariant + /// that `msg.value` + `tx.fee` is the maximum amount of Ether that can be spent on the transaction. + /// @param _calls Array of Call structs, each representing an individual external call to be made. + function batchCall(Call[] calldata _calls) external payable { + if (msg.sender != address(this)) { + revert Errors.NOT_FROM_SELF(); } - // Execute each call - uint256 len = calls.length; - Call calldata calli; - for (uint256 i = 0; i < len; ) { - calli = calls[i]; - address target = calli.target; - uint256 value = calli.value; - bytes calldata callData = calli.callData; + uint256 totalValue; + uint256 len = _calls.length; + for (uint256 i = 0; i < len; ++i) { + totalValue += _calls[i].value; + bool success; + if (_calls[i].target == address(DEPLOYER_SYSTEM_CONTRACT)) { + // Note, that the deployer contract can only be called with a "systemCall" flag. + success = SystemContractsCaller.systemCall( + uint32(gasleft()), + _calls[i].target, + _calls[i].value, + _calls[i].callData + ); + } else { + success = EfficientCall.rawCall(gasleft(), _calls[i].target, _calls[i].value, _calls[i].callData, false); + } - bool success = EfficientCall.rawCall(gasleft(), target, value, callData, false); - if (!calls[i].allowFailure && !success) { + if (!_calls[i].allowFailure && !success) { revert Errors.CALL_FAILED(); } + } - unchecked { - i++; - } + if (totalValue != msg.value) { + revert Errors.MsgValueMismatch(msg.value, totalValue); } } } diff --git a/packages/contracts/src/handlers/ERC1271Handler.sol b/packages/contracts/src/handlers/ERC1271Handler.sol index 721d3520..25bbb749 100644 --- a/packages/contracts/src/handlers/ERC1271Handler.sol +++ b/packages/contracts/src/handlers/ERC1271Handler.sol @@ -7,17 +7,16 @@ import { SignatureDecoder } from "../libraries/SignatureDecoder.sol"; import { ValidationHandler } from "./ValidationHandler.sol"; import { EIP712 } from "../helpers/EIP712.sol"; -/** - * @title ERC1271Handler - * @notice Contract which provides ERC1271 signature validation - * @author https://getclave.io - */ -abstract contract ERC1271Handler is IERC1271Upgradeable, EIP712("Clave1271", "1.0.0"), ValidationHandler { - struct ClaveMessage { +/// @title ERC1271Handler +/// @author Matter Labs +/// @notice Contract which provides ERC1271 signature validation +/// @notice The implementation is inspired by Clave wallet. +abstract contract ERC1271Handler is IERC1271Upgradeable, EIP712("Sso1271", "1.0.0"), ValidationHandler { + struct SsoMessage { bytes32 signedHash; } - bytes32 constant _CLAVE_MESSAGE_TYPEHASH = keccak256("ClaveMessage(bytes32 signedHash)"); + bytes32 constant _SSO_MESSAGE_TYPEHASH = keccak256("SsoMessage(bytes32 signedHash)"); bytes4 private constant _ERC1271_MAGIC = 0x1626ba7e; @@ -33,7 +32,7 @@ abstract contract ERC1271Handler is IERC1271Upgradeable, EIP712("Clave1271", "1. ) public view override returns (bytes4 magicValue) { (bytes memory signature, address validator) = SignatureDecoder.decodeSignatureNoHookData(signatureAndValidator); - bytes32 eip712Hash = _hashTypedDataV4(_claveMessageHash(ClaveMessage(signedHash))); + bytes32 eip712Hash = _hashTypedDataV4(_ssoMessageHash(SsoMessage(signedHash))); bool valid = _handleValidation(validator, eip712Hash, signature); @@ -41,23 +40,23 @@ abstract contract ERC1271Handler is IERC1271Upgradeable, EIP712("Clave1271", "1. } /** - * @notice Returns the EIP-712 hash of the Clave message - * @param claveMessage ClaveMessage calldata - The message containing signedHash + * @notice Returns the EIP-712 hash of the Sso message + * @param ssoMessage SsoMessage calldata - The message containing signedHash * @return bytes32 - EIP712 hash of the message */ - function getEip712Hash(ClaveMessage calldata claveMessage) external view returns (bytes32) { - return _hashTypedDataV4(_claveMessageHash(claveMessage)); + function getEip712Hash(SsoMessage calldata ssoMessage) external view returns (bytes32) { + return _hashTypedDataV4(_ssoMessageHash(ssoMessage)); } /** - * @notice Returns the typehash for the clave message struct - * @return bytes32 - Clave message typehash + * @notice Returns the typehash for the sso message struct + * @return bytes32 - Sso message typehash */ - function claveMessageTypeHash() external pure returns (bytes32) { - return _CLAVE_MESSAGE_TYPEHASH; + function ssoMessageTypeHash() external pure returns (bytes32) { + return _SSO_MESSAGE_TYPEHASH; } - function _claveMessageHash(ClaveMessage memory claveMessage) internal pure returns (bytes32) { - return keccak256(abi.encode(_CLAVE_MESSAGE_TYPEHASH, claveMessage.signedHash)); + function _ssoMessageHash(SsoMessage memory ssoMessage) internal pure returns (bytes32) { + return keccak256(abi.encode(_SSO_MESSAGE_TYPEHASH, ssoMessage.signedHash)); } } diff --git a/packages/contracts/src/handlers/ValidationHandler.sol b/packages/contracts/src/handlers/ValidationHandler.sol index 12d1b942..757bb6de 100644 --- a/packages/contracts/src/handlers/ValidationHandler.sol +++ b/packages/contracts/src/handlers/ValidationHandler.sol @@ -9,8 +9,6 @@ import { ValidatorManager } from "../managers/ValidatorManager.sol"; import { IK1Validator, IR1Validator } from "../interfaces/IValidator.sol"; import { IModuleValidator } from "../interfaces/IModuleValidator.sol"; -import "../helpers/Logger.sol"; - /** * @title ValidationHandler * @notice Contract which calls validators for signature validation @@ -47,7 +45,6 @@ abstract contract ValidationHandler is OwnerManager, ValidatorManager { return true; } } else if (_isModuleValidator(validator)) { - Logger.logString("_isModuleValidator"); return IModuleValidator(validator).handleValidation(signedHash, signature); } diff --git a/packages/contracts/src/interfaces/IERC7579Module.sol b/packages/contracts/src/interfaces/IERC7579Module.sol deleted file mode 100644 index ebff5ea5..00000000 --- a/packages/contracts/src/interfaces/IERC7579Module.sol +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; - -uint256 constant VALIDATION_SUCCESS = 0; -uint256 constant VALIDATION_FAILED = 1; - -uint256 constant MODULE_TYPE_VALIDATOR = 1; -uint256 constant MODULE_TYPE_EXECUTOR = 2; -uint256 constant MODULE_TYPE_FALLBACK = 3; -uint256 constant MODULE_TYPE_HOOK = 4; - -interface IERC7579Module { - error AlreadyInitialized(address smartAccount); - error NotInitialized(address smartAccount); - - /** - * @dev This function is called by the smart account during installation of the module - * @param data arbitrary data that may be required on the module during `onInstall` - * initialization - * - * MUST revert on error (i.e. if module is already enabled) - */ - function onInstall(bytes calldata data) external; - - /** - * @dev This function is called by the smart account during uninstallation of the module - * @param data arbitrary data that may be required on the module during `onUninstall` - * de-initialization - * - * MUST revert on error - */ - function onUninstall(bytes calldata data) external; - - /** - * @dev Returns boolean value if module is a certain type - * @param moduleTypeId the module type ID according the ERC-7579 spec - * - * MUST return true if the module is of the given type and false otherwise - */ - function isModuleType(uint256 moduleTypeId) external view returns (bool); - - /** - * @dev Returns if the module was already initialized for a provided smartaccount - */ - function isInitialized(address smartAccount) external view returns (bool); -} - -interface IExecutor is IERC7579Module {} - -interface IHook is IERC7579Module { - function preCheck( - address msgSender, - uint256 msgValue, - bytes calldata msgData - ) external returns (bytes memory hookData); - - function postCheck(bytes calldata hookData) external; -} - -interface IFallback is IERC7579Module {} diff --git a/packages/contracts/src/interfaces/ISsoAccount.sol b/packages/contracts/src/interfaces/ISsoAccount.sol index 774e0a6e..45b2c08a 100644 --- a/packages/contracts/src/interfaces/ISsoAccount.sol +++ b/packages/contracts/src/interfaces/ISsoAccount.sol @@ -11,7 +11,6 @@ import { IERC1155Receiver } from "@openzeppelin/contracts/token/ERC1155/IERC1155 import { IHookManager } from "./IHookManager.sol"; import { IModuleManager } from "./IModuleManager.sol"; import { IOwnerManager } from "./IOwnerManager.sol"; -import { IUpgradeManager } from "./IUpgradeManager.sol"; import { IValidatorManager } from "./IValidatorManager.sol"; /** @@ -27,7 +26,6 @@ interface ISsoAccount is IModuleManager, IOwnerManager, IValidatorManager, - IUpgradeManager, IAccount { event FeePaid(); diff --git a/packages/contracts/src/interfaces/IUpgradeManager.sol b/packages/contracts/src/interfaces/IUpgradeManager.sol deleted file mode 100644 index c7682a8e..00000000 --- a/packages/contracts/src/interfaces/IUpgradeManager.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.8.24; - -/** - * @title Interface of the upgrade manager contract - * @author https://getclave.io - */ -interface IUpgradeManager { - /** - * @notice Event emitted when the contract is upgraded - * @param oldImplementation address - Address of the old implementation contract - * @param newImplementation address - Address of the new implementation contract - */ - event Upgraded(address indexed oldImplementation, address indexed newImplementation); - - /** - * @notice Upgrades the account contract to a new implementation - * @dev Can only be called by self - * @param newImplementation address - Address of the new implementation contract - */ - function upgradeTo(address newImplementation) external; - - /** - * @notice Returns the current implementation address - * @return address - Address of the current implementation contract - */ - function implementation() external view returns (address); -} diff --git a/packages/contracts/src/interfaces/PackedUserOperation.sol b/packages/contracts/src/interfaces/PackedUserOperation.sol deleted file mode 100644 index db45f6c0..00000000 --- a/packages/contracts/src/interfaces/PackedUserOperation.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; - -/** - * User Operation struct - * @param sender - The sender account of this request. - * @param nonce - Unique value the sender uses to verify it is not a replay. - * @param initCode - If set, the account contract will be created by this constructor/ - * @param callData - The method call to execute on this account. - * @param accountGasLimits - Packed gas limits for validateUserOp and gas limit passed to the callData method call. - * @param preVerificationGas - Gas not calculated by the handleOps method, but added to the gas paid. - * Covers batch overhead. - * @param gasFees - packed gas fields maxPriorityFeePerGas and maxFeePerGas - Same as EIP-1559 gas parameters. - * @param paymasterAndData - If set, this field holds the paymaster address, verification gas limit, postOp gas limit and paymaster-specific extra data - * The paymaster will pay for the transaction instead of the sender. - * @param signature - Sender-verified signature over the entire request, the EntryPoint address and the chain ID. - */ -struct PackedUserOperation { - address sender; - uint256 nonce; - bytes initCode; - bytes callData; - bytes32 accountGasLimits; - uint256 preVerificationGas; - bytes32 gasFees; - bytes paymasterAndData; - bytes signature; -} diff --git a/packages/contracts/src/libraries/ERC7579Mode.sol b/packages/contracts/src/libraries/ERC7579Mode.sol deleted file mode 100644 index 171c1d50..00000000 --- a/packages/contracts/src/libraries/ERC7579Mode.sol +++ /dev/null @@ -1,125 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.24; - -/** - * @title ModeLib - * To allow smart accounts to be very simple, but allow for more complex execution, A custom mode - * encoding is used. - * Function Signature of execute function: - * function execute(ModeCode mode, bytes calldata executionCalldata) external payable; - * This allows for a single bytes32 to be used to encode the execution mode, calltype, execType and - * context. - * NOTE: Simple Account implementations only have to scope for the most significant byte. Account that - * implement - * more complex execution modes may use the entire bytes32. - * - * |--------------------------------------------------------------------| - * | CALLTYPE | EXECTYPE | UNUSED | ModeSelector | ModePayload | - * |--------------------------------------------------------------------| - * | 1 byte | 1 byte | 4 bytes | 4 bytes | 22 bytes | - * |--------------------------------------------------------------------| - * - * CALLTYPE: 1 byte - * CallType is used to determine how the executeCalldata paramter of the execute function has to be - * decoded. - * It can be either single, batch or delegatecall. In the future different calls could be added. - * CALLTYPE can be used by a validation module to determine how to decode . - * - * EXECTYPE: 1 byte - * ExecType is used to determine how the account should handle the execution. - * It can indicate if the execution should revert on failure or continue execution. - * In the future more execution modes may be added. - * Default Behavior (EXECTYPE = 0x00) is to revert on a single failed execution. If one execution in - * a batch fails, the entire batch is reverted - * - * UNUSED: 4 bytes - * Unused bytes are reserved for future use. - * - * ModeSelector: bytes4 - * The "optional" mode selector can be used by account vendors, to implement custom behavior in - * their accounts. - * the way a ModeSelector is to be calculated is bytes4(keccak256("vendorname.featurename")) - * this is to prevent collisions between different vendors, while allowing innovation and the - * development of new features without coordination between ERC-7579 implementing accounts - * - * ModePayload: 22 bytes - * Mode payload is used to pass additional data to the smart account execution, this may be - * interpreted depending on the ModeSelector - * - * ExecutionCallData: n bytes - * single, delegatecall or batch exec abi.encoded as bytes - */ - -// Custom type for improved developer experience -type ModeCode is bytes32; - -type CallType is bytes1; - -type ExecType is bytes1; - -type ModeSelector is bytes4; - -type ModePayload is bytes22; - -// Default CallType -CallType constant CALLTYPE_SINGLE = CallType.wrap(0x00); -// Batched CallType -CallType constant CALLTYPE_BATCH = CallType.wrap(0x01); -// @dev Implementing delegatecall is OPTIONAL! -// implement delegatecall with extreme care. -CallType constant CALLTYPE_STATIC = CallType.wrap(0xFE); -CallType constant CALLTYPE_DELEGATECALL = CallType.wrap(0xFF); - -// @dev default behavior is to revert on failure -// To allow very simple accounts to use mode encoding, the default behavior is to revert on failure -// Since this is value 0x00, no additional encoding is required for simple accounts -ExecType constant EXECTYPE_DEFAULT = ExecType.wrap(0x00); -// @dev account may elect to change execution behavior. For example "try exec" / "allow fail" -ExecType constant EXECTYPE_TRY = ExecType.wrap(0x01); - -ModeSelector constant MODE_DEFAULT = ModeSelector.wrap(bytes4(0x00000000)); -// Example declaration of a custom mode selector -ModeSelector constant MODE_OFFSET = ModeSelector.wrap(bytes4(keccak256("default.mode.offset"))); - -/** - * @dev ModeLib is a helper library to encode/decode ModeCodes - */ -library ModeLib { - function decode( - ModeCode mode - ) - internal - pure - returns (CallType _calltype, ExecType _execType, ModeSelector _modeSelector, ModePayload _modePayload) - { - assembly { - _calltype := mode - _execType := shl(8, mode) - _modeSelector := shl(48, mode) - _modePayload := shl(80, mode) - } - } - - function encode( - CallType callType, - ExecType execType, - ModeSelector mode, - ModePayload payload - ) internal pure returns (ModeCode) { - return ModeCode.wrap(bytes32(abi.encodePacked(callType, execType, bytes4(0), ModeSelector.unwrap(mode), payload))); - } - - function encodeSimpleBatch() internal pure returns (ModeCode mode) { - mode = encode(CALLTYPE_BATCH, EXECTYPE_DEFAULT, MODE_DEFAULT, ModePayload.wrap(0x00)); - } - - function encodeSimpleSingle() internal pure returns (ModeCode mode) { - mode = encode(CALLTYPE_SINGLE, EXECTYPE_DEFAULT, MODE_DEFAULT, ModePayload.wrap(0x00)); - } - - function getCallType(ModeCode mode) internal pure returns (CallType calltype) { - assembly { - calltype := mode - } - } -} diff --git a/packages/contracts/src/libraries/Errors.sol b/packages/contracts/src/libraries/Errors.sol index e368e954..ce2a4acd 100644 --- a/packages/contracts/src/libraries/Errors.sol +++ b/packages/contracts/src/libraries/Errors.sol @@ -3,13 +3,12 @@ pragma solidity ^0.8.24; library Errors { /*////////////////////////////////////////////////////////////// - CLAVE + ACCOUNT //////////////////////////////////////////////////////////////*/ error INSUFFICIENT_FUNDS(); error FEE_PAYMENT_FAILED(); - error UNAUTHORIZED_OUTSIDE_TRANSACTION(); - error VALIDATION_HOOK_FAILED(); + error METHOD_NOT_IMPLEMENTED(); /*////////////////////////////////////////////////////////////// LINKED LIST @@ -39,12 +38,6 @@ library Errors { error EMPTY_R1_VALIDATORS(); error VALIDATOR_ERC165_FAIL(); - /*////////////////////////////////////////////////////////////// - UPGRADE MANAGER - //////////////////////////////////////////////////////////////*/ - - error SAME_IMPLEMENTATION(); - /*////////////////////////////////////////////////////////////// HOOK MANAGER //////////////////////////////////////////////////////////////*/ @@ -71,71 +64,10 @@ library Errors { error NOT_FROM_SELF(); error NOT_FROM_SELF_OR_MODULE(); - /*////////////////////////////////////////////////////////////// - R1 VALIDATOR - //////////////////////////////////////////////////////////////*/ - - error INVALID_SIGNATURE(); - - /*////////////////////////////////////////////////////////////// - SOCIAL RECOVERY - //////////////////////////////////////////////////////////////*/ - - error INVALID_RECOVERY_CONFIG(); - error INVALID_RECOVERY_NONCE(); - error INVALID_GUARDIAN(); - error INVALID_GUARDIAN_SIGNATURE(); - error ZERO_ADDRESS_GUARDIAN(); - error GUARDIANS_MUST_BE_SORTED(); - error RECOVERY_TIMELOCK(); - error RECOVERY_NOT_STARTED(); - error RECOVERY_NOT_INITED(); - error RECOVERY_IN_PROGRESS(); - error INSUFFICIENT_GUARDIANS(); - error ALREADY_INITED(); - - /*////////////////////////////////////////////////////////////// - FACTORY - //////////////////////////////////////////////////////////////*/ - - error DEPLOYMENT_FAILED(); - error INITIALIZATION_FAILED(); - - /*////////////////////////////////////////////////////////////// - PAYMASTER - //////////////////////////////////////////////////////////////*/ - - error UNSUPPORTED_FLOW(); - error UNAUTHORIZED_WITHDRAW(); - error INVALID_TOKEN(); - error SHORT_PAYMASTER_INPUT(); - error UNSUPPORTED_TOKEN(); - error LESS_ALLOWANCE_FOR_PAYMASTER(); - error FAILED_FEE_TRANSFER(); - error INVALID_MARKUP(); - error USER_LIMIT_REACHED(); - error INVALID_USER_LIMIT(); - error NOT_SSO_ACCOUNT(); - error EXCEEDS_MAX_SPONSORED_ETH(); - - /*////////////////////////////////////////////////////////////// - REGISTRY - //////////////////////////////////////////////////////////////*/ - - error NOT_FROM_FACTORY(); - error NOT_FROM_DEPLOYER(); - /*////////////////////////////////////////////////////////////// BatchCaller //////////////////////////////////////////////////////////////*/ - error ONLY_DELEGATECALL(); error CALL_FAILED(); - - /*////////////////////////////////////////////////////////////// - INITABLE - //////////////////////////////////////////////////////////////*/ - - error MODULE_NOT_ADDED_CORRECTLY(); - error MODULE_NOT_REMOVED_CORRECTLY(); + error MsgValueMismatch(uint256 actualValue, uint256 expectedValue); } diff --git a/packages/contracts/src/libraries/SessionLib.sol b/packages/contracts/src/libraries/SessionLib.sol new file mode 100644 index 00000000..d3386db0 --- /dev/null +++ b/packages/contracts/src/libraries/SessionLib.sol @@ -0,0 +1,296 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.24; + +import { Transaction } from "@matterlabs/zksync-contracts/l2/system-contracts/libraries/TransactionHelper.sol"; +import { IPaymasterFlow } from "@matterlabs/zksync-contracts/l2/system-contracts/interfaces/IPaymasterFlow.sol"; + +library SessionLib { + using SessionLib for SessionLib.Constraint; + using SessionLib for SessionLib.UsageLimit; + + // We do not permit session keys to be reused to open multiple sessions + // (after one expires or is closed, e.g.). + // For each session key, its session status can only be changed + // from NotInitialized to Active, and from Active to Closed. + enum Status { + NotInitialized, + Active, + Closed + } + + // This struct is used to track usage information for each session. + // Along with `status`, this is considered the session state. + // While everything else is considered the session spec, and is stored offchain. + // Storage layout of this struct is weird to conform to ERC-7562 storage access restrictions during validation. + // Each innermost mapping is always mapping(address account => ...). + struct SessionStorage { + mapping(address => Status) status; + UsageTracker fee; + // (target) => transfer value tracker + mapping(address => UsageTracker) transferValue; + // (target, selector) => call value tracker + mapping(address => mapping(bytes4 => UsageTracker)) callValue; + // (target, selector, index) => call parameter tracker + // index is the constraint index in callPolicy, not the parameter index + mapping(address => mapping(bytes4 => mapping(uint256 => UsageTracker))) params; + } + + struct Constraint { + Condition condition; + uint64 index; + bytes32 refValue; + UsageLimit limit; + } + + struct UsageTracker { + // Used for LimitType.Lifetime + mapping(address => uint256) lifetimeUsage; + // Used for LimitType.Allowance + // period => used that period + mapping(uint256 => mapping(address => uint256)) allowanceUsage; + } + + struct UsageLimit { + LimitType limitType; + uint256 limit; // ignored if limitType == Unlimited + uint256 period; // ignored if limitType != Allowance + } + + enum LimitType { + Unlimited, + Lifetime, + Allowance + } + + enum Condition { + Unconstrained, + Equal, + Greater, + Less, + GreaterOrEqual, + LessOrEqual, + NotEqual + } + + struct SessionSpec { + address signer; + uint256 expiresAt; + UsageLimit feeLimit; + CallSpec[] callPolicies; + TransferSpec[] transferPolicies; + } + + struct CallSpec { + address target; + bytes4 selector; + uint256 maxValuePerUse; + UsageLimit valueLimit; + Constraint[] constraints; + // add max data length restriction? + // add max number of calls restriction? + } + + struct TransferSpec { + address target; + uint256 maxValuePerUse; + UsageLimit valueLimit; + } + + struct LimitState { + // this might also be limited by a constraint or `maxValuePerUse`, + // which is not reflected here + uint256 remaining; + address target; + // ignored for transfer value + bytes4 selector; + // ignored for transfer and call value + uint256 index; + } + + // Info about remaining session limits and its status + struct SessionState { + Status status; + uint256 feesRemaining; + LimitState[] transferValue; + LimitState[] callValue; + LimitState[] callParams; + } + + function checkAndUpdate(UsageLimit memory limit, UsageTracker storage tracker, uint256 value) internal { + if (limit.limitType == LimitType.Lifetime) { + require(tracker.lifetimeUsage[msg.sender] + value <= limit.limit, "Lifetime limit exceeded"); + tracker.lifetimeUsage[msg.sender] += value; + } + // TODO: uncomment when it's possible to check timestamps during validation + // if (limit.limitType == LimitType.Allowance) { + // uint256 period = block.timestamp / limit.period; + // require(tracker.allowanceUsage[period] + value <= limit.limit); + // tracker.allowanceUsage[period] += value; + // } + } + + function checkAndUpdate(Constraint memory constraint, UsageTracker storage tracker, bytes calldata data) internal { + uint256 index = 4 + constraint.index * 32; + bytes32 param = bytes32(data[index:index + 32]); + Condition condition = constraint.condition; + bytes32 refValue = constraint.refValue; + + if (condition == Condition.Equal) { + require(param == refValue, "EQUAL constraint not met"); + } else if (condition == Condition.Greater) { + require(param > refValue, "GREATER constraint not met"); + } else if (condition == Condition.Less) { + require(param < refValue, "LESS constraint not met"); + } else if (condition == Condition.GreaterOrEqual) { + require(param >= refValue, "GREATER_OR_EQUAL constraint not met"); + } else if (condition == Condition.LessOrEqual) { + require(param <= refValue, "LESS_OR_EQUAL constraint not met"); + } else if (condition == Condition.NotEqual) { + require(param != refValue, "NOT_EQUAL constraint not met"); + } + + constraint.limit.checkAndUpdate(tracker, uint256(param)); + } + + function validate(SessionStorage storage state, Transaction calldata transaction, SessionSpec memory spec) internal { + require(state.status[msg.sender] == Status.Active, "Session is not active"); + + // TODO uncomment when it's possible to check timestamps during validation + // require(block.timestamp <= session.expiresAt); + + // TODO: update fee allowance with the gasleft/refund at the end of execution + uint256 fee = transaction.maxFeePerGas * transaction.gasLimit; + spec.feeLimit.checkAndUpdate(state.fee, fee); + + address target = address(uint160(transaction.to)); + + if (transaction.paymasterInput.length >= 4) { + bytes4 paymasterInputSelector = bytes4(transaction.paymasterInput[0:4]); + require( + paymasterInputSelector != IPaymasterFlow.approvalBased.selector, + "Approval based paymaster flow not allowed" + ); + } + + if (transaction.data.length >= 4) { + bytes4 selector = bytes4(transaction.data[:4]); + CallSpec memory callPolicy; + bool found = false; + + for (uint256 i = 0; i < spec.callPolicies.length; i++) { + if (spec.callPolicies[i].target == target && spec.callPolicies[i].selector == selector) { + callPolicy = spec.callPolicies[i]; + found = true; + break; + } + } + + require(found, "Call not allowed"); + require(transaction.value <= callPolicy.maxValuePerUse, "Value exceeds limit"); + callPolicy.valueLimit.checkAndUpdate(state.callValue[target][selector], transaction.value); + + for (uint256 i = 0; i < callPolicy.constraints.length; i++) { + callPolicy.constraints[i].checkAndUpdate(state.params[target][selector][i], transaction.data); + } + } else { + TransferSpec memory transferPolicy; + bool found = false; + + for (uint256 i = 0; i < spec.transferPolicies.length; i++) { + if (spec.transferPolicies[i].target == target) { + transferPolicy = spec.transferPolicies[i]; + found = true; + break; + } + } + + require(found, "Transfer not allowed"); + require(transaction.value <= transferPolicy.maxValuePerUse, "Value exceeds limit"); + transferPolicy.valueLimit.checkAndUpdate(state.transferValue[target], transaction.value); + } + } + + function remainingLimit( + UsageLimit memory limit, + UsageTracker storage tracker, + address account + ) internal view returns (uint256) { + if (limit.limitType == LimitType.Unlimited) { + // this might be still limited by `maxValuePerUse` or a constraint + return type(uint256).max; + } + if (limit.limitType == LimitType.Lifetime) { + return limit.limit - tracker.lifetimeUsage[account]; + } + if (limit.limitType == LimitType.Allowance) { + // this is not used during validation, so it's fine to use block.timestamp + uint256 period = block.timestamp / limit.period; + return limit.limit - tracker.allowanceUsage[period][account]; + } + } + + function getState( + SessionStorage storage session, + address account, + SessionSpec calldata spec + ) internal view returns (SessionState memory) { + uint256 totalConstraints = 0; + for (uint256 i = 0; i < spec.callPolicies.length; i++) { + totalConstraints += spec.callPolicies[i].constraints.length; + } + + LimitState[] memory transferValue = new LimitState[](spec.transferPolicies.length); + LimitState[] memory callValue = new LimitState[](spec.callPolicies.length); + LimitState[] memory callParams = new LimitState[](totalConstraints); // there will be empty ones at the end + uint256 paramLimitIndex = 0; + + for (uint256 i = 0; i < transferValue.length; i++) { + TransferSpec memory transferSpec = spec.transferPolicies[i]; + transferValue[i] = LimitState({ + remaining: remainingLimit(transferSpec.valueLimit, session.transferValue[transferSpec.target], account), + target: spec.transferPolicies[i].target, + selector: bytes4(0), + index: 0 + }); + } + + for (uint256 i = 0; i < callValue.length; i++) { + CallSpec memory callSpec = spec.callPolicies[i]; + callValue[i] = LimitState({ + remaining: remainingLimit(callSpec.valueLimit, session.callValue[callSpec.target][callSpec.selector], account), + target: callSpec.target, + selector: callSpec.selector, + index: 0 + }); + + for (uint256 j = 0; j < callSpec.constraints.length; j++) { + if (callSpec.constraints[j].limit.limitType != LimitType.Unlimited) { + callParams[paramLimitIndex++] = LimitState({ + remaining: remainingLimit( + callSpec.constraints[j].limit, + session.params[callSpec.target][callSpec.selector][j], + account + ), + target: callSpec.target, + selector: callSpec.selector, + index: callSpec.constraints[j].index + }); + } + } + } + + // shrink array to actual size + assembly { + mstore(callParams, paramLimitIndex) + } + + return + SessionState({ + status: session.status[account], + feesRemaining: remainingLimit(spec.feeLimit, session.fee, account), + transferValue: transferValue, + callValue: callValue, + callParams: callParams + }); + } +} diff --git a/packages/contracts/src/libraries/SignatureDecoder.sol b/packages/contracts/src/libraries/SignatureDecoder.sol index 70a7fb46..ea48fdae 100644 --- a/packages/contracts/src/libraries/SignatureDecoder.sol +++ b/packages/contracts/src/libraries/SignatureDecoder.sol @@ -11,11 +11,6 @@ library SignatureDecoder { (signature, validator, hookData) = abi.decode(txSignature, (bytes, address, bytes[])); } - // Decode transaction.signature into hook data - function decodeSignatureOnlyHookData(bytes calldata txSignature) internal pure returns (bytes[] memory hookData) { - (hookData) = abi.decode(txSignature, (bytes[])); - } - // Decode signature into signature and validator function decodeSignatureNoHookData( bytes memory signatureAndValidator diff --git a/packages/contracts/src/libraries/SsoStorage.sol b/packages/contracts/src/libraries/SsoStorage.sol index f9ea5ae4..e98e81b8 100644 --- a/packages/contracts/src/libraries/SsoStorage.sol +++ b/packages/contracts/src/libraries/SsoStorage.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.24; library SsoStorage { - //keccak256('clave.contracts.ClaveStorage') - 1 bytes32 private constant SSO_STORAGE_SLOT = 0x3248da1aeae8bd923cbf26901dc4bfc6bb48bb0fbc5b6102f1151fe7012884f4; struct Layout { diff --git a/packages/contracts/src/managers/HookManager.sol b/packages/contracts/src/managers/HookManager.sol index a187703a..23717a62 100644 --- a/packages/contracts/src/managers/HookManager.sol +++ b/packages/contracts/src/managers/HookManager.sol @@ -12,7 +12,6 @@ import { Errors } from "../libraries/Errors.sol"; import { IExecutionHook, IValidationHook } from "../interfaces/IHook.sol"; import { IInitable } from "../interfaces/IInitable.sol"; import { IHookManager } from "../interfaces/IHookManager.sol"; -import { IHook } from "../interfaces/IERC7579Module.sol"; /** * @title Manager contract for hooks @@ -33,17 +32,6 @@ abstract contract HookManager is IHookManager, Auth { error HookPostCheckFailed(); error HookAlreadyInstalled(address currentHook); - modifier withHook() { - address hook = _getHook(); - if (hook == address(0)) { - _; - } else { - bytes memory hookData = IHook(hook).preCheck(msg.sender, msg.value, msg.data); - _; - IHook(hook).postCheck(hookData); - } - } - function _setHook(address hook) internal virtual { bytes32 slot = CONTEXT_KEY; assembly { @@ -61,12 +49,10 @@ abstract contract HookManager is IHookManager, Auth { // add to ZKsync flow _executionHooksLinkedList().add(hook); - IHook(hook).onInstall(data); } function _uninstallHook(address hook, bytes calldata data) internal virtual { _setHook(address(0)); - IHook(hook).onUninstall(data); } function _getHook() internal view returns (address _hook) { @@ -131,14 +117,15 @@ abstract contract HookManager is IHookManager, Auth { mapping(address => address) storage validationHooks = _validationHooksLinkedList(); address cursor = validationHooks[AddressLinkedList.SENTINEL_ADDRESS]; - uint256 idx = 0; + uint256 idx; // Iterate through hooks while (cursor > AddressLinkedList.SENTINEL_ADDRESS) { // Call it with corresponding hookData bool success = _call( cursor, - abi.encodeWithSelector(IValidationHook.validationHook.selector, signedHash, transaction, hookData[idx++]) + abi.encodeCall(IValidationHook.validationHook, (signedHash, transaction, hookData[idx])) ); + ++idx; if (!success) { return false; diff --git a/packages/contracts/src/managers/ModuleManager.sol b/packages/contracts/src/managers/ModuleManager.sol index e27bb876..96cca418 100644 --- a/packages/contracts/src/managers/ModuleManager.sol +++ b/packages/contracts/src/managers/ModuleManager.sol @@ -12,7 +12,6 @@ import { IModule } from "../interfaces/IModule.sol"; import { IInitable } from "../interfaces/IInitable.sol"; import { ISsoAccount } from "../interfaces/ISsoAccount.sol"; import { IModuleManager } from "../interfaces/IModuleManager.sol"; -import { IERC7579Module, IExecutor } from "../interfaces/IERC7579Module.sol"; /** * @title Manager contract for modules @@ -95,24 +94,18 @@ abstract contract ModuleManager is IModuleManager, Auth { function _addExternalExecutorPermission(address module, bytes calldata data) internal virtual { _externalExecutorModule().add(module); - IERC7579Module(module).onInstall(data); - emit AddModule(module); } function _addFallbackModule(address module, bytes calldata data) internal virtual { SsoStorage.layout().fallbackContractBySelector[bytes4(data[0:4])] = module; - IERC7579Module(module).onInstall(data); - emit AddModule(module); } function _removeFallbackModule(address module, bytes calldata data) internal virtual { SsoStorage.layout().fallbackContractBySelector[bytes4(data[0:4])] = address(0); - IERC7579Module(module).onUninstall(data); - emit RemoveModule(module); } @@ -140,8 +133,6 @@ abstract contract ModuleManager is IModuleManager, Auth { function _removeExternalExecutorModule(address module, bytes calldata data) internal { _externalExecutorModule().remove(module); - IExecutor(module).onUninstall(data); - emit RemoveModule(module); } diff --git a/packages/contracts/src/managers/UpgradeManager.sol b/packages/contracts/src/managers/UpgradeManager.sol deleted file mode 100644 index 3b093d74..00000000 --- a/packages/contracts/src/managers/UpgradeManager.sol +++ /dev/null @@ -1,43 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity ^0.8.24; - -import { Errors } from "../libraries/Errors.sol"; -import { Auth } from "../auth/Auth.sol"; - -import { IUpgradeManager } from "../interfaces/IUpgradeManager.sol"; - -/** - * @title Upgrade Manager - * @notice Abstract contract for managing the upgrade process of the account - * @author https://getclave.io - */ -abstract contract UpgradeManager is IUpgradeManager, Auth { - // keccak-256 of "eip1967.proxy.implementation" subtracted by 1 - bytes32 private constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; - - /// @inheritdoc IUpgradeManager - function upgradeTo(address newImplementation) external override onlySelf { - address oldImplementation; - assembly { - oldImplementation := and(sload(_IMPLEMENTATION_SLOT), 0xffffffffffffffffffffffffffffffffffffffff) - } - if (oldImplementation == newImplementation) { - revert Errors.SAME_IMPLEMENTATION(); - } - assembly { - sstore(_IMPLEMENTATION_SLOT, newImplementation) - } - - emit Upgraded(oldImplementation, newImplementation); - } - - /// @inheritdoc IUpgradeManager - function implementation() external view override returns (address) { - address impl; - assembly { - impl := and(sload(_IMPLEMENTATION_SLOT), 0xffffffffffffffffffffffffffffffffffffffff) - } - - return impl; - } -} diff --git a/packages/contracts/src/validators/PasskeyValidator.sol b/packages/contracts/src/validators/PasskeyValidator.sol index cb3a5b97..5169900e 100644 --- a/packages/contracts/src/validators/PasskeyValidator.sol +++ b/packages/contracts/src/validators/PasskeyValidator.sol @@ -9,8 +9,6 @@ import { VerifierCaller } from "../helpers/VerifierCaller.sol"; import { JsmnSolLib } from "../libraries/JsmnSolLib.sol"; import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; -import "../helpers/Logger.sol"; - /** * @title validator contract for passkey r1 signatures * @author https://getclave.io diff --git a/packages/contracts/src/validators/SessionKeyValidator.sol b/packages/contracts/src/validators/SessionKeyValidator.sol index 30017f21..ccdb4f3b 100644 --- a/packages/contracts/src/validators/SessionKeyValidator.sol +++ b/packages/contracts/src/validators/SessionKeyValidator.sol @@ -1,7 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.23; -import "../interfaces/IERC7579Module.sol"; import { EnumerableSet } from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import { IERC165 } from "@openzeppelin/contracts/utils/introspection/IERC165.sol"; @@ -10,296 +9,13 @@ import { IValidationHook } from "../interfaces/IHook.sol"; import { IModuleValidator } from "../interfaces/IModuleValidator.sol"; import { Transaction } from "@matterlabs/zksync-contracts/l2/system-contracts/libraries/TransactionHelper.sol"; -import { IHook } from "../interfaces/IERC7579Module.sol"; import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import { IHookManager } from "../interfaces/IHookManager.sol"; import { IValidatorManager } from "../interfaces/IValidatorManager.sol"; +import { SessionLib } from "../libraries/SessionLib.sol"; -library SessionLib { - using SessionLib for SessionLib.Constraint; - using SessionLib for SessionLib.UsageLimit; - - // We do not permit session keys to be reused to open multiple sessions - // (after one expires or is closed, e.g.). - // For each session key, its session status can only be changed - // from NotInitialized to Active, and from Active to Closed. - enum Status { - NotInitialized, - Active, - Closed - } - - // This struct is used to track usage information for each session. - // Along with `status`, this is considered the session state. - // While everything else is considered the session spec, and is stored offchain. - // Storage layout of this struct is weird to conform to ERC-7562 storage access restrictions during validation. - // Each innermost mapping is always mapping(address account => ...). - struct SessionStorage { - mapping(address => Status) status; - UsageTracker fee; - // (target) => transfer value tracker - mapping(address => UsageTracker) transferValue; - // (target, selector) => call value tracker - mapping(address => mapping(bytes4 => UsageTracker)) callValue; - // (target, selector, index) => call parameter tracker - // index is the constraint index in callPolicy, not the parameter index - mapping(address => mapping(bytes4 => mapping(uint256 => UsageTracker))) params; - } - - struct Constraint { - Condition condition; - uint64 index; - bytes32 refValue; - UsageLimit limit; - } - - struct UsageTracker { - // Used for LimitType.Lifetime - mapping(address => uint256) lifetimeUsage; - // Used for LimitType.Allowance - // period => used that period - mapping(uint256 => mapping(address => uint256)) allowanceUsage; - } - - struct UsageLimit { - LimitType limitType; - uint256 limit; // ignored if limitType == Unlimited - uint256 period; // ignored if limitType != Allowance - } - - enum LimitType { - Unlimited, - Lifetime, - Allowance - } - - enum Condition { - Unconstrained, - Equal, - Greater, - Less, - GreaterOrEqual, - LessOrEqual, - NotEqual - } - - struct SessionSpec { - address signer; - uint256 expiresAt; - UsageLimit feeLimit; - CallSpec[] callPolicies; - TransferSpec[] transferPolicies; - } - - struct CallSpec { - address target; - bytes4 selector; - uint256 maxValuePerUse; - UsageLimit valueLimit; - Constraint[] constraints; - // add max data length restriction? - // add max number of calls restriction? - } - - struct TransferSpec { - address target; - uint256 maxValuePerUse; - UsageLimit valueLimit; - } - - struct LimitState { - // this might also be limited by a constraint or `maxValuePerUse`, - // which is not reflected here - uint256 remaining; - address target; - // ignored for transfer value - bytes4 selector; - // ignored for transfer and call value - uint256 index; - } - - // Info about remaining session limits and its status - struct SessionState { - Status status; - uint256 feesRemaining; - LimitState[] transferValue; - LimitState[] callValue; - LimitState[] callParams; - } - - function checkAndUpdate(UsageLimit memory limit, UsageTracker storage tracker, uint256 value) internal { - if (limit.limitType == LimitType.Lifetime) { - require(tracker.lifetimeUsage[msg.sender] + value <= limit.limit, "Lifetime limit exceeded"); - tracker.lifetimeUsage[msg.sender] += value; - } - // TODO: uncomment when it's possible to check timestamps during validation - // if (limit.limitType == LimitType.Allowance) { - // uint256 period = block.timestamp / limit.period; - // require(tracker.allowanceUsage[period] + value <= limit.limit); - // tracker.allowanceUsage[period] += value; - // } - } - - function checkAndUpdate(Constraint memory constraint, UsageTracker storage tracker, bytes calldata data) internal { - uint256 index = 4 + constraint.index * 32; - bytes32 param = bytes32(data[index:index + 32]); - Condition condition = constraint.condition; - bytes32 refValue = constraint.refValue; - - if (condition == Condition.Equal) { - require(param == refValue, "EQUAL constraint not met"); - } else if (condition == Condition.Greater) { - require(param > refValue, "GREATER constraint not met"); - } else if (condition == Condition.Less) { - require(param < refValue, "LESS constraint not met"); - } else if (condition == Condition.GreaterOrEqual) { - require(param >= refValue, "GREATER_OR_EQUAL constraint not met"); - } else if (condition == Condition.LessOrEqual) { - require(param <= refValue, "LESS_OR_EQUAL constraint not met"); - } else if (condition == Condition.NotEqual) { - require(param != refValue, "NOT_EQUAL constraint not met"); - } - - constraint.limit.checkAndUpdate(tracker, uint256(param)); - } - - function validate(SessionStorage storage state, Transaction calldata transaction, SessionSpec memory spec) internal { - require(state.status[msg.sender] == Status.Active, "Session is not active"); - - // TODO uncomment when it's possible to check timestamps during validation - // require(block.timestamp <= session.expiresAt); - - // TODO: update fee allowance with the gasleft/refund at the end of execution - uint256 fee = transaction.maxFeePerGas * transaction.gasLimit; - spec.feeLimit.checkAndUpdate(state.fee, fee); - - address target = address(uint160(transaction.to)); - - if (transaction.data.length >= 4) { - bytes4 selector = bytes4(transaction.data[:4]); - CallSpec memory callPolicy; - bool found = false; - - for (uint256 i = 0; i < spec.callPolicies.length; i++) { - if (spec.callPolicies[i].target == target && spec.callPolicies[i].selector == selector) { - callPolicy = spec.callPolicies[i]; - found = true; - break; - } - } - - require(found, "Call not allowed"); - require(transaction.value <= callPolicy.maxValuePerUse, "Value exceeds limit"); - callPolicy.valueLimit.checkAndUpdate(state.callValue[target][selector], transaction.value); - - for (uint256 i = 0; i < callPolicy.constraints.length; i++) { - callPolicy.constraints[i].checkAndUpdate(state.params[target][selector][i], transaction.data); - } - } else { - TransferSpec memory transferPolicy; - bool found = false; - - for (uint256 i = 0; i < spec.transferPolicies.length; i++) { - if (spec.transferPolicies[i].target == target) { - transferPolicy = spec.transferPolicies[i]; - found = true; - break; - } - } - - require(found, "Transfer not allowed"); - require(transaction.value <= transferPolicy.maxValuePerUse, "Value exceeds limit"); - transferPolicy.valueLimit.checkAndUpdate(state.transferValue[target], transaction.value); - } - } - - function remainingLimit( - UsageLimit memory limit, - UsageTracker storage tracker, - address account - ) internal view returns (uint256) { - if (limit.limitType == LimitType.Unlimited) { - // this might be still limited by `maxValuePerUse` or a constraint - return type(uint256).max; - } - if (limit.limitType == LimitType.Lifetime) { - return limit.limit - tracker.lifetimeUsage[account]; - } - if (limit.limitType == LimitType.Allowance) { - // this is not used during validation, so it's fine to use block.timestamp - uint256 period = block.timestamp / limit.period; - return limit.limit - tracker.allowanceUsage[period][account]; - } - } - - function getState( - SessionStorage storage session, - address account, - SessionSpec calldata spec - ) internal view returns (SessionState memory) { - uint256 totalConstraints = 0; - for (uint256 i = 0; i < spec.callPolicies.length; i++) { - totalConstraints += spec.callPolicies[i].constraints.length; - } - - LimitState[] memory transferValue = new LimitState[](spec.transferPolicies.length); - LimitState[] memory callValue = new LimitState[](spec.callPolicies.length); - LimitState[] memory callParams = new LimitState[](totalConstraints); // there will be empty ones at the end - uint256 paramLimitIndex = 0; - - for (uint256 i = 0; i < transferValue.length; i++) { - TransferSpec memory transferSpec = spec.transferPolicies[i]; - transferValue[i] = LimitState({ - remaining: remainingLimit(transferSpec.valueLimit, session.transferValue[transferSpec.target], account), - target: spec.transferPolicies[i].target, - selector: bytes4(0), - index: 0 - }); - } - - for (uint256 i = 0; i < callValue.length; i++) { - CallSpec memory callSpec = spec.callPolicies[i]; - callValue[i] = LimitState({ - remaining: remainingLimit(callSpec.valueLimit, session.callValue[callSpec.target][callSpec.selector], account), - target: callSpec.target, - selector: callSpec.selector, - index: 0 - }); - - for (uint256 j = 0; j < callSpec.constraints.length; j++) { - if (callSpec.constraints[j].limit.limitType != LimitType.Unlimited) { - callParams[paramLimitIndex++] = LimitState({ - remaining: remainingLimit( - callSpec.constraints[j].limit, - session.params[callSpec.target][callSpec.selector][j], - account - ), - target: callSpec.target, - selector: callSpec.selector, - index: callSpec.constraints[j].index - }); - } - } - } - - // shrink array to actual size - assembly { - mstore(callParams, paramLimitIndex) - } - - return - SessionState({ - status: session.status[account], - feesRemaining: remainingLimit(spec.feeLimit, session.fee, account), - transferValue: transferValue, - callValue: callValue, - callParams: callParams - }); - } -} - -contract SessionKeyValidator is IHook, IValidationHook, IModuleValidator, IModule { +contract SessionKeyValidator is IValidationHook, IModuleValidator, IModule { using SessionLib for SessionLib.SessionStorage; using EnumerableSet for EnumerableSet.Bytes32Set; @@ -358,15 +74,6 @@ contract SessionKeyValidator is IHook, IValidationHook, IModuleValidator, IModul } } - function onInstall(bytes calldata data) external override { - // TODO - } - - function onUninstall(bytes calldata) external override { - // TODO - _uninstall(); - } - function disable() external { if (_isInitialized(msg.sender)) { _uninstall(); @@ -456,27 +163,4 @@ contract SessionKeyValidator is IHook, IValidationHook, IModuleValidator, IModul function version() external pure returns (string memory) { return "0.0.0"; } - - /* - * Does validation and hooks transaction depending on the key - * @param typeID The type ID to check - * @return true if the module is of the given type, false otherwise - */ - function isModuleType(uint256 typeID) external pure override returns (bool) { - return typeID == MODULE_TYPE_VALIDATOR; - } - - /* - * Look at the transaction data to parse out what needs to be done - */ - function preCheck( - address msgSender, - uint256 msgValue, - bytes calldata msgData - ) external returns (bytes memory hookData) {} - - /* - * Validate data from the pre-check hook after the transaction is executed - */ - function postCheck(bytes calldata hookData) external {} } diff --git a/packages/contracts/src/validators/WebAuthValidator.sol b/packages/contracts/src/validators/WebAuthValidator.sol index dd044e88..883ceb5f 100644 --- a/packages/contracts/src/validators/WebAuthValidator.sol +++ b/packages/contracts/src/validators/WebAuthValidator.sol @@ -4,8 +4,6 @@ pragma solidity ^0.8.24; import { IModuleValidator } from "../interfaces/IModuleValidator.sol"; import "./PasskeyValidator.sol"; -import "../helpers/Logger.sol"; - /** * @title validator contract for passkey r1 signatures * @author https://getclave.io @@ -29,10 +27,6 @@ contract WebAuthValidator is PasskeyValidator, IModuleValidator { } function handleValidation(bytes32 signedHash, bytes memory signature) external view returns (bool) { - // Printing this hash makes capturing this for a replay test easier - Logger.logString("signed hash"); - Logger.logBytes32(signedHash); - return webAuthVerify(signedHash, signature); } @@ -42,13 +36,11 @@ contract WebAuthValidator is PasskeyValidator, IModuleValidator { ); if (rs[1] > lowSmax) { - Logger.logString("malleability check failed"); return false; } // check if the flags are set if (authenticatorData[32] & AUTH_DATA_MASK != AUTH_DATA_MASK) { - Logger.logString("auth data mask failed"); return false; } @@ -56,8 +48,6 @@ contract WebAuthValidator is PasskeyValidator, IModuleValidator { // TODO: test if the parse fails for more than 10 elements, otherwise can have a malicious header (uint returnValue, JsmnSolLib.Token[] memory tokens, uint actualNum) = JsmnSolLib.parse(clientDataJSON, 20); if (returnValue != 0) { - Logger.logString("failed to parse json"); - Logger.logUint(returnValue); return false; } @@ -76,38 +66,30 @@ contract WebAuthValidator is PasskeyValidator, IModuleValidator { string memory challengeValue = JsmnSolLib.getBytes(clientDataJSON, nextT.start, nextT.end); // this should only be set once, otherwise this is an error if (validChallenge) { - Logger.logString("duplicate challenge, bad json!"); return false; } // this is the key part to ensure the signature is for the provided transaction bytes memory challengeDataArray = Base64.decode(challengeValue); if (challengeDataArray.length != 32) { // wrong hash size - Logger.logString("invalid hash data length in json challenge field"); return false; } bytes32 challengeData = abi.decode(challengeDataArray, (bytes32)); validChallenge = challengeData == transactionHash; - Logger.logString("validChallenge"); - Logger.logBool(validChallenge); } else if (Strings.equal(keyOrValue, "type")) { JsmnSolLib.Token memory nextT = tokens[index + 1]; string memory typeValue = JsmnSolLib.getBytes(clientDataJSON, nextT.start, nextT.end); // this should only be set once, otherwise this is an error if (validType) { - Logger.logString("duplicate type field, bad json"); return false; } validType = Strings.equal("webauthn.get", typeValue); - Logger.logString("valid type"); - Logger.logBool(validType); } else if (Strings.equal(keyOrValue, "origin")) { JsmnSolLib.Token memory nextT = tokens[index + 1]; string memory originValue = JsmnSolLib.getBytes(clientDataJSON, nextT.start, nextT.end); // this should only be set once, otherwise this is an error if (validOrigin) { - Logger.logString("duplicate origin field, bad json"); return false; } pubKey[0] = lowerKeyHalf[originValue][msg.sender]; @@ -121,7 +103,6 @@ contract WebAuthValidator is PasskeyValidator, IModuleValidator { } if (!validChallenge || !validType) { - Logger.logString("invalid challenge or type"); return false; } diff --git a/packages/contracts/test/BasicTest.ts b/packages/contracts/test/BasicTest.ts index f93672fe..39dd125b 100644 --- a/packages/contracts/test/BasicTest.ts +++ b/packages/contracts/test/BasicTest.ts @@ -70,8 +70,10 @@ describe("Basic tests", function () { ...await aaTxTemplate(), to: target, value, + gasLimit: 300_000n, }; - aaTx.gasLimit = await provider.estimateGas(aaTx); + // TODO: fix gas estimation + // aaTx.gasLimit = await provider.estimateGas(aaTx); const signedTransaction = await smartAccount.signTransaction(aaTx); assert(signedTransaction != null, "valid transaction to sign"); @@ -113,11 +115,13 @@ describe("Basic tests", function () { const aaTx = { ...await aaTxTemplate(), - to: await account.BATCH_CALLER(), + to: proxyAccountAddress, data: account.interface.encodeFunctionData("batchCall", [calls]), - // value: value * 2n, + value: value * 2n, + gasLimit: 300_000n, }; - aaTx.gasLimit = await provider.estimateGas(aaTx); + // TODO: fix gas estimation + // aaTx.gasLimit = await provider.estimateGas(aaTx); const signedTransaction = await smartAccount.signTransaction(aaTx); assert(signedTransaction != null, "valid transaction to sign"); @@ -126,8 +130,8 @@ describe("Basic tests", function () { const receipt = await tx.wait(); const fee = receipt.gasUsed * aaTx.gasPrice; - expect(await provider.getBalance(proxyAccountAddress)).to.equal(balanceBefore - value * 2n - fee, "invalid final account balance"); - expect(await provider.getBalance(target1)).to.equal(value, "invalid final target balance"); - expect(await provider.getBalance(target2)).to.equal(value, "invalid final target balance"); + expect(await provider.getBalance(proxyAccountAddress)).to.equal(balanceBefore - value * 2n - fee, "invalid final own balance"); + expect(await provider.getBalance(target1)).to.equal(value, "invalid final target-1 balance"); + expect(await provider.getBalance(target2)).to.equal(value, "invalid final target-2 balance"); }); }); diff --git a/packages/contracts/test/ErrorChecker.sol b/packages/contracts/test/ErrorChecker.sol deleted file mode 100644 index a30e9adf..00000000 --- a/packages/contracts/test/ErrorChecker.sol +++ /dev/null @@ -1,12 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import { Test, console } from "forge-std/Test.sol"; - -contract CounterTest is Test { - error INVALID_PUBKEY_LENGTH(); - - function test() public { - console.logBytes4(INVALID_PUBKEY_LENGTH.selector); - } -} diff --git a/packages/contracts/test/signed-ethers-passkey.json b/packages/contracts/test/signed-ethers-passkey.json deleted file mode 100644 index fa3d5f6d..00000000 --- a/packages/contracts/test/signed-ethers-passkey.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "response": { - "id": "TLyvghfSw-IRdz8cgyzf97Rp7X1jMZtk1VmKyNygOudGtVrGLCcXNid98nLGVNbX", - "rawId": "TLyvghfSw-IRdz8cgyzf97Rp7X1jMZtk1VmKyNygOudGtVrGLCcXNid98nLGVNbX", - "response": { - "authenticatorData": "SZYN5YgOjGh0NBcPZHZgW4_krrmihjLHmVzzuoMdl2MFAAAABA", - "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoiQkxrdXAxMHk0UlNlb0JXQXlWMUxWN1dWWHVtSFBOOGRXajJlSjdVT3VfZyIsIm9yaWdpbiI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTE3MyIsImNyb3NzT3JpZ2luIjpmYWxzZX0", - "signature": "MEUCIBgtyYxjK82OrM4XLOFY-58KlNbRKb8ynIJtifWfDZqzAiEAop1VCRg9GpoXIbcfimvzhrfv70CoNnM0q3kBBSY8Tqw", - "userHandle": "j6gLo08UdBc_6-KvkOGTm8zvR3EfoE_HEq8loTryepU" - }, - "type": "public-key", - "clientExtensionResults": {}, - "authenticatorAttachment": "cross-platform" - }, - "expectedChallenge": "BLkup10y4RSeoBWAyV1LV7WVXumHPN8dWj2eJ7UOu_g", - "expectedOrigin": "http://localhost:5173", - "expectedRPID": "localhost", - "authenticator": { - "credentialPublicKey": { - "0": 165, - "1": 1, - "2": 2, - "3": 3, - "4": 38, - "5": 32, - "6": 1, - "7": 33, - "8": 88, - "9": 32, - "10": 76, - "11": 188, - "12": 175, - "13": 130, - "14": 23, - "15": 210, - "16": 195, - "17": 226, - "18": 17, - "19": 119, - "20": 63, - "21": 28, - "22": 131, - "23": 150, - "24": 13, - "25": 106, - "26": 171, - "27": 185, - "28": 177, - "29": 137, - "30": 199, - "31": 228, - "32": 26, - "33": 251, - "34": 189, - "35": 133, - "36": 1, - "37": 51, - "38": 129, - "39": 72, - "40": 16, - "41": 72, - "42": 34, - "43": 88, - "44": 32, - "45": 189, - "46": 115, - "47": 127, - "48": 205, - "49": 118, - "50": 14, - "51": 215, - "52": 204, - "53": 204, - "54": 90, - "55": 233, - "56": 168, - "57": 81, - "58": 247, - "59": 151, - "60": 72, - "61": 6, - "62": 170, - "63": 12, - "64": 60, - "65": 60, - "66": 213, - "67": 136, - "68": 98, - "69": 178, - "70": 207, - "71": 211, - "72": 120, - "73": 220, - "74": 114, - "75": 183, - "76": 231 - }, - "credentialID": "TLyvghfSw-IRdz8cgyzf97Rp7X1jMZtk1VmKyNygOudGtVrGLCcXNid98nLGVNbX", - "counter": 0 - } -} diff --git a/packages/contracts/test/signed-viem-challenge.json b/packages/contracts/test/signed-viem-challenge.json deleted file mode 100644 index 108c03d4..00000000 --- a/packages/contracts/test/signed-viem-challenge.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "response": { - "id": "yCIvhkxt1ZrS42chRctZVfoZkaCKvznXxv9_MVobyOtenNjovPZHajOa5OItSAcw", - "rawId": "yCIvhkxt1ZrS42chRctZVfoZkaCKvznXxv9_MVobyOtenNjovPZHajOa5OItSAcw", - "response": { - "authenticatorData": "SZYN5YgOjGh0NBcPZHZgW4_krrmihjLHmVzzuoMdl2MFAAAABg", - "clientDataJSON": "eyJ0eXBlIjoid2ViYXV0aG4uZ2V0IiwiY2hhbGxlbmdlIjoicXFnUzVnNmxHWllKUElzbllBMnRGbVpWWFg5RnJTeUlsdUdLM08td1l1dyIsIm9yaWdpbiI6Imh0dHA6Ly9sb2NhbGhvc3Q6NTE3MyIsImNyb3NzT3JpZ2luIjpmYWxzZX0", - "signature": "MEUCIExKAj_HniamQ8E6zbk3sedervbZvM3q-II6Vnu_byqmAiEAr8Rh7IPhtnoRNW2-Ox_0PrjtptE2LVXiW7-6kga2jHk", - "userHandle": "8T0HqTt-G9PrKXHZGwRQg-CnkiP2OW8JrK4iTPCfdwk" - }, - "type": "public-key", - "clientExtensionResults": {}, - "authenticatorAttachment": "cross-platform" - }, - "expectedChallenge": "qqgS5g6lGZYJPIsnYA2tFmZVXX9FrSyIluGK3O-wYuw", - "expectedOrigin": "http://localhost:5173", - "expectedRPID": "localhost", - "authenticator": { - "credentialPublicKey": { - "0": 165, - "1": 1, - "2": 2, - "3": 3, - "4": 38, - "5": 32, - "6": 1, - "7": 33, - "8": 88, - "9": 32, - "10": 200, - "11": 34, - "12": 47, - "13": 134, - "14": 76, - "15": 109, - "16": 213, - "17": 154, - "18": 210, - "19": 227, - "20": 103, - "21": 33, - "22": 69, - "23": 173, - "24": 219, - "25": 33, - "26": 14, - "27": 238, - "28": 69, - "29": 60, - "30": 60, - "31": 142, - "32": 44, - "33": 249, - "34": 166, - "35": 31, - "36": 67, - "37": 13, - "38": 181, - "39": 189, - "40": 182, - "41": 161, - "42": 34, - "43": 88, - "44": 32, - "45": 250, - "46": 94, - "47": 184, - "48": 133, - "49": 18, - "50": 62, - "51": 251, - "52": 150, - "53": 158, - "54": 228, - "55": 143, - "56": 66, - "57": 232, - "58": 17, - "59": 161, - "60": 47, - "61": 6, - "62": 69, - "63": 175, - "64": 222, - "65": 35, - "66": 55, - "67": 212, - "68": 233, - "69": 86, - "70": 147, - "71": 230, - "72": 149, - "73": 59, - "74": 218, - "75": 193, - "76": 255 - }, - "credentialID": "yCIvhkxt1ZrS42chRctZVfoZkaCKvznXxv9_MVobyOtenNjovPZHajOa5OItSAcw", - "counter": 0 - } -} diff --git a/packages/contracts/test/utils.ts b/packages/contracts/test/utils.ts index e1994bca..853f38a3 100644 --- a/packages/contracts/test/utils.ts +++ b/packages/contracts/test/utils.ts @@ -141,7 +141,7 @@ export const getProviderL1 = () => { return provider; }; -export async function deployFactory(wallet: Wallet, implAddress: string, expectedAddress?: string): Promise { +export async function deployFactory(wallet: Wallet, implAddress: string): Promise { const factoryArtifact = JSON.parse(await promises.readFile("artifacts-zk/src/AAFactory.sol/AAFactory.json", "utf8")); const proxyAaArtifact = JSON.parse(await promises.readFile("artifacts-zk/src/AccountProxy.sol/AccountProxy.json", "utf8")); @@ -154,12 +154,6 @@ export async function deployFactory(wallet: Wallet, implAddress: string, expecte ); const factoryAddress = await factory.getAddress(); - if (expectedAddress && factoryAddress != expectedAddress) { - console.warn(`AAFactory.sol address is not the expected default address (${expectedAddress}).`); - console.warn(`Please update the default value in your tests or restart Era Test Node. Proceeding with expected default address...`); - return AAFactory__factory.connect(expectedAddress, wallet); - } - if (hre.network.config.verifyURL) { logInfo(`Requesting contract verification...`); logInfo(`src/AAFactory.sol:AAFactory`); @@ -220,8 +214,7 @@ export const create2 = async (contractName: string, wallet: Wallet, salt: ethers const standardCreate2Address = utils.create2Address(wallet.address, bytecodeHash, salt, args ? constructorArgs : "0x"); const accountCode = await wallet.provider.getCode(standardCreate2Address); if (accountCode != "0x") { - logInfo(`${contractArtifact.sourceName}:${contractName}`); - logInfo("Contract already exists!"); + logInfo(`Contract ${contractName} already exists!`); // if (hre.network.config.verifyURL) { // logInfo(`Requesting contract verification...`); // await verifyContract({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b642aa9b..92987d01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -173,10 +173,10 @@ importers: version: 10.0.0 '@wagmi/core': specifier: ^2.13.3 - version: 2.14.1(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) + version: 2.14.1(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) '@web3modal/wagmi': specifier: ^5.1.11 - version: 5.1.11(z4ckkpcr7ps35i3orwxcoxemza) + version: 5.1.11(5j7jpllrx6ok2s4ilftvrlnbie) ethers: specifier: ^6.13.2 version: 6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -191,7 +191,7 @@ importers: version: 3.5.13(typescript@5.6.2) wagmi: specifier: ^2.12.17 - version: 2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + version: 2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(bufferutil@4.0.8)(immer@10.0.2)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) zksync-ethers: specifier: ^6.15.0 version: 6.15.0(ethers@6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) @@ -252,10 +252,10 @@ importers: version: 11.1.0(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.0)(bufferutil@4.0.8)(eslint@9.11.1(jiti@2.3.3))(idb-keyval@6.2.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.0)(sass@1.80.4)(terser@5.36.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(vite@5.4.10(@types/node@22.8.0)(sass@1.80.4)(terser@5.36.0)))(rollup@4.24.0)(vue@3.5.13(typescript@5.6.2)) '@wagmi/core': specifier: ^2.13.3 - version: 2.14.1(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) + version: 2.14.1(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) '@web3modal/wagmi': specifier: ^5.1.11 - version: 5.1.11(z4ckkpcr7ps35i3orwxcoxemza) + version: 5.1.11(5j7jpllrx6ok2s4ilftvrlnbie) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -394,10 +394,10 @@ importers: version: 11.1.0(magicast@0.3.5)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.0)(bufferutil@4.0.8)(eslint@9.11.1(jiti@2.3.3))(idb-keyval@6.2.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.0)(sass@1.80.4)(terser@5.36.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(vite@5.4.10(@types/node@22.8.0)(sass@1.80.4)(terser@5.36.0)))(rollup@4.24.0)(vue@3.5.13(typescript@5.6.2)) '@wagmi/core': specifier: ^2.13.3 - version: 2.14.1(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) + version: 2.14.1(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) '@wagmi/vue': specifier: ^0.0.49 - version: 0.0.49(@tanstack/query-core@5.59.16)(@tanstack/vue-query@5.59.16(vue@3.5.13(typescript@5.6.2)))(bufferutil@4.0.8)(ioredis@5.4.1)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.0)(bufferutil@4.0.8)(eslint@9.11.1(jiti@2.3.3))(idb-keyval@6.2.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.0)(sass@1.80.4)(terser@5.36.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(vite@5.4.10(@types/node@22.8.0)(sass@1.80.4)(terser@5.36.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(vue@3.5.13(typescript@5.6.2))(zod@3.22.4) + version: 0.0.49(@tanstack/query-core@5.59.16)(@tanstack/vue-query@5.59.16(vue@3.5.13(typescript@5.6.2)))(bufferutil@4.0.8)(immer@10.0.2)(ioredis@5.4.1)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.0)(bufferutil@4.0.8)(eslint@9.11.1(jiti@2.3.3))(idb-keyval@6.2.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.0)(sass@1.80.4)(terser@5.36.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(vite@5.4.10(@types/node@22.8.0)(sass@1.80.4)(terser@5.36.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(vue@3.5.13(typescript@5.6.2))(zod@3.22.4) nuxt: specifier: ^3.12.3 version: 3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.0)(bufferutil@4.0.8)(eslint@9.11.1(jiti@2.3.3))(idb-keyval@6.2.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.0)(sass@1.80.4)(terser@5.36.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(vite@5.4.10(@types/node@22.8.0)(sass@1.80.4)(terser@5.36.0)) @@ -421,7 +421,7 @@ importers: version: 3.5.13(typescript@5.6.2) wagmi: specifier: ^2.12.17 - version: 2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + version: 2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(bufferutil@4.0.8)(immer@10.0.2)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) web3-avatar-vue: specifier: ^1.0.4 version: 1.0.4(typescript@5.6.2) @@ -437,6 +437,9 @@ importers: '@nomad-xyz/excessively-safe-call': specifier: ^0.0.1-rc.1 version: 0.0.1-rc.1 + '@nomicfoundation/hardhat-toolbox': + specifier: ^5.0.0 + version: 5.0.0(ch7u4fh2nxsstmvq3k4mazytsm) '@openzeppelin/contracts': specifier: 4.9.6 version: 4.9.6 @@ -557,7 +560,7 @@ importers: version: 10.0.1 '@wagmi/core': specifier: 2.x - version: 2.14.1(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) + version: 2.14.1(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) abitype: specifier: ^1.0.6 version: 1.0.6(typescript@5.6.2)(zod@3.22.4) @@ -2282,6 +2285,9 @@ packages: '@ethersproject/abstract-signer@5.7.0': resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + '@ethersproject/address@5.6.1': + resolution: {integrity: sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==} + '@ethersproject/address@5.7.0': resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} @@ -2306,6 +2312,12 @@ packages: '@ethersproject/hash@5.7.0': resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + '@ethersproject/hdnode@5.7.0': + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + + '@ethersproject/json-wallets@5.7.0': + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + '@ethersproject/keccak256@5.7.0': resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} @@ -2315,6 +2327,9 @@ packages: '@ethersproject/networks@5.7.1': resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + '@ethersproject/pbkdf2@5.7.0': + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + '@ethersproject/properties@5.7.0': resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} @@ -2333,15 +2348,27 @@ packages: '@ethersproject/signing-key@5.7.0': resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + '@ethersproject/solidity@5.7.0': + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + '@ethersproject/strings@5.7.0': resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} '@ethersproject/transactions@5.7.0': resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + '@ethersproject/units@5.7.0': + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + + '@ethersproject/wallet@5.7.0': + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + '@ethersproject/web@5.7.1': resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + '@ethersproject/wordlists@5.7.0': + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} @@ -2846,11 +2873,59 @@ packages: ethers: ^6.1.0 hardhat: ^2.0.0 + '@nomicfoundation/hardhat-ignition-ethers@0.15.7': + resolution: {integrity: sha512-pUZWQeFNMwDe6F/yKIJsCo+87elk/M/Edjp6AnWWIBplRyPa13Nh63+yOqMSSd9Mx9lLuBaEGnYXoI2Uz2wYZA==} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.4 + '@nomicfoundation/hardhat-ignition': ^0.15.7 + '@nomicfoundation/ignition-core': ^0.15.7 + ethers: ^6.7.0 + hardhat: ^2.18.0 + + '@nomicfoundation/hardhat-ignition@0.15.7': + resolution: {integrity: sha512-RFhGazR0/JqHxuuIxjjMmM+nWFqEvA7wcVqcX7vUqqmAIGuok4HhnWQH8aOvBaVguiXvvlFDJL0PIlxmkFgIUg==} + peerDependencies: + '@nomicfoundation/hardhat-verify': ^2.0.1 + hardhat: ^2.18.0 + + '@nomicfoundation/hardhat-network-helpers@1.0.12': + resolution: {integrity: sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA==} + peerDependencies: + hardhat: ^2.9.5 + + '@nomicfoundation/hardhat-toolbox@5.0.0': + resolution: {integrity: sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ==} + peerDependencies: + '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 + '@nomicfoundation/hardhat-ethers': ^3.0.0 + '@nomicfoundation/hardhat-ignition-ethers': ^0.15.0 + '@nomicfoundation/hardhat-network-helpers': ^1.0.0 + '@nomicfoundation/hardhat-verify': ^2.0.0 + '@typechain/ethers-v6': ^0.5.0 + '@typechain/hardhat': ^9.0.0 + '@types/chai': ^4.2.0 + '@types/mocha': '>=9.1.0' + '@types/node': '>=18.0.0' + chai: ^4.2.0 + ethers: ^6.4.0 + hardhat: ^2.11.0 + hardhat-gas-reporter: ^1.0.8 + solidity-coverage: ^0.8.1 + ts-node: '>=8.0.0' + typechain: ^8.3.0 + typescript: '>=4.5.0' + '@nomicfoundation/hardhat-verify@2.0.11': resolution: {integrity: sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==} peerDependencies: hardhat: ^2.0.4 + '@nomicfoundation/ignition-core@0.15.7': + resolution: {integrity: sha512-C4/0V/q2gNxKDt88cMr+Oxlf4NINQ7QgmJyciQ1/6UdCRUg+/Pgdgpd3vgGXQVTotq50Q/BU4ofNUAD/8HRqtg==} + + '@nomicfoundation/ignition-ui@0.15.7': + resolution: {integrity: sha512-pj2LmXylgbHOTNrkFqFrre/FAOjcwYl4VKIKVH/QMMBH/DatbiT8aC5n9o2fbLD8uwlPEesD+uXZuKCE71KFBg==} + '@nomicfoundation/slang-darwin-arm64@0.17.0': resolution: {integrity: sha512-O0q94EUtoWy9A5kOTOa9/khtxXDYnLqmuda9pQELurSiwbQEVCPQL8kb34VbOW+ifdre66JM/05Xw9JWhIZ9sA==} engines: {node: '>= 10'} @@ -3930,6 +4005,9 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@solidity-parser/parser@0.14.5': + resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} + '@solidity-parser/parser@0.18.0': resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} @@ -4183,6 +4261,9 @@ packages: '@types/chai@4.3.20': resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + '@types/concat-stream@1.6.1': + resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} + '@types/conventional-commits-parser@5.0.0': resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} @@ -4198,6 +4279,12 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/form-data@0.0.33': + resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} + + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -4222,6 +4309,9 @@ packages: '@types/lru-cache@5.1.1': resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/mocha@10.0.8': resolution: {integrity: sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==} @@ -4231,6 +4321,9 @@ packages: '@types/node-forge@1.3.11': resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} + '@types/node@10.17.60': + resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + '@types/node@18.15.13': resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} @@ -4243,6 +4336,9 @@ packages: '@types/node@22.8.0': resolution: {integrity: sha512-84rafSBHC/z1i1E3p0cJwKA+CfYDNSXX9WSZBRopjIzLET8oNt6ht2tei4C7izwDeEiLLfdeSVBv1egOH916hg==} + '@types/node@8.10.66': + resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -4255,6 +4351,9 @@ packages: '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + '@types/qs@6.9.17': + resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -4844,6 +4943,9 @@ packages: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true + abbrev@1.0.9: + resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -4909,6 +5011,9 @@ packages: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + aes-js@4.0.0-beta.5: resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} @@ -4929,6 +5034,10 @@ packages: amazon-cognito-identity-js@6.3.12: resolution: {integrity: sha512-s7NKDZgx336cp+oDeUtB2ZzT8jWJp/v2LWuYl+LQtMEODe22RF1IJ4nRiDATp+rp1pTffCZcm44Quw4jx2bqNg==} + amdefine@1.0.1: + resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} + engines: {node: '>=0.4.2'} + anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} @@ -4947,6 +5056,10 @@ packages: resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} engines: {node: '>=18'} + ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -4971,6 +5084,9 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + antlr4ts@0.5.0-alpha.4: + resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -5028,6 +5144,14 @@ packages: array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -5077,6 +5201,9 @@ packages: async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + async@1.5.2: + resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} + async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} @@ -5233,6 +5360,9 @@ packages: blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} @@ -5399,6 +5529,9 @@ packages: caniuse-lite@1.0.30001669: resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + cbor@8.1.0: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} @@ -5436,6 +5569,9 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} @@ -5530,6 +5666,10 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-table3@0.5.1: + resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} + engines: {node: '>=6'} + cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} @@ -5598,6 +5738,10 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + columnify@1.6.0: resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} engines: {node: '>=8.0.0'} @@ -5810,6 +5954,9 @@ packages: crossws@0.3.1: resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==} + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + cspell-config-lib@8.14.4: resolution: {integrity: sha512-cnUeJfniTiebqCaQmIUnbSrPrTH7xzKRQjJDHAEV0WYnOG2MhRXI13OzytdFdhkVBdStmgTzTCJKE7x+kmU2NA==} engines: {node: '>=18'} @@ -5942,6 +6089,9 @@ packages: drizzle-orm: optional: true + death@1.1.0: + resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -6095,9 +6245,16 @@ packages: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} + difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dijkstrajs@1.0.3: resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -6311,6 +6468,11 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} + escodegen@1.8.1: + resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} + engines: {node: '>=0.12.0'} + hasBin: true + eslint-config-flat-gitignore@0.3.0: resolution: {integrity: sha512-0Ndxo4qGhcewjTzw52TK06Mc00aDtHNTdeeW2JfONgDcLkRO/n/BteMRzNVpLQYxdCC/dFEilfM9fjjpGIJ9Og==} peerDependencies: @@ -6402,6 +6564,11 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@2.7.3: + resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} + engines: {node: '>=0.10.0'} + hasBin: true + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -6415,6 +6582,10 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} + estraverse@1.9.3: + resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} + engines: {node: '>=0.10.0'} + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -6437,6 +6608,14 @@ packages: resolution: {integrity: sha512-8YdplnuE1IK4xfqpf4iU7oBxnOYAc35934o083G8ao+8WM8QQtt/mVlAY6yIAdY1eMeLqg4Z//PZjJGmWGPMRg==} engines: {node: '>=14.0.0'} + eth-gas-reporter@0.2.27: + resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} + peerDependencies: + '@codechecks/client': ^0.1.0 + peerDependenciesMeta: + '@codechecks/client': + optional: true + eth-json-rpc-filters@6.0.1: resolution: {integrity: sha512-ITJTvqoCw6OVMLs7pI8f4gG92n/St6x80ACtHodeS+IXmO0w+t1T5OOzfSt7KLSMLRkVUoexV7tztLgDxg+iig==} engines: {node: '>=14.0.0'} @@ -6447,6 +6626,9 @@ packages: eth-rpc-errors@4.0.3: resolution: {integrity: sha512-Z3ymjopaoft7JDoxZcEb3pwdGh7yiYMhOwm2doUt6ASXlMavpNlK6Cre0+IMl2VSGyEU9rkiperQhp5iRxn5Pg==} + ethereum-bloom-filters@1.2.0: + resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} + ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} @@ -6466,6 +6648,9 @@ packages: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + ethers@6.13.2: resolution: {integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==} engines: {node: '>=14.0.0'} @@ -6474,6 +6659,10 @@ packages: resolution: {integrity: sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==} engines: {node: '>=14.0.0'} + ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + ethjs-util@0.1.6: resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -6689,6 +6878,10 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} + form-data@2.5.2: + resolution: {integrity: sha512-GgwY0PS7DbXqajuGf4OYlsrIu3zgxD6Vvql43IBhm6MahqA5SK/7mwhtNj2AdH2z35YR34ujJ7BN+3fFC3jP5Q==} + engines: {node: '>= 0.12'} + form-data@4.0.1: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} @@ -6712,6 +6905,10 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -6720,6 +6917,10 @@ packages: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} @@ -6728,6 +6929,9 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -6787,6 +6991,10 @@ packages: get-port-please@3.1.2: resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + get-port@3.2.0: + resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} + engines: {node: '>=4'} + get-stdin@9.0.0: resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} engines: {node: '>=12'} @@ -6806,6 +7014,10 @@ packages: get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + ghost-testrpc@0.0.2: + resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} + hasBin: true + giget@1.2.3: resolution: {integrity: sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==} hasBin: true @@ -6837,6 +7049,10 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + deprecated: Glob versions prior to v9 are no longer supported + glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} deprecated: Glob versions prior to v9 are no longer supported @@ -6858,6 +7074,14 @@ packages: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -6878,6 +7102,10 @@ packages: resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} engines: {node: '>=18'} + globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + globby@14.0.2: resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} @@ -6906,6 +7134,16 @@ packages: h3@1.13.0: resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hardhat-gas-reporter@1.0.10: + resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} + peerDependencies: + hardhat: ^2.0.2 + hardhat@2.22.15: resolution: {integrity: sha512-BpTGa9PE/sKAaHi4s/S1e9WGv63DR1m7Lzfd60C8gSEchDPfAJssVRSq0MZ2v2k76ig9m0kHAwVLf5teYwu/Mw==} hasBin: true @@ -6918,6 +7156,10 @@ packages: typescript: optional: true + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -6966,6 +7208,9 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + hermes-estree@0.23.1: resolution: {integrity: sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==} @@ -7013,6 +7258,10 @@ packages: resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} engines: {node: '>= 0.8'} + http-basic@8.1.3: + resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} + engines: {node: '>=6.0.0'} + http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} @@ -7029,6 +7278,9 @@ packages: resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} engines: {node: '>=8.0.0'} + http-response-object@3.0.2: + resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} + http-server@14.1.1: resolution: {integrity: sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==} engines: {node: '>=12'} @@ -7098,6 +7350,9 @@ packages: engines: {node: '>=16.x'} hasBin: true + immer@10.0.2: + resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} + immutable@4.3.7: resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} @@ -7144,6 +7399,10 @@ packages: resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} engines: {node: ^18.17.0 || >=20.5.0} + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + invariant@2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -7202,6 +7461,10 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -7485,6 +7748,9 @@ packages: resolution: {integrity: sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==} engines: {node: '>=7.10.1'} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -7506,6 +7772,9 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} + jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + just-extend@6.2.0: resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} @@ -7571,6 +7840,10 @@ packages: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -7773,6 +8046,9 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true + markdown-table@1.1.3: + resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + markdownlint-cli2-formatter-default@0.0.5: resolution: {integrity: sha512-4XKTwQ5m1+Txo2kuQ3Jgpo/KmnG+X90dWt4acufg6HVGadTUG5hzHF/wssp9b5MBYOMCnZ9RMPaU//uHsszF8Q==} peerDependencies: @@ -8067,6 +8343,11 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + ndjson@2.0.0: + resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} + engines: {node: '>=10'} + hasBin: true + negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -8103,6 +8384,9 @@ packages: resolution: {integrity: sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==} engines: {node: '>= 0.10.5'} + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-fetch-native@1.6.4: resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} @@ -8136,6 +8420,10 @@ packages: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} engines: {node: '>=12.19'} + nopt@3.0.6: + resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + hasBin: true + nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -8178,6 +8466,10 @@ packages: nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + nuxi@3.15.0: resolution: {integrity: sha512-ZVu45nuDrdb7nzKW2kLGY/N1vvFYLLbUVX6gUYw4BApKGGu4+GktTR5o48dGVgMYX9A8chaugl7TL9ZYmwC9Mg==} engines: {node: ^16.10.0 || >=18.0.0} @@ -8333,6 +8625,10 @@ packages: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -8416,6 +8712,9 @@ packages: resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} engines: {node: '>=8'} + parse-cache-control@1.0.1: + resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + parse-css-color@0.2.1: resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} @@ -8842,6 +9141,10 @@ packages: preact@10.24.3: resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -9067,6 +9370,14 @@ packages: resolution: {integrity: sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==} engines: {node: '>= 4'} + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + redis-errors@1.2.0: resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} engines: {node: '>=4'} @@ -9134,6 +9445,14 @@ packages: engines: {node: '>=10'} hasBin: true + req-cwd@2.0.0: + resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} + engines: {node: '>=4'} + + req-from@2.0.0: + resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} + engines: {node: '>=4'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -9167,6 +9486,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + resolve@1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} @@ -9261,6 +9583,10 @@ packages: resolution: {integrity: sha512-uEPLbx89BfwzJroECvnTg8IQ+XxqkMl0apvB41mm8fmc6brzHA8bu9Etu43UoUF4ECnACPiDDFz6PfYDG0S46Q==} engines: {node: '>=16'} + sc-istanbul@0.4.6: + resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} + hasBin: true + scheduler@0.24.0-canary-efb381bbf-20230505: resolution: {integrity: sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==} @@ -9340,6 +9666,9 @@ packages: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true + sha1@1.1.1: + resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + shallow-clone@3.0.1: resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} engines: {node: '>=8'} @@ -9355,6 +9684,11 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -9439,6 +9773,12 @@ packages: solidity-ast@0.4.59: resolution: {integrity: sha512-I+CX0wrYUN9jDfYtcgWSe+OAowaXy8/1YQy7NS4ni5IBDmIYBq7ZzaP/7QqouLjzZapmQtvGLqCaYgoUWqBo5g==} + solidity-coverage@0.8.13: + resolution: {integrity: sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA==} + hasBin: true + peerDependencies: + hardhat: ^2.11.0 + sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} @@ -9452,6 +9792,10 @@ packages: source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.2.0: + resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} + engines: {node: '>=0.8.0'} + source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -9490,6 +9834,9 @@ packages: resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} engines: {node: '>=6'} + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -9549,6 +9896,10 @@ packages: string-format@2.0.0: resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -9573,6 +9924,10 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -9639,6 +9994,10 @@ packages: resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} engines: {node: '>=14.0.0'} + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -9667,6 +10026,13 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + sync-request@6.1.0: + resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} + engines: {node: '>=8.0.0'} + + sync-rpc@1.3.6: + resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} + synckit@0.9.2: resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -9749,6 +10115,10 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + then-request@6.0.2: + resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} + engines: {node: '>=6.0.0'} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -9765,6 +10135,9 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -9910,6 +10283,10 @@ packages: tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -9992,6 +10369,11 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + uint8arrays@3.1.0: resolution: {integrity: sha512-ei5rfKtoRO8OyOIor2Rz5fhzjThwIHJZ3uyDPnDHTXbP0aMQ1RN/6AI5B5d9dBxJOU+BvOAk7ZQ1xphsX8Lrog==} @@ -10173,6 +10555,9 @@ packages: resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} engines: {node: '>=6.14.2'} + utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -10439,6 +10824,10 @@ packages: web3-avatar@1.0.4: resolution: {integrity: sha512-O5CLB01a2o7wB3mgXpkdFHi8IIXadMrt6Plf0tP/2ej6ohiTLC/P4jSUouoIXKs4Ercc5ve4Q9e7Y3gd02t88A==} + web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} + webauthn-p256@0.0.5: resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==} @@ -10476,6 +10865,10 @@ packages: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -10502,6 +10895,9 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wordwrapjs@4.0.1: resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} engines: {node: '>=8.0.0'} @@ -12434,6 +12830,14 @@ snapshots: '@ethersproject/logger': 5.7.0 '@ethersproject/properties': 5.7.0 + '@ethersproject/address@5.6.1': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/address@5.7.0': dependencies: '@ethersproject/bignumber': 5.7.0 @@ -12490,6 +12894,37 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + '@ethersproject/hdnode@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/json-wallets@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + '@ethersproject/keccak256@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 @@ -12501,6 +12936,11 @@ snapshots: dependencies: '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/properties@5.7.0': dependencies: '@ethersproject/logger': 5.7.0 @@ -12556,6 +12996,15 @@ snapshots: elliptic: 6.5.4 hash.js: 1.1.7 + '@ethersproject/solidity@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/strings@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 @@ -12574,6 +13023,30 @@ snapshots: '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 + '@ethersproject/units@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/wallet@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + '@ethersproject/web@5.7.1': dependencies: '@ethersproject/base64': 5.7.0 @@ -12582,6 +13055,14 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + '@ethersproject/wordlists@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@fastify/busboy@2.1.1': {} '@floating-ui/core@1.6.8': @@ -13574,28 +14055,78 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-ignition-ethers@0.15.7(ayrziek3mpve3epsp43xriaa4m)': dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.7.0 - cbor: 8.1.0 - chalk: 2.4.2 + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition': 0.15.7(@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + '@nomicfoundation/ignition-core': 0.15.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + + '@nomicfoundation/hardhat-ignition@0.15.7(@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)))(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10)': + dependencies: + '@nomicfoundation/hardhat-verify': 2.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/ignition-core': 0.15.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@nomicfoundation/ignition-ui': 0.15.7 + chalk: 4.1.2 debug: 4.3.7(supports-color@8.1.1) + fs-extra: 10.1.0 hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) - lodash.clonedeep: 4.5.0 - semver: 6.3.1 - table: 6.8.2 - undici: 5.28.4 + json5: 2.2.3 + prompts: 2.4.2 transitivePeerDependencies: + - bufferutil - supports-color + - utf-8-validate - '@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@22.8.0)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.7.0 - cbor: 8.1.0 - chalk: 2.4.2 - debug: 4.3.7(supports-color@8.1.1) + ethereumjs-util: 7.1.5 + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + + '@nomicfoundation/hardhat-toolbox@5.0.0(ch7u4fh2nxsstmvq3k4mazytsm)': + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.0.8(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)))(chai@4.5.0)(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-ignition-ethers': 0.15.7(ayrziek3mpve3epsp43xriaa4m) + '@nomicfoundation/hardhat-network-helpers': 1.0.12(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@nomicfoundation/hardhat-verify': 2.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@5.6.2)) + '@types/chai': 4.3.20 + '@types/mocha': 10.0.8 + '@types/node': 20.16.10 + chai: 4.5.0 + ethers: 6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + hardhat-gas-reporter: 1.0.10(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10) + solidity-coverage: 0.8.13(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)) + ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2) + typechain: 8.3.2(typescript@5.6.2) + typescript: 5.6.2 + + '@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.7.0 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.3.7(supports-color@8.1.1) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + lodash.clonedeep: 4.5.0 + semver: 6.3.1 + table: 6.8.2 + undici: 5.28.4 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@22.8.0)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.7.0 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.3.7(supports-color@8.1.1) hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@22.8.0)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) lodash.clonedeep: 4.5.0 semver: 6.3.1 @@ -13604,6 +14135,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@nomicfoundation/ignition-core@0.15.7(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/address': 5.6.1 + '@nomicfoundation/solidity-analyzer': 0.1.2 + cbor: 9.0.2 + debug: 4.3.7(supports-color@8.1.1) + ethers: 6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + fs-extra: 10.1.0 + immer: 10.0.2 + lodash: 4.17.21 + ndjson: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@nomicfoundation/ignition-ui@0.15.7': {} + '@nomicfoundation/slang-darwin-arm64@0.17.0': {} '@nomicfoundation/slang-darwin-x64@0.17.0': {} @@ -15312,7 +15861,7 @@ snapshots: '@scure/bip32@1.4.0': dependencies: - '@noble/curves': 1.4.0 + '@noble/curves': 1.4.2 '@noble/hashes': 1.4.0 '@scure/base': 1.1.9 @@ -15443,6 +15992,10 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} + '@solidity-parser/parser@0.14.5': + dependencies: + antlr4ts: 0.5.0-alpha.4 + '@solidity-parser/parser@0.18.0': {} '@stablelib/aead@1.0.1': {} @@ -15729,6 +16282,10 @@ snapshots: '@types/chai@4.3.20': {} + '@types/concat-stream@1.6.1': + dependencies: + '@types/node': 22.8.0 + '@types/conventional-commits-parser@5.0.0': dependencies: '@types/node': 22.8.0 @@ -15745,6 +16302,15 @@ snapshots: '@types/estree@1.0.6': {} + '@types/form-data@0.0.33': + dependencies: + '@types/node': 22.8.0 + + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 22.8.0 + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 22.8.0 @@ -15769,6 +16335,8 @@ snapshots: '@types/lru-cache@5.1.1': {} + '@types/minimatch@5.1.2': {} + '@types/mocha@10.0.8': {} '@types/ms@0.7.34': {} @@ -15777,6 +16345,8 @@ snapshots: dependencies: '@types/node': 22.8.0 + '@types/node@10.17.60': {} + '@types/node@18.15.13': {} '@types/node@20.16.10': @@ -15791,6 +16361,8 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/node@8.10.66': {} + '@types/normalize-package-data@2.4.4': {} '@types/parse-json@4.0.2': {} @@ -15801,6 +16373,8 @@ snapshots: '@types/prettier@2.7.3': {} + '@types/qs@6.9.17': {} + '@types/resolve@1.20.2': {} '@types/secp256k1@4.0.6': @@ -16208,7 +16782,7 @@ snapshots: '@vue/shared': 3.5.12 estree-walker: 2.0.2 magic-string: 0.30.12 - postcss: 8.4.47 + postcss: 8.4.49 source-map-js: 1.2.1 '@vue/compiler-sfc@3.5.13': @@ -16381,13 +16955,13 @@ snapshots: - '@vue/composition-api' - vue - '@wagmi/connectors@5.1.15(@wagmi/core@2.13.8(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)': + '@wagmi/connectors@5.1.15(@wagmi/core@2.13.8(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)': dependencies: '@coinbase/wallet-sdk': 4.0.4 '@metamask/sdk': 0.28.4(bufferutil@4.0.8)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4) - '@wagmi/core': 2.13.8(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) + '@wagmi/core': 2.13.8(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) '@walletconnect/ethereum-provider': 2.17.0(bufferutil@4.0.8)(ioredis@5.4.1)(react@18.3.1)(utf-8-validate@5.0.10) '@walletconnect/modal': 2.7.0(react@18.3.1) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' @@ -16420,13 +16994,13 @@ snapshots: - utf-8-validate - zod - '@wagmi/connectors@5.3.3(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)': + '@wagmi/connectors@5.3.3(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)': dependencies: '@coinbase/wallet-sdk': 4.1.0 '@metamask/sdk': 0.30.1(bufferutil@4.0.8)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.3(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4) - '@wagmi/core': 2.14.1(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) + '@wagmi/core': 2.14.1(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) '@walletconnect/ethereum-provider': 2.17.0(bufferutil@4.0.8)(ioredis@5.4.1)(react@18.3.1)(utf-8-validate@5.0.10) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' viem: 2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4) @@ -16457,12 +17031,12 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.13.8(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))': + '@wagmi/core@2.13.8(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.6.2) viem: 2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4) - zustand: 4.4.1(react@18.3.1) + zustand: 4.4.1(immer@10.0.2)(react@18.3.1) optionalDependencies: '@tanstack/query-core': 5.59.16 typescript: 5.6.2 @@ -16471,12 +17045,12 @@ snapshots: - immer - react - '@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))': + '@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.6.2) viem: 2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4) - zustand: 5.0.0(react@18.3.1)(use-sync-external-store@1.2.0(react@18.3.1)) + zustand: 5.0.0(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.2.0(react@18.3.1)) optionalDependencies: '@tanstack/query-core': 5.59.16 typescript: 5.6.2 @@ -16486,11 +17060,11 @@ snapshots: - react - use-sync-external-store - '@wagmi/vue@0.0.49(@tanstack/query-core@5.59.16)(@tanstack/vue-query@5.59.16(vue@3.5.13(typescript@5.6.2)))(bufferutil@4.0.8)(ioredis@5.4.1)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.0)(bufferutil@4.0.8)(eslint@9.11.1(jiti@2.3.3))(idb-keyval@6.2.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.0)(sass@1.80.4)(terser@5.36.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(vite@5.4.10(@types/node@22.8.0)(sass@1.80.4)(terser@5.36.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(vue@3.5.13(typescript@5.6.2))(zod@3.22.4)': + '@wagmi/vue@0.0.49(@tanstack/query-core@5.59.16)(@tanstack/vue-query@5.59.16(vue@3.5.13(typescript@5.6.2)))(bufferutil@4.0.8)(immer@10.0.2)(ioredis@5.4.1)(nuxt@3.13.2(@parcel/watcher@2.4.1)(@types/node@22.8.0)(bufferutil@4.0.8)(eslint@9.11.1(jiti@2.3.3))(idb-keyval@6.2.1)(ioredis@5.4.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.24.0)(sass@1.80.4)(terser@5.36.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(vite@5.4.10(@types/node@22.8.0)(sass@1.80.4)(terser@5.36.0)))(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(vue@3.5.13(typescript@5.6.2))(zod@3.22.4)': dependencies: '@tanstack/vue-query': 5.59.16(vue@3.5.13(typescript@5.6.2)) - '@wagmi/connectors': 5.1.15(@wagmi/core@2.13.8(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) - '@wagmi/core': 2.13.8(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) + '@wagmi/connectors': 5.1.15(@wagmi/core@2.13.8(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(rollup@4.24.0)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + '@wagmi/core': 2.13.8(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) viem: 2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4) vue: 3.5.13(typescript@5.6.2) optionalDependencies: @@ -17173,10 +17747,10 @@ snapshots: lit: 3.1.0 qrcode: 1.5.3 - '@web3modal/wagmi@5.1.11(z4ckkpcr7ps35i3orwxcoxemza)': + '@web3modal/wagmi@5.1.11(5j7jpllrx6ok2s4ilftvrlnbie)': dependencies: - '@wagmi/connectors': 5.3.3(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) - '@wagmi/core': 2.14.1(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) + '@wagmi/connectors': 5.3.3(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + '@wagmi/core': 2.14.1(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) '@walletconnect/ethereum-provider': 2.16.1(bufferutil@4.0.8)(ioredis@5.4.1)(react@18.3.1)(utf-8-validate@5.0.10) '@walletconnect/utils': 2.16.1(ioredis@5.4.1) '@web3modal/base': 5.1.11(ioredis@5.4.1)(react@18.3.1) @@ -17186,7 +17760,7 @@ snapshots: '@web3modal/siwe': 5.1.11(ioredis@5.4.1)(react@18.3.1) '@web3modal/wallet': 5.1.11 viem: 2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4) - wagmi: 2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + wagmi: 2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(bufferutil@4.0.8)(immer@10.0.2)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) optionalDependencies: react: 18.3.1 vue: 3.5.13(typescript@5.6.2) @@ -17238,6 +17812,8 @@ snapshots: jsonparse: 1.3.1 through: 2.3.8 + abbrev@1.0.9: {} + abbrev@1.1.1: {} abitype@1.0.5(typescript@5.6.2)(zod@3.22.4): @@ -17279,6 +17855,8 @@ snapshots: adm-zip@0.4.16: {} + aes-js@3.0.0: {} + aes-js@4.0.0-beta.5: {} agent-base@6.0.2: @@ -17316,6 +17894,9 @@ snapshots: transitivePeerDependencies: - encoding + amdefine@1.0.1: + optional: true + anser@1.4.10: {} ansi-align@3.0.1: @@ -17332,6 +17913,8 @@ snapshots: dependencies: environment: 1.1.0 + ansi-regex@3.0.1: {} + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -17348,6 +17931,8 @@ snapshots: ansi-styles@6.2.1: {} + antlr4ts@0.5.0-alpha.4: {} + any-promise@1.3.0: {} anymatch@3.1.3: @@ -17406,6 +17991,10 @@ snapshots: array-timsort@1.0.3: {} + array-union@2.1.0: {} + + array-uniq@1.0.3: {} + asap@2.0.6: {} asn1@0.2.6: @@ -17455,6 +18044,8 @@ snapshots: async-sema@3.1.1: {} + async@1.5.2: {} + async@2.6.4: dependencies: lodash: 4.17.21 @@ -17659,6 +18250,8 @@ snapshots: blakejs@1.2.1: {} + bn.js@4.11.6: {} + bn.js@4.12.0: {} bn.js@5.2.1: {} @@ -17849,6 +18442,8 @@ snapshots: caniuse-lite@1.0.30001669: {} + caseless@0.12.0: {} + cbor@8.1.0: dependencies: nofilter: 3.1.0 @@ -17897,6 +18492,8 @@ snapshots: chalk@5.3.0: {} + charenc@0.0.2: {} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 @@ -18017,6 +18614,13 @@ snapshots: cli-spinners@2.9.2: {} + cli-table3@0.5.1: + dependencies: + object-assign: 4.1.1 + string-width: 2.1.1 + optionalDependencies: + colors: 1.4.0 + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 @@ -18082,6 +18686,8 @@ snapshots: colorette@2.0.20: {} + colors@1.4.0: {} + columnify@1.6.0: dependencies: strip-ansi: 6.0.1 @@ -18307,6 +18913,8 @@ snapshots: dependencies: uncrypto: 0.1.3 + crypt@0.0.2: {} + cspell-config-lib@8.14.4: dependencies: '@cspell/cspell-types': 8.14.4 @@ -18497,6 +19105,8 @@ snapshots: db0@0.1.4: {} + death@1.1.0: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -18595,8 +19205,16 @@ snapshots: diff@7.0.0: {} + difflib@0.2.4: + dependencies: + heap: 0.2.7 + dijkstrajs@1.0.3: {} + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + dlv@1.1.3: {} docker-modem@1.0.9: @@ -18916,6 +19534,15 @@ snapshots: escape-string-regexp@5.0.0: {} + escodegen@1.8.1: + dependencies: + esprima: 2.7.3 + estraverse: 1.9.3 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.2.0 + eslint-config-flat-gitignore@0.3.0(eslint@9.11.1(jiti@2.3.3)): dependencies: '@eslint/compat': 1.2.1(eslint@9.11.1(jiti@2.3.3)) @@ -19113,6 +19740,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.13.0) eslint-visitor-keys: 3.4.3 + esprima@2.7.3: {} + esprima@4.0.1: {} esquery@1.6.0: @@ -19123,6 +19752,8 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@1.9.3: {} + estraverse@5.3.0: {} estree-walker@2.0.2: {} @@ -19145,6 +19776,26 @@ snapshots: transitivePeerDependencies: - supports-color + eth-gas-reporter@0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@solidity-parser/parser': 0.14.5 + axios: 1.7.7(debug@4.3.7) + cli-table3: 0.5.1 + colors: 1.4.0 + ethereum-cryptography: 1.2.0 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + fs-readdir-recursive: 1.1.0 + lodash: 4.17.21 + markdown-table: 1.1.3 + mocha: 10.7.3 + req-cwd: 2.0.0 + sha1: 1.1.1 + sync-request: 6.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + eth-json-rpc-filters@6.0.1: dependencies: '@metamask/safe-event-emitter': 3.1.2 @@ -19162,6 +19813,10 @@ snapshots: dependencies: fast-safe-stringify: 2.1.1 + ethereum-bloom-filters@1.2.0: + dependencies: + '@noble/hashes': 1.5.0 + ethereum-cryptography@0.1.3: dependencies: '@types/pbkdf2': 3.1.2 @@ -19217,6 +19872,42 @@ snapshots: ethereum-cryptography: 0.1.3 rlp: 2.2.7 + ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + ethers@6.13.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@adraffy/ens-normalize': 1.10.1 @@ -19243,6 +19934,11 @@ snapshots: - bufferutil - utf-8-validate + ethjs-unit@0.1.6: + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + ethjs-util@0.1.6: dependencies: is-hex-prefixed: 1.0.0 @@ -19490,6 +20186,13 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + form-data@2.5.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + safe-buffer: 5.2.1 + form-data@4.0.1: dependencies: asynckit: 0.4.0 @@ -19512,6 +20215,12 @@ snapshots: fs-constants@1.0.0: {} + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 @@ -19524,6 +20233,12 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 @@ -19535,6 +20250,8 @@ snapshots: dependencies: minipass: 3.3.6 + fs-readdir-recursive@1.1.0: {} + fs.realpath@1.0.0: {} fsevents@2.3.2: @@ -19583,6 +20300,8 @@ snapshots: get-port-please@3.1.2: {} + get-port@3.2.0: {} + get-stdin@9.0.0: {} get-stream@6.0.1: {} @@ -19598,6 +20317,11 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + ghost-testrpc@0.0.2: + dependencies: + chalk: 2.4.2 + node-emoji: 1.11.0 + giget@1.2.3: dependencies: citty: 0.1.6 @@ -19643,6 +20367,14 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@5.0.15: + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + glob@7.1.7: dependencies: fs.realpath: 1.0.0 @@ -19682,6 +20414,16 @@ snapshots: dependencies: ini: 4.1.1 + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + globals@11.12.0: {} globals@13.24.0: @@ -19694,6 +20436,17 @@ snapshots: globals@15.9.0: {} + globby@10.0.2: + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + glob: 7.2.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + globby@14.0.2: dependencies: '@sindresorhus/merge-streams': 2.3.0 @@ -19739,6 +20492,27 @@ snapshots: uncrypto: 0.1.3 unenv: 1.10.0 + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + hardhat-gas-reporter@1.0.10(bufferutil@4.0.8)(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10))(utf-8-validate@5.0.10): + dependencies: + array-uniq: 1.0.3 + eth-gas-reporter: 0.2.27(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + sha1: 1.1.1 + transitivePeerDependencies: + - '@codechecks/client' + - bufferutil + - debug + - utf-8-validate + hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 @@ -19849,6 +20623,8 @@ snapshots: - supports-color - utf-8-validate + has-flag@1.0.0: {} + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -19888,6 +20664,8 @@ snapshots: he@1.2.0: {} + heap@0.2.7: {} + hermes-estree@0.23.1: {} hermes-estree@0.24.0: {} @@ -19936,6 +20714,13 @@ snapshots: deep-equal: 1.0.1 http-errors: 1.8.1 + http-basic@8.1.3: + dependencies: + caseless: 0.12.0 + concat-stream: 1.6.2 + http-response-object: 3.0.2 + parse-cache-control: 1.0.1 + http-errors@1.6.3: dependencies: depd: 1.1.2 @@ -19967,6 +20752,10 @@ snapshots: transitivePeerDependencies: - debug + http-response-object@3.0.2: + dependencies: + '@types/node': 10.17.60 + http-server@14.1.1: dependencies: basic-auth: 2.0.1 @@ -20035,6 +20824,8 @@ snapshots: dependencies: queue: 6.0.2 + immer@10.0.2: {} + immutable@4.3.7: {} import-fresh@2.0.0: @@ -20079,6 +20870,8 @@ snapshots: ini@5.0.0: {} + interpret@1.4.0: {} + invariant@2.2.4: dependencies: loose-envify: 1.4.0 @@ -20134,6 +20927,8 @@ snapshots: is-extglob@2.1.1: {} + is-fullwidth-code-point@2.0.0: {} + is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@4.0.0: {} @@ -20428,6 +21223,8 @@ snapshots: json-stream-stringify@3.1.6: {} + json-stringify-safe@5.0.1: {} + json5@2.2.3: {} jsonc-parser@3.2.0: {} @@ -20446,6 +21243,8 @@ snapshots: jsonparse@1.3.1: {} + jsonschema@1.4.1: {} + just-extend@6.2.0: {} keccak@3.0.4: @@ -20535,6 +21334,11 @@ snapshots: leven@3.1.0: {} + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -20786,6 +21590,8 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 + markdown-table@1.1.3: {} + markdownlint-cli2-formatter-default@0.0.5(markdownlint-cli2@0.14.0): dependencies: markdownlint-cli2: 0.14.0 @@ -21099,7 +21905,7 @@ snapshots: mlly@1.7.2: dependencies: - acorn: 8.12.1 + acorn: 8.13.0 pathe: 1.1.2 pkg-types: 1.2.1 ufo: 1.5.4 @@ -21169,6 +21975,14 @@ snapshots: natural-compare@1.4.0: {} + ndjson@2.0.0: + dependencies: + json-stringify-safe: 5.0.1 + minimist: 1.2.8 + readable-stream: 3.6.2 + split2: 3.2.2 + through2: 4.0.2 + negotiator@0.6.3: {} neo-async@2.6.2: {} @@ -21283,6 +22097,10 @@ snapshots: dependencies: minimatch: 3.1.2 + node-emoji@1.11.0: + dependencies: + lodash: 4.17.21 + node-fetch-native@1.6.4: {} node-fetch@2.7.0: @@ -21301,6 +22119,10 @@ snapshots: nofilter@3.1.0: {} + nopt@3.0.6: + dependencies: + abbrev: 1.1.1 + nopt@5.0.0: dependencies: abbrev: 1.1.1 @@ -21349,6 +22171,11 @@ snapshots: nullthrows@1.1.1: {} + number-to-bn@1.7.0: + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + nuxi@3.15.0: {} nuxt-link-checker@3.1.2(magicast@0.3.5)(rollup@4.24.0)(vite@5.4.10(@types/node@22.8.0)(sass@1.80.4)(terser@5.36.0))(vue@3.5.13(typescript@5.6.2)): @@ -21850,6 +22677,15 @@ snapshots: opener@1.5.2: {} + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -21946,6 +22782,8 @@ snapshots: dependencies: callsites: 3.1.0 + parse-cache-control@1.0.1: {} + parse-css-color@0.2.1: dependencies: color-name: 1.1.4 @@ -22168,24 +23006,24 @@ snapshots: dependencies: postcss: 8.4.47 - postcss-import@15.1.0(postcss@8.4.47): + postcss-import@15.1.0(postcss@8.4.49): dependencies: - postcss: 8.4.47 + postcss: 8.4.49 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.47): + postcss-js@4.0.1(postcss@8.4.49): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.47 + postcss: 8.4.49 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@22.8.0)(typescript@5.6.2)): + postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@22.8.0)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.6.0 optionalDependencies: - postcss: 8.4.47 + postcss: 8.4.49 ts-node: 10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@22.8.0)(typescript@5.6.2) postcss-merge-longhand@7.0.4(postcss@8.4.47): @@ -22227,9 +23065,9 @@ snapshots: postcss: 8.4.47 postcss-selector-parser: 6.1.2 - postcss-nested@6.2.0(postcss@8.4.47): + postcss-nested@6.2.0(postcss@8.4.49): dependencies: - postcss: 8.4.47 + postcss: 8.4.49 postcss-selector-parser: 6.1.2 postcss-nesting@13.0.1(postcss@8.4.47): @@ -22338,6 +23176,8 @@ snapshots: preact@10.24.3: {} + prelude-ls@1.1.2: {} + prelude-ls@1.2.1: {} prettier-plugin-solidity@1.4.1(prettier@3.3.3): @@ -22632,6 +23472,14 @@ snapshots: source-map: 0.6.1 tslib: 2.8.0 + rechoir@0.6.2: + dependencies: + resolve: 1.22.8 + + recursive-readdir@2.2.3: + dependencies: + minimatch: 3.1.2 + redis-errors@1.2.0: {} redis-parser@3.0.0: @@ -22694,6 +23542,14 @@ snapshots: glob: 7.2.3 yargs: 17.7.2 + req-cwd@2.0.0: + dependencies: + req-from: 2.0.0 + + req-from@2.0.0: + dependencies: + resolve-from: 3.0.0 + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -22715,6 +23571,8 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve@1.1.7: {} + resolve@1.17.0: dependencies: path-parse: 1.0.7 @@ -22830,6 +23688,23 @@ snapshots: postcss-value-parser: 4.2.0 yoga-wasm-web: 0.3.3 + sc-istanbul@0.4.6: + dependencies: + abbrev: 1.0.9 + async: 1.5.2 + escodegen: 1.8.1 + esprima: 2.7.3 + glob: 5.0.15 + handlebars: 4.7.8 + js-yaml: 3.14.1 + mkdirp: 0.5.6 + nopt: 3.0.6 + once: 1.4.0 + resolve: 1.1.7 + supports-color: 3.2.3 + which: 1.3.1 + wordwrap: 1.0.0 + scheduler@0.24.0-canary-efb381bbf-20230505: dependencies: loose-envify: 1.4.0 @@ -22928,6 +23803,11 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + sha1@1.1.1: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + shallow-clone@3.0.1: dependencies: kind-of: 6.0.3 @@ -22940,6 +23820,12 @@ snapshots: shell-quote@1.8.1: {} + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -23050,6 +23936,29 @@ snapshots: solidity-ast@0.4.59: {} + solidity-coverage@0.8.13(hardhat@2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10)): + dependencies: + '@ethersproject/abi': 5.7.0 + '@solidity-parser/parser': 0.18.0 + chalk: 2.4.2 + death: 1.1.0 + difflib: 0.2.4 + fs-extra: 8.1.0 + ghost-testrpc: 0.0.2 + global-modules: 2.0.0 + globby: 10.0.2 + hardhat: 2.22.15(bufferutil@4.0.8)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)(utf-8-validate@5.0.10) + jsonschema: 1.4.1 + lodash: 4.17.21 + mocha: 10.7.3 + node-emoji: 1.11.0 + pify: 4.0.1 + recursive-readdir: 2.2.3 + sc-istanbul: 0.4.6 + semver: 7.6.3 + shelljs: 0.8.5 + web3-utils: 1.10.4 + sonic-boom@2.8.0: dependencies: atomic-sleep: 1.0.0 @@ -23066,6 +23975,11 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 + source-map@0.2.0: + dependencies: + amdefine: 1.0.1 + optional: true + source-map@0.5.7: {} source-map@0.6.1: {} @@ -23097,6 +24011,10 @@ snapshots: split-on-first@1.1.0: {} + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -23147,6 +24065,11 @@ snapshots: string-format@2.0.0: {} + string-width@2.1.1: + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -23177,6 +24100,10 @@ snapshots: dependencies: safe-buffer: 5.2.1 + strip-ansi@4.0.0: + dependencies: + ansi-regex: 3.0.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -23240,6 +24167,10 @@ snapshots: superstruct@1.0.4: {} + supports-color@3.2.3: + dependencies: + has-flag: 1.0.0 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -23268,6 +24199,16 @@ snapshots: csso: 5.0.5 picocolors: 1.1.1 + sync-request@6.1.0: + dependencies: + http-response-object: 3.0.2 + sync-rpc: 1.3.6 + then-request: 6.0.2 + + sync-rpc@1.3.6: + dependencies: + get-port: 3.2.0 + synckit@0.9.2: dependencies: '@pkgr/core': 0.1.1 @@ -23322,11 +24263,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.4.47 - postcss-import: 15.1.0(postcss@8.4.47) - postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@22.8.0)(typescript@5.6.2)) - postcss-nested: 6.2.0(postcss@8.4.47) + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.7.26(@swc/helpers@0.5.13))(@types/node@22.8.0)(typescript@5.6.2)) + postcss-nested: 6.2.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 resolve: 1.22.8 sucrase: 3.35.0 @@ -23389,7 +24330,7 @@ snapshots: terser@5.36.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.12.1 + acorn: 8.13.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -23408,6 +24349,20 @@ snapshots: text-table@0.2.0: {} + then-request@6.0.2: + dependencies: + '@types/concat-stream': 1.6.1 + '@types/form-data': 0.0.33 + '@types/node': 8.10.66 + '@types/qs': 6.9.17 + caseless: 0.12.0 + concat-stream: 1.6.2 + form-data: 2.5.2 + http-basic: 8.1.3 + http-response-object: 3.0.2 + promise: 8.3.0 + qs: 6.13.0 + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -23427,6 +24382,10 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + through@2.3.8: {} tiny-inflate@1.0.3: {} @@ -23599,6 +24558,10 @@ snapshots: tweetnacl@1.0.3: {} + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -23665,6 +24628,9 @@ snapshots: ufo@1.5.4: {} + uglify-js@3.19.3: + optional: true + uint8arrays@3.1.0: dependencies: multiformats: 9.9.0 @@ -23868,6 +24834,8 @@ snapshots: dependencies: node-gyp-build: 4.8.2 + utf8@3.0.0: {} + util-deprecate@1.0.2: {} util@0.12.5: @@ -23999,7 +24967,7 @@ snapshots: vite@5.4.10(@types/node@22.8.0)(sass@1.80.4)(terser@5.36.0): dependencies: esbuild: 0.21.5 - postcss: 8.4.47 + postcss: 8.4.49 rollup: 4.24.0 optionalDependencies: '@types/node': 22.8.0 @@ -24123,11 +25091,11 @@ snapshots: optionalDependencies: typescript: 5.6.2 - wagmi@2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4): + wagmi@2.12.25(@tanstack/query-core@5.59.16)(@tanstack/react-query@5.59.16(react@18.3.1))(bufferutil@4.0.8)(immer@10.0.2)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4): dependencies: '@tanstack/react-query': 5.59.16(react@18.3.1) - '@wagmi/connectors': 5.3.3(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) - '@wagmi/core': 2.14.1(@tanstack/query-core@5.59.16)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) + '@wagmi/connectors': 5.3.3(@wagmi/core@2.14.1(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)))(bufferutil@4.0.8)(ioredis@5.4.1)(react-native@0.76.0(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(bufferutil@4.0.8)(react@18.3.1)(utf-8-validate@5.0.10))(react@18.3.1)(typescript@5.6.2)(utf-8-validate@5.0.10)(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4) + '@wagmi/core': 2.14.1(@tanstack/query-core@5.59.16)(immer@10.0.2)(react@18.3.1)(typescript@5.6.2)(use-sync-external-store@1.2.0(react@18.3.1))(viem@2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4)) react: 18.3.1 use-sync-external-store: 1.2.0(react@18.3.1) viem: 2.21.14(bufferutil@4.0.8)(typescript@5.6.2)(utf-8-validate@5.0.10)(zod@3.22.4) @@ -24176,10 +25144,21 @@ snapshots: web3-avatar@1.0.4: {} + web3-utils@1.10.4: + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 5.2.1 + ethereum-bloom-filters: 1.2.0 + ethereum-cryptography: 2.2.1 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + webauthn-p256@0.0.5: dependencies: - '@noble/curves': 1.4.0 - '@noble/hashes': 1.4.0 + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 webextension-polyfill@0.10.0: {} @@ -24214,6 +25193,10 @@ snapshots: gopd: 1.0.1 has-tostringtag: 1.0.2 + which@1.3.1: + dependencies: + isexe: 2.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -24237,6 +25220,8 @@ snapshots: word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + wordwrapjs@4.0.1: dependencies: reduce-flatten: 2.0.0 @@ -24410,13 +25395,15 @@ snapshots: zod@3.22.4: {} - zustand@4.4.1(react@18.3.1): + zustand@4.4.1(immer@10.0.2)(react@18.3.1): dependencies: use-sync-external-store: 1.2.0(react@18.3.1) optionalDependencies: + immer: 10.0.2 react: 18.3.1 - zustand@5.0.0(react@18.3.1)(use-sync-external-store@1.2.0(react@18.3.1)): + zustand@5.0.0(immer@10.0.2)(react@18.3.1)(use-sync-external-store@1.2.0(react@18.3.1)): optionalDependencies: + immer: 10.0.2 react: 18.3.1 use-sync-external-store: 1.2.0(react@18.3.1)