From 1c1e5c3b2f8ddc24bf0b745e55f3a18a7de8abe1 Mon Sep 17 00:00:00 2001 From: Mikhail <16622558+mmv08@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:55:29 +0100 Subject: [PATCH] Implement Support for ERC-4337 EntryPoint v0.7 (#243) **This PR**: - Addresses the M-01 from the audit by updating the ERC-4337 contracts to the latest ones from the development branch (presumably, they will be released as version 0.7.0). The most notable change is the new `PackedUserOperation` struct with the new packed gas limit field `accountGasLimits` that consists of two `uint128` packed values `(validationGasLimit, callGasLimit)` - Implements https://github.com/safe-global/safe-modules/issues/225 Forked contracts repo with build artifacts: https://github.com/5afe/account-abstraction More about 0.7.0 changes: https://github.com/safe-global/safe-modules/issues/215 **Issues/concerns**: - Using unaudited non-release candidate contract versions - The reference bundler is still in development, thus e2e tests are failing (Confirmed with ERC4337 team) --------- Co-authored-by: Nicholas Rodrigues Lordello --- .prettierignore | 1 + modules/4337-gas-metering/tsconfig.json | 4 +- modules/4337/.eslintrc.js | 4 + modules/4337/certora/conf/Safe4337Module.conf | 2 +- .../conf/TransactionExecutionMethods.conf | 2 +- .../conf/ValidationDataLastBitOne.conf | 2 +- .../4337/certora/specs/Safe4337Module.spec | 14 +- .../specs/TransactionExecutionMethods.spec | 4 +- .../specs/ValidationDataLastBitOne.spec | 6 +- modules/4337/contracts/Safe4337Module.sol | 35 +- .../experimental/SafeSignerLaunchpad.sol | 10 +- modules/4337/contracts/test/SafeMock.sol | 40 +- .../4337/contracts/test/TestStakedFactory.sol | 2 +- modules/4337/package.json | 9 +- modules/4337/scripts/runOp.ts | 44 +- modules/4337/src/deploy/entrypoint.ts | 2 +- modules/4337/src/utils/safe.ts | 5 +- modules/4337/src/utils/userOp.ts | 84 +- modules/4337/test/e2e/UniqueSigner.spec.ts | 4 +- modules/4337/test/e2e/WebAuthnSigner.spec.ts | 4 +- .../test/e2e/WebAuthnSingletonSigner.spec.ts | 4 +- .../erc4337/ERC4337ModuleExisting.spec.ts | 2 +- .../test/erc4337/ERC4337ModuleNew.spec.ts | 2 +- .../4337/test/erc4337/ERC4337WebAuthn.spec.ts | 10 +- .../4337/test/erc4337/Safe4337Module.spec.ts | 7 +- package-lock.json | 2048 +++++++++++++++-- 26 files changed, 2023 insertions(+), 328 deletions(-) create mode 100644 modules/4337/.eslintrc.js diff --git a/.prettierignore b/.prettierignore index df3b29514..3debc756e 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,2 @@ modules/** +examples/** diff --git a/modules/4337-gas-metering/tsconfig.json b/modules/4337-gas-metering/tsconfig.json index 05e145c1c..7d6f4f317 100644 --- a/modules/4337-gas-metering/tsconfig.json +++ b/modules/4337-gas-metering/tsconfig.json @@ -13,7 +13,7 @@ /* Completeness */ "skipLibCheck": true /* Skip type checking all .d.ts files. */, "outDir": "./dist" /* Redirect output structure to the directory. */, - "noImplicitReturns": true /* Report error when not all code paths in function return a value. */ + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, }, - "exclude": ["node_modules"] + "exclude": ["node_modules"], } diff --git a/modules/4337/.eslintrc.js b/modules/4337/.eslintrc.js new file mode 100644 index 000000000..32d99d450 --- /dev/null +++ b/modules/4337/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + ignorePatterns: ['build', '.eslintrc.js', 'certora', '.certora_internal'], + extends: ['../../.eslintrc.js'], +} diff --git a/modules/4337/certora/conf/Safe4337Module.conf b/modules/4337/certora/conf/Safe4337Module.conf index 7f6635616..e3538a22e 100644 --- a/modules/4337/certora/conf/Safe4337Module.conf +++ b/modules/4337/certora/conf/Safe4337Module.conf @@ -16,7 +16,7 @@ "solc": "solc8.23", "verify": "Safe4337Module:certora/specs/Safe4337Module.spec", "packages": [ - "@account-abstraction=../../node_modules/@account-abstraction", + "@account-abstraction=./node_modules/@account-abstraction", "@safe-global=../../node_modules/@safe-global" ] } diff --git a/modules/4337/certora/conf/TransactionExecutionMethods.conf b/modules/4337/certora/conf/TransactionExecutionMethods.conf index cac80abbd..6b4e5c61b 100644 --- a/modules/4337/certora/conf/TransactionExecutionMethods.conf +++ b/modules/4337/certora/conf/TransactionExecutionMethods.conf @@ -16,7 +16,7 @@ "solc": "solc8.23", "verify": "Safe4337Module:certora/specs/TransactionExecutionMethods.spec", "packages": [ - "@account-abstraction=../../node_modules/@account-abstraction", + "@account-abstraction=./node_modules/@account-abstraction", "@safe-global=../../node_modules/@safe-global" ] } diff --git a/modules/4337/certora/conf/ValidationDataLastBitOne.conf b/modules/4337/certora/conf/ValidationDataLastBitOne.conf index 98b4f1c1c..d1d32a564 100644 --- a/modules/4337/certora/conf/ValidationDataLastBitOne.conf +++ b/modules/4337/certora/conf/ValidationDataLastBitOne.conf @@ -16,7 +16,7 @@ "solc": "solc8.23", "verify": "Safe4337Module:certora/specs/ValidationDataLastBitOne.spec", "packages": [ - "@account-abstraction=../../node_modules/@account-abstraction", + "@account-abstraction=./node_modules/@account-abstraction", "@safe-global=../../node_modules/@safe-global" ] } diff --git a/modules/4337/certora/specs/Safe4337Module.spec b/modules/4337/certora/specs/Safe4337Module.spec index 70e2f7967..112d21637 100644 --- a/modules/4337/certora/specs/Safe4337Module.spec +++ b/modules/4337/certora/specs/Safe4337Module.spec @@ -19,11 +19,11 @@ methods { ) external => DISPATCHER(true); // Optional - function validateUserOp(Safe4337Module.UserOperation,bytes32,uint256) external returns(uint256); + function validateUserOp(Safe4337Module.PackedUserOperation,bytes32,uint256) external returns(uint256); function executeUserOp(address, uint256, bytes, uint8) external; function executeUserOpWithErrorString(address, uint256, bytes, uint8) external; function getOperationHash( - Safe4337Module.UserOperation userOp + Safe4337Module.PackedUserOperation userOp ) external returns(bytes32) envfree => PER_CALLEE_CONSTANT; } persistent ghost ERC2771MessageSender() returns address; @@ -36,7 +36,7 @@ function checkSignaturesFunctionCalled() returns bool { } rule onlyEntryPointCallable(method f) filtered { - f -> f.selector == sig:validateUserOp(Safe4337Module.UserOperation,bytes32,uint256).selector || + f -> f.selector == sig:validateUserOp(Safe4337Module.PackedUserOperation,bytes32,uint256).selector || f.selector == sig:executeUserOp(address,uint256,bytes,uint8).selector || f.selector == sig:executeUserOpWithErrorString(address,uint256,bytes,uint8).selector } { @@ -48,7 +48,7 @@ rule onlyEntryPointCallable(method f) filtered { // checkSignatures should be always called if validateUserOp succeeds rule checkSignaturesIsCalledIfValidateUserOpSucceeds(address sender, - Safe4337Module.UserOperation userOp, + Safe4337Module.PackedUserOperation userOp, bytes32 userOpHash, uint256 missingAccountFunds) { env e; @@ -59,7 +59,7 @@ rule checkSignaturesIsCalledIfValidateUserOpSucceeds(address sender, } rule signatureTimestampsPresentInValidationData(address sender, - Safe4337Module.UserOperation userOp, + Safe4337Module.PackedUserOperation userOp, bytes32 userOpHash, uint256 missingAccountFunds) { env e; @@ -76,7 +76,7 @@ rule signatureTimestampsPresentInValidationData(address sender, } rule validationDataLastBitZeroIfCheckSignaturesSucceeds(address sender, - Safe4337Module.UserOperation userOp, + Safe4337Module.PackedUserOperation userOp, bytes32 userOpHash, uint256 missingAccountFunds) { env e; @@ -93,7 +93,7 @@ rule validationDataLastBitZeroIfCheckSignaturesSucceeds(address sender, } rule balanceChangeAfterValidateUserOp( - Safe4337Module.UserOperation userOp, + Safe4337Module.PackedUserOperation userOp, bytes32 dummyData, uint256 missingAccountFunds) { diff --git a/modules/4337/certora/specs/TransactionExecutionMethods.spec b/modules/4337/certora/specs/TransactionExecutionMethods.spec index 1fe7320ec..8241c64bf 100644 --- a/modules/4337/certora/specs/TransactionExecutionMethods.spec +++ b/modules/4337/certora/specs/TransactionExecutionMethods.spec @@ -8,7 +8,7 @@ methods { // Optional - function validateUserOp(Safe4337Module.UserOperation,bytes32,uint256) external returns(uint256); + function validateUserOp(Safe4337Module.PackedUserOperation,bytes32,uint256) external returns(uint256); function executeUserOp(address, uint256, bytes, uint8) external; function executeUserOpWithErrorString(address, uint256, bytes, uint8) external; } @@ -23,7 +23,7 @@ function ExecTxCalled() returns bool { } rule transactionExecutionMethods(method f) filtered { f-> - f.selector != sig:validateUserOp(Safe4337Module.UserOperation,bytes32,uint256).selector && + f.selector != sig:validateUserOp(Safe4337Module.PackedUserOperation,bytes32,uint256).selector && f.selector != sig:executeUserOp(address,uint256,bytes,uint8).selector && f.selector != sig:executeUserOpWithErrorString(address,uint256,bytes,uint8).selector } { diff --git a/modules/4337/certora/specs/ValidationDataLastBitOne.spec b/modules/4337/certora/specs/ValidationDataLastBitOne.spec index b3a90d711..fbf840365 100644 --- a/modules/4337/certora/specs/ValidationDataLastBitOne.spec +++ b/modules/4337/certora/specs/ValidationDataLastBitOne.spec @@ -7,14 +7,14 @@ methods { function safeContract.getSignatures(bytes signature) external returns (bytes) envfree; // Optional - function validateUserOp(Safe4337Module.UserOperation,bytes32,uint256) external returns(uint256); + function validateUserOp(Safe4337Module.PackedUserOperation,bytes32,uint256) external returns(uint256); function getOperationHash( - Safe4337Module.UserOperation userOp + Safe4337Module.PackedUserOperation userOp ) external returns(bytes32) envfree => PER_CALLEE_CONSTANT; } rule validationDataLastBitOneIfCheckSignaturesFails(address sender, - Safe4337Module.UserOperation userOp, + Safe4337Module.PackedUserOperation userOp, bytes32 dummyData, uint256 missingAccountFunds) { env e; diff --git a/modules/4337/contracts/Safe4337Module.sol b/modules/4337/contracts/Safe4337Module.sol index 855309572..2768a13d8 100644 --- a/modules/4337/contracts/Safe4337Module.sol +++ b/modules/4337/contracts/Safe4337Module.sol @@ -3,9 +3,9 @@ pragma solidity 0.8.23; import {HandlerContext} from "@safe-global/safe-contracts/contracts/handler/HandlerContext.sol"; import {CompatibilityFallbackHandler} from "@safe-global/safe-contracts/contracts/handler/CompatibilityFallbackHandler.sol"; -import {IAccount} from "@account-abstraction/contracts/interfaces/IAccount.sol"; -import {UserOperation} from "@account-abstraction/contracts/interfaces/UserOperation.sol"; -import {_packValidationData} from "@account-abstraction/contracts/core/Helpers.sol"; +import {IAccount} from "@account-abstraction/contracts/contracts/interfaces/IAccount.sol"; +import {PackedUserOperation} from "@account-abstraction/contracts/contracts/interfaces/PackedUserOperation.sol"; +import {_packValidationData} from "@account-abstraction/contracts/contracts/core/Helpers.sol"; import {ISafe} from "./interfaces/Safe.sol"; /** @@ -33,8 +33,7 @@ contract Safe4337Module is IAccount, HandlerContext, CompatibilityFallbackHandle * {uint256} nonce - A unique number associated with the user operation, preventing replay attacks by ensuring each operation is unique. * {bytes} initCode - The packed encoding of a factory address and its factory-specific data for creating a new Safe account. * {bytes} callData - The bytes representing the data of the function call to be executed. - * {uint256} callGasLimit - The maximum amount of gas allowed for executing the function call. - * {uint256} verificationGasLimit - The maximum amount of gas allowed for the verification process. + * {bytes32} accountGasLimits - Packed encoding of the gas limits for the account: {uint128 validationGasLimit, uint128 callGasLimit}. * {uint256} preVerificationGas - The amount of gas allocated for pre-verification steps before executing the main operation. * {uint256} maxFeePerGas - The maximum fee per gas that the user is willing to pay for the transaction. * {uint256} maxPriorityFeePerGas - The maximum priority fee per gas that the user is willing to pay for the transaction. @@ -44,10 +43,10 @@ contract Safe4337Module is IAccount, HandlerContext, CompatibilityFallbackHandle * {address} entryPoint - The address of the entry point that will execute the user operation. * @dev When validating the user operation, the signature timestamps are pre-pended to the signature bytes. * keccak256( - "SafeOp(address safe,uint256 nonce,bytes initCode,bytes callData,uint256 callGasLimit,uint256 verificationGasLimit,uint256 preVerificationGas,uint256 maxFeePerGas,uint256 maxPriorityFeePerGas,bytes paymasterAndData,uint48 validAfter,uint48 validUntil,address entryPoint)" - ) = 0x84aa190356f56b8c87825f54884392a9907c23ee0f8e1ea86336b763faf021bd + "SafeOp(address safe,uint256 nonce,bytes initCode,bytes callData,bytes32 accountGasLimits,uint256 preVerificationGas,uint256 maxFeePerGas,uint256 maxPriorityFeePerGas,bytes paymasterAndData,uint48 validAfter,uint48 validUntil,address entryPoint)" + ) = 0x9efbfd16c059a992a21cba49ddec650b37de25cf6baa04788c16c00b47bb62de */ - bytes32 private constant SAFE_OP_TYPEHASH = 0x84aa190356f56b8c87825f54884392a9907c23ee0f8e1ea86336b763faf021bd; + bytes32 private constant SAFE_OP_TYPEHASH = 0x9efbfd16c059a992a21cba49ddec650b37de25cf6baa04788c16c00b47bb62de; /** * @dev A structure used internally for manually encoding a Safe operation for when computing the EIP-712 struct hash. @@ -58,8 +57,7 @@ contract Safe4337Module is IAccount, HandlerContext, CompatibilityFallbackHandle uint256 nonce; bytes32 initCodeHash; bytes32 callDataHash; - uint256 callGasLimit; - uint256 verificationGasLimit; + bytes32 accountGasLimits; uint256 preVerificationGas; uint256 maxFeePerGas; uint256 maxPriorityFeePerGas; @@ -128,7 +126,7 @@ contract Safe4337Module is IAccount, HandlerContext, CompatibilityFallbackHandle * @inheritdoc IAccount */ function validateUserOp( - UserOperation calldata userOp, + PackedUserOperation calldata userOp, bytes32, uint256 missingAccountFunds ) external onlySupportedEntryPoint returns (uint256 validationData) { @@ -203,7 +201,7 @@ contract Safe4337Module is IAccount, HandlerContext, CompatibilityFallbackHandle * @param userOp The ERC-4337 user operation. * @return operationHash Operation hash. */ - function getOperationHash(UserOperation calldata userOp) external view returns (bytes32 operationHash) { + function getOperationHash(PackedUserOperation calldata userOp) external view returns (bytes32 operationHash) { (bytes memory operationData, , , ) = _getSafeOp(userOp); operationHash = keccak256(operationData); } @@ -217,7 +215,7 @@ contract Safe4337Module is IAccount, HandlerContext, CompatibilityFallbackHandle * @param userOp User operation struct. * @return validationData An integer indicating the result of the validation. */ - function _validateSignatures(UserOperation calldata userOp) internal view returns (uint256 validationData) { + function _validateSignatures(PackedUserOperation calldata userOp) internal view returns (uint256 validationData) { (bytes memory operationData, uint48 validAfter, uint48 validUntil, bytes calldata signatures) = _getSafeOp(userOp); try ISafe(payable(userOp.sender)).checkSignatures(keccak256(operationData), operationData, signatures) { // The timestamps are validated by the entry point, therefore we will not check them again @@ -236,7 +234,7 @@ contract Safe4337Module is IAccount, HandlerContext, CompatibilityFallbackHandle * @return signatures The Safe owner signatures extracted from the user operation. */ function _getSafeOp( - UserOperation calldata userOp + PackedUserOperation calldata userOp ) internal view returns (bytes memory operationData, uint48 validAfter, uint48 validUntil, bytes calldata signatures) { // Extract additional Safe operation fields from the user operation signature which is encoded as: // `abi.encodePacked(validAfter, validUntil, signatures)` @@ -262,8 +260,7 @@ contract Safe4337Module is IAccount, HandlerContext, CompatibilityFallbackHandle nonce: userOp.nonce, initCodeHash: keccak256(userOp.initCode), callDataHash: keccak256(userOp.callData), - callGasLimit: userOp.callGasLimit, - verificationGasLimit: userOp.verificationGasLimit, + accountGasLimits: userOp.accountGasLimits, preVerificationGas: userOp.preVerificationGas, maxFeePerGas: userOp.maxFeePerGas, maxPriorityFeePerGas: userOp.maxPriorityFeePerGas, @@ -277,9 +274,9 @@ contract Safe4337Module is IAccount, HandlerContext, CompatibilityFallbackHandle // solhint-disable-next-line no-inline-assembly assembly ("memory-safe") { // Since the `encodedSafeOp` value's memory layout is identical to the result of `abi.encode`-ing the - // individual `SafeOp` fields, we can pass it directly to `keccak256`. Additionally, there are 14 - // 32-byte fields to hash, for a length of `14 * 32 = 448` bytes. - safeOpStructHash := keccak256(encodedSafeOp, 448) + // individual `SafeOp` fields, we can pass it directly to `keccak256`. Additionally, there are 13 + // 32-byte fields to hash, for a length of `13 * 32 = 448` bytes. + safeOpStructHash := keccak256(encodedSafeOp, 416) } operationData = abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator(), safeOpStructHash); diff --git a/modules/4337/contracts/experimental/SafeSignerLaunchpad.sol b/modules/4337/contracts/experimental/SafeSignerLaunchpad.sol index 2ebff27d6..140397d40 100644 --- a/modules/4337/contracts/experimental/SafeSignerLaunchpad.sol +++ b/modules/4337/contracts/experimental/SafeSignerLaunchpad.sol @@ -1,9 +1,9 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.8.0 <0.9.0; -import {IAccount} from "@account-abstraction/contracts/interfaces/IAccount.sol"; -import {UserOperation} from "@account-abstraction/contracts/interfaces/UserOperation.sol"; -import {_packValidationData} from "@account-abstraction/contracts/core/Helpers.sol"; +import {IAccount} from "@account-abstraction/contracts/contracts/interfaces/IAccount.sol"; +import {PackedUserOperation} from "@account-abstraction/contracts/contracts/interfaces/PackedUserOperation.sol"; +import {_packValidationData} from "@account-abstraction/contracts/contracts/core/Helpers.sol"; import {SafeStorage} from "@safe-global/safe-contracts/contracts/libraries/SafeStorage.sol"; import {SignatureValidatorConstants} from "./SignatureValidatorConstants.sol"; @@ -137,7 +137,7 @@ contract SafeSignerLaunchpad is IAccount, SafeStorage, SignatureValidatorConstan } function validateUserOp( - UserOperation calldata userOp, + PackedUserOperation calldata userOp, bytes32 userOpHash, uint256 missingAccountFunds ) external override onlyProxy onlySupportedEntryPoint returns (uint256 validationData) { @@ -183,7 +183,7 @@ contract SafeSignerLaunchpad is IAccount, SafeStorage, SignatureValidatorConstan * @return validationData An integer indicating the result of the validation. */ function _validateSignatures( - UserOperation calldata userOp, + PackedUserOperation calldata userOp, bytes32 userOpHash, address signerFactory, bytes memory signerData diff --git a/modules/4337/contracts/test/SafeMock.sol b/modules/4337/contracts/test/SafeMock.sol index 69500072e..b0a1df4fb 100644 --- a/modules/4337/contracts/test/SafeMock.sol +++ b/modules/4337/contracts/test/SafeMock.sol @@ -2,9 +2,10 @@ /* solhint-disable one-contract-per-file */ pragma solidity >=0.8.0; -import {IAccount} from "@account-abstraction/contracts/interfaces/IAccount.sol"; -import {UserOperation, UserOperationLib} from "@account-abstraction/contracts/interfaces/UserOperation.sol"; -import {_packValidationData} from "@account-abstraction/contracts/core/Helpers.sol"; +import {IAccount} from "@account-abstraction/contracts/contracts/interfaces/IAccount.sol"; +import {UserOperationLib} from "@account-abstraction/contracts/contracts/core/UserOperationLib.sol"; +import {PackedUserOperation} from "@account-abstraction/contracts/contracts/interfaces/PackedUserOperation.sol"; +import {_packValidationData} from "@account-abstraction/contracts/contracts/core/Helpers.sol"; contract SafeMock { address public singleton; @@ -99,24 +100,26 @@ contract SafeMock { } contract Safe4337Mock is SafeMock, IAccount { - using UserOperationLib for UserOperation; + using UserOperationLib for PackedUserOperation; /// keccak256("EIP712Domain(uint256 chainId,address verifyingContract)") = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218 bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218; - /// keccak256( - /// "SafeOp(address safe,uint256 nonce,bytes initCode,bytes callData,uint256 callGasLimit,uint256 verificationGasLimit,uint256 preVerificationGas,uint256 maxFeePerGas,uint256 maxPriorityFeePerGas,bytes paymasterAndData,uint48 validAfter,uint48 validUntil,address entryPoint)" - /// ) = 0x84aa190356f56b8c87825f54884392a9907c23ee0f8e1ea86336b763faf021bd - bytes32 private constant SAFE_OP_TYPEHASH = 0x84aa190356f56b8c87825f54884392a9907c23ee0f8e1ea86336b763faf021bd; + // keccak256( + // "SafeOp("SafeOp(address safe,uint256 nonce,bytes initCode,bytes callData,bytes32 accountGasLimits,uint256 preVerificationGas,uint256 maxFeePerGas,uint256 maxPriorityFeePerGas,bytes paymasterAndData,uint48 validAfter,uint48 validUntil,address entryPoint)" + // ) = 0x9efbfd16c059a992a21cba49ddec650b37de25cf6baa04788c16c00b47bb62de + bytes32 private constant SAFE_OP_TYPEHASH = 0x9efbfd16c059a992a21cba49ddec650b37de25cf6baa04788c16c00b47bb62de; + /** + * @dev A structure used internally for manually encoding a Safe operation for when computing the EIP-712 struct hash. + */ struct EncodedSafeOpStruct { bytes32 typeHash; address safe; uint256 nonce; bytes32 initCodeHash; bytes32 callDataHash; - uint256 callGasLimit; - uint256 verificationGasLimit; + bytes32 accountGasLimits; uint256 preVerificationGas; uint256 maxFeePerGas; uint256 maxPriorityFeePerGas; @@ -143,7 +146,7 @@ contract Safe4337Mock is SafeMock, IAccount { /// @dev Validates user operation provided by the entry point /// @inheritdoc IAccount function validateUserOp( - UserOperation calldata userOp, + PackedUserOperation calldata userOp, bytes32, uint256 missingAccountFunds ) external onlySupportedEntryPoint returns (uint256 validationData) { @@ -204,7 +207,7 @@ contract Safe4337Mock is SafeMock, IAccount { * @param userOp The ERC-4337 user operation. * @return operationHash Operation hash. */ - function getOperationHash(UserOperation calldata userOp) external view returns (bytes32 operationHash) { + function getOperationHash(PackedUserOperation calldata userOp) external view returns (bytes32 operationHash) { (bytes memory operationData, , , ) = _getSafeOp(userOp); operationHash = keccak256(operationData); } @@ -214,7 +217,7 @@ contract Safe4337Mock is SafeMock, IAccount { * @param userOp User operation struct. * @return validationData An integer indicating the result of the validation. */ - function _validateSignatures(UserOperation calldata userOp) internal view returns (uint256 validationData) { + function _validateSignatures(PackedUserOperation calldata userOp) internal view returns (uint256 validationData) { (bytes memory operationData, uint48 validAfter, uint48 validUntil, bytes calldata signatures) = _getSafeOp(userOp); checkSignatures(keccak256(operationData), operationData, signatures); validationData = _packValidationData(false, validUntil, validAfter); @@ -229,7 +232,7 @@ contract Safe4337Mock is SafeMock, IAccount { * @return signatures The Safe owner signatures extracted from the user operation. */ function _getSafeOp( - UserOperation calldata userOp + PackedUserOperation calldata userOp ) internal view returns (bytes memory operationData, uint48 validAfter, uint48 validUntil, bytes calldata signatures) { // Extract additional Safe operation fields from the user operation signature which is encoded as: // `abi.encodePacked(validAfter, validUntil, signatures)` @@ -255,8 +258,7 @@ contract Safe4337Mock is SafeMock, IAccount { nonce: userOp.nonce, initCodeHash: keccak256(userOp.initCode), callDataHash: keccak256(userOp.callData), - callGasLimit: userOp.callGasLimit, - verificationGasLimit: userOp.verificationGasLimit, + accountGasLimits: userOp.accountGasLimits, preVerificationGas: userOp.preVerificationGas, maxFeePerGas: userOp.maxFeePerGas, maxPriorityFeePerGas: userOp.maxPriorityFeePerGas, @@ -270,9 +272,9 @@ contract Safe4337Mock is SafeMock, IAccount { // solhint-disable-next-line no-inline-assembly assembly ("memory-safe") { // Since the `encodedSafeOp` value's memory layout is identical to the result of `abi.encode`-ing the - // individual `SafeOp` fields, we can pass it directly to `keccak256`. Additionally, there are 14 - // 32-byte fields to hash, for a length of `14 * 32 = 448` bytes. - safeOpStructHash := keccak256(encodedSafeOp, 448) + // individual `SafeOp` fields, we can pass it directly to `keccak256`. Additionally, there are 13 + // 32-byte fields to hash, for a length of `13 * 32 = 448` bytes. + safeOpStructHash := keccak256(encodedSafeOp, 416) } operationData = abi.encodePacked(bytes1(0x19), bytes1(0x01), domainSeparator(), safeOpStructHash); diff --git a/modules/4337/contracts/test/TestStakedFactory.sol b/modules/4337/contracts/test/TestStakedFactory.sol index 8a8c392a8..9cdbf1f15 100644 --- a/modules/4337/contracts/test/TestStakedFactory.sol +++ b/modules/4337/contracts/test/TestStakedFactory.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.8.0 <0.9.0; -import {IEntryPoint} from "@account-abstraction/contracts/interfaces/IEntryPoint.sol"; +import {IEntryPoint} from "@account-abstraction/contracts/contracts/interfaces/IEntryPoint.sol"; contract TestStakedFactory { address public immutable FACTORY; diff --git a/modules/4337/package.json b/modules/4337/package.json index cc984c45d..973a731cf 100644 --- a/modules/4337/package.json +++ b/modules/4337/package.json @@ -27,11 +27,10 @@ "deploy": "hardhat deploy --network", "lint": "npm run lint:sol && npm run lint:ts", "lint:sol": "solhint 'contracts/**/*.sol'", - "lint:ts": "eslint ./src && eslint ./test", - "fmt": "prettier --write .", - "fmt:check": "prettier --check .", + "lint:ts": "eslint ./src --fix && eslint ./test --fix", + "fmt": "prettier --write ./contracts/**/*.sol", + "fmt:check": "prettier --check ./**/*.sol", "prepack": "npm run build", - "prepare": "cd ../.. && husky install modules/4337/.husky", "prepublish": "npx rimraf build && npm run build && npm run build:ts" }, "repository": { @@ -49,7 +48,7 @@ "url": "https://github.com/safe-global/safe-modules/issues" }, "devDependencies": { - "@account-abstraction/contracts": "^0.6.0", + "@account-abstraction/contracts": "github:5afe/account-abstraction#a476d9da6342cf827d0a458c2fb6356e0f015342", "@noble/curves": "^1.3.0", "@nomicfoundation/hardhat-toolbox": "^4.0.0", "@openzeppelin/contracts": "^5.0.2", diff --git a/modules/4337/scripts/runOp.ts b/modules/4337/scripts/runOp.ts index b9005f814..2eed115d2 100644 --- a/modules/4337/scripts/runOp.ts +++ b/modules/4337/scripts/runOp.ts @@ -9,11 +9,11 @@ import { GlobalConfig, MultiProvider4337, Safe4337 } from '../src/utils/safe' const DEBUG = process.env.SCRIPT_DEBUG || false const MNEMONIC = process.env.SCRIPT_MNEMONIC const BUNDLER_URL = process.env.SCRIPT_BUNDLER_URL -const SAFE_SINGLETON_ADDRESS = process.env.SCRIPT_SAFE_SINGLETON_ADDRESS!! -const PROXY_FACTORY_ADDRESS = process.env.SCRIPT_PROXY_FACTORY_ADDRESS!! -const SAFE_MODULE_SETUP_ADDRESS = process.env.SCRIPT_SAFE_MODULE_SETUP_ADDRESS!! -const MODULE_ADDRESS = process.env.SCRIPT_MODULE_ADDRESS!! -const ERC20_TOKEN_ADDRESS = process.env.SCRIPT_ERC20_TOKEN_ADDRESS!! +const SAFE_SINGLETON_ADDRESS = process.env.SCRIPT_SAFE_SINGLETON_ADDRESS! +const PROXY_FACTORY_ADDRESS = process.env.SCRIPT_PROXY_FACTORY_ADDRESS! +const SAFE_MODULE_SETUP_ADDRESS = process.env.SCRIPT_SAFE_MODULE_SETUP_ADDRESS! +const MODULE_ADDRESS = process.env.SCRIPT_MODULE_ADDRESS! +const ERC20_TOKEN_ADDRESS = process.env.SCRIPT_ERC20_TOKEN_ADDRESS! const INTERFACES = new ethers.Interface([ 'function SUPPORTED_ENTRYPOINT() returns (address)', @@ -46,7 +46,7 @@ const runOp = async () => { // This node only allows eth_chainId, eth_getSupportedEntrypoints, eth_sendUserOperation // All other methods return an error - const accountAbstractionProvider = new MultiProvider4337(BUNDLER_URL!!, ethers.provider) + const accountAbstractionProvider = new MultiProvider4337(BUNDLER_URL!, ethers.provider) const entryPoints = await getSupportedEntryPoints(accountAbstractionProvider) const entryPoint = entryPoints[0] const moduleAddress = MODULE_ADDRESS ?? (await getSafe4337Module().then((module) => module.getAddress())) @@ -114,26 +114,22 @@ const runOp = async () => { { from: entryPoint, to: safe.address, - data: buildData( - 'validateUserOp((address,uint256,bytes,bytes,uint256,uint256,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)', + data: buildData('validateUserOp((address,uint256,bytes,bytes,bytes32,uint256,uint256,uint256,bytes,bytes),bytes32,uint256)', [ [ - [ - userOp.sender, - userOp.nonce, - userOp.initCode, - userOp.callData, - userOp.callGasLimit, - userOp.verificationGasLimit, - userOp.preVerificationGas, - userOp.maxFeePerGas, - userOp.maxPriorityFeePerGas, - userOp.paymasterAndData, - userOp.signature, - ], - '0x0000000000000000000000000000000000000000000000000000000000000000', - getRequiredPrefund(userOp), + userOp.sender, + userOp.nonce, + userOp.initCode, + userOp.callData, + userOp.accountGasLimits, + userOp.preVerificationGas, + userOp.maxFeePerGas, + userOp.maxPriorityFeePerGas, + userOp.paymasterAndData, + userOp.signature, ], - ), + '0x0000000000000000000000000000000000000000000000000000000000000000', + getRequiredPrefund(userOp), + ]), }, 'latest', ]), diff --git a/modules/4337/src/deploy/entrypoint.ts b/modules/4337/src/deploy/entrypoint.ts index 29df0e671..04ff37d67 100644 --- a/modules/4337/src/deploy/entrypoint.ts +++ b/modules/4337/src/deploy/entrypoint.ts @@ -1,4 +1,4 @@ -import EntryPoint from '@account-abstraction/contracts/artifacts/EntryPoint.json' +import EntryPoint from '@account-abstraction/contracts/artifacts/contracts/core/EntryPoint.sol/EntryPoint.json' import { DeployFunction } from 'hardhat-deploy/types' const ENTRY_POINT = process.env.DEPLOYMENT_ENTRY_POINT_ADDRESS diff --git a/modules/4337/src/utils/safe.ts b/modules/4337/src/utils/safe.ts index 2b61e2349..b27e4a294 100644 --- a/modules/4337/src/utils/safe.ts +++ b/modules/4337/src/utils/safe.ts @@ -2,7 +2,7 @@ import { AddressLike, JsonRpcProvider, Provider, Signer, ethers } from 'ethers' // Import from Safe contracts repo once it is upgraded to ethers v6 and can be installed via npm import { MetaTransaction, SafeSignature, SignedSafeTransaction, buildSignatureBytes } from './execution' -import { UserOperation, EIP712_SAFE_OPERATION_TYPE } from './userOp' +import { UserOperation, EIP712_SAFE_OPERATION_TYPE, packAccountGasLimits } from './userOp' const AddressOne = '0x0000000000000000000000000000000000000001' @@ -161,9 +161,8 @@ export class Safe4337Operation { return { nonce: ethers.toBeHex(this.params.nonce), callData: actionCalldata(this.action), - verificationGasLimit: ethers.toBeHex(this.params.verificationGasLimit), + accountGasLimits: packAccountGasLimits(this.params.verificationGasLimit, this.params.callGasLimit), preVerificationGas: ethers.toBeHex(this.params.preVerificationGas), - callGasLimit: ethers.toBeHex(this.params.callGasLimit), maxFeePerGas: ethers.toBeHex(this.params.maxFeePerGas), maxPriorityFeePerGas: ethers.toBeHex(this.params.maxPriorityFeePerGas), initCode: this.params.initCode, diff --git a/modules/4337/src/utils/userOp.ts b/modules/4337/src/utils/userOp.ts index 160477449..47bc4bf35 100644 --- a/modules/4337/src/utils/userOp.ts +++ b/modules/4337/src/utils/userOp.ts @@ -1,39 +1,15 @@ import { BigNumberish, BytesLike, Contract, Signer, ethers } from 'ethers' - +import { PackedUserOperationStruct as UserOperation } from '../../typechain-types/contracts/Safe4337Module' import { SafeSignature } from './execution' +export { UserOperation } type OptionalExceptFor = Partial>> & Required> -export interface UserOperation { - sender: string - nonce: string - initCode: string - callData: string - callGasLimit: string - verificationGasLimit: string - preVerificationGas: string - maxFeePerGas: string - maxPriorityFeePerGas: string - paymasterAndData: string - signature: string -} - -export interface SafeUserOperation { - safe: string - nonce: BigNumberish - initCode: BytesLike - callData: BytesLike - callGasLimit: BigNumberish - verificationGasLimit: BigNumberish - preVerificationGas: BigNumberish - maxFeePerGas: BigNumberish - maxPriorityFeePerGas: BigNumberish - paymasterAndData: BytesLike - validAfter: BigNumberish - validUntil: BigNumberish - entryPoint: string -} +type SafeUserOperation = { safe: string; entryPoint: string; validAfter: BigNumberish; validUntil: BigNumberish } & Omit< + UserOperation, + 'sender' | 'signature' +> export const EIP712_SAFE_OPERATION_TYPE = { SafeOp: [ @@ -41,8 +17,7 @@ export const EIP712_SAFE_OPERATION_TYPE = { { type: 'uint256', name: 'nonce' }, { type: 'bytes', name: 'initCode' }, { type: 'bytes', name: 'callData' }, - { type: 'uint256', name: 'callGasLimit' }, - { type: 'uint256', name: 'verificationGasLimit' }, + { type: 'bytes32', name: 'accountGasLimits' }, { type: 'uint256', name: 'preVerificationGas' }, { type: 'uint256', name: 'maxFeePerGas' }, { type: 'uint256', name: 'maxPriorityFeePerGas' }, @@ -82,8 +57,7 @@ export const buildSafeUserOp = (template: OptionalExceptFor { if (userOp.paymasterAndData === '0x') { multiplier = 1n } + const { validationGasLimit, callGasLimit } = unpackAccountGasLimits(userOp.accountGasLimits) - return (BigInt(userOp.callGasLimit) + BigInt(userOp.verificationGasLimit) * multiplier + BigInt(userOp.preVerificationGas)).toString() + return (BigInt(callGasLimit) + BigInt(validationGasLimit) * multiplier + BigInt(userOp.preVerificationGas)).toString() } export const getRequiredPrefund = (userOp: UserOperation): string => { @@ -213,7 +187,41 @@ export const packValidationData = (authorizer: BigNumberish, validUntil: BigNumb const validUntilBigInt = BigInt(validUntil) const validAfterBigInt = BigInt(validAfter) - const result = addrBigInt | (validUntilBigInt << BigInt(160)) | (validAfterBigInt << BigInt(160 + 48)) + const result = addrBigInt | (validUntilBigInt << 160n) | (validAfterBigInt << (160n + 48n)) return result } + +/** + * Packs two 128uint gas limit values (validationGasLimit and callGasLimit) into a hex-encoded bytes32 string. + * + * @param validationGasLimit - The validation gas limit. + * @param callGasLimit - The call gas limit. + * @returns The packed gas limits as a string. + */ +export const packAccountGasLimits = (validationGasLimit: BigNumberish, callGasLimit: BigNumberish): string => { + return ethers.solidityPacked(['uint128', 'uint128'], [validationGasLimit, callGasLimit]) +} + +/** + * Unpacks the account gas limits from a bytes32 hex-encoded string into two uint128 BigInts. + * + * @param accountGasLimits - The account gas limits as a bytes32 hex-encoded string. + * @returns An object containing the validation gas limit and the call gas limit. + */ +export const unpackAccountGasLimits = (accountGasLimits: BytesLike): { validationGasLimit: bigint; callGasLimit: bigint } => { + // Ensure the bytes have the expected length. + if (ethers.dataLength(accountGasLimits) !== 32) { + throw new Error('Invalid input: account gas limits must be 32-bytes long') + } + + // Split the hex string into two parts (32 characters each) + const validationGasHex = ethers.dataSlice(accountGasLimits, 0, 16) + const callGasHex = ethers.dataSlice(accountGasLimits, 16, 32) + + // Convert hex values to BigInts + const validationGasLimit = BigInt(validationGasHex) + const callGasLimit = BigInt(callGasHex) + + return { validationGasLimit, callGasLimit } +} diff --git a/modules/4337/test/e2e/UniqueSigner.spec.ts b/modules/4337/test/e2e/UniqueSigner.spec.ts index efaf96ef6..a12c3af5e 100644 --- a/modules/4337/test/e2e/UniqueSigner.spec.ts +++ b/modules/4337/test/e2e/UniqueSigner.spec.ts @@ -2,6 +2,7 @@ import { expect } from 'chai' import { deployments, ethers, network } from 'hardhat' import { bundlerRpc, prepareAccounts, waitForUserOp } from '../utils/e2e' import { chainId } from '../utils/encoding' +import { packAccountGasLimits } from '../../src/utils/userOp' describe('E2E - Unique Signers', () => { before(function () { @@ -110,8 +111,7 @@ describe('E2E - Unique Signers', () => { safeInit.fallbackHandler, module.interface.encodeFunctionData('executeUserOp', [user.address, ethers.parseEther('0.5'), '0x', 0]), ]), - callGasLimit: ethers.toBeHex(2000000), - verificationGasLimit: ethers.toBeHex(500000), + accountGasLimits: packAccountGasLimits(500000, 2000000), preVerificationGas: ethers.toBeHex(60000), maxFeePerGas: ethers.toBeHex(10000000000), maxPriorityFeePerGas: ethers.toBeHex(10000000000), diff --git a/modules/4337/test/e2e/WebAuthnSigner.spec.ts b/modules/4337/test/e2e/WebAuthnSigner.spec.ts index 7320dc807..ac8db0e61 100644 --- a/modules/4337/test/e2e/WebAuthnSigner.spec.ts +++ b/modules/4337/test/e2e/WebAuthnSigner.spec.ts @@ -9,6 +9,7 @@ import { extractPublicKey, extractSignature, } from '../utils/webauthn' +import { packAccountGasLimits } from '../../src/utils/userOp' describe('E2E - WebAuthn Signers', () => { before(function () { @@ -152,8 +153,7 @@ describe('E2E - WebAuthn Signers', () => { safeInit.fallbackHandler, module.interface.encodeFunctionData('executeUserOp', [user.address, ethers.parseEther('0.5'), '0x', 0]), ]), - callGasLimit: ethers.toBeHex(2000000), - verificationGasLimit: ethers.toBeHex(500000), + accountGasLimits: packAccountGasLimits(500000, 2000000), preVerificationGas: ethers.toBeHex(60000), maxFeePerGas: ethers.toBeHex(10000000000), maxPriorityFeePerGas: ethers.toBeHex(10000000000), diff --git a/modules/4337/test/e2e/WebAuthnSingletonSigner.spec.ts b/modules/4337/test/e2e/WebAuthnSingletonSigner.spec.ts index ba83ade93..c74492dc9 100644 --- a/modules/4337/test/e2e/WebAuthnSingletonSigner.spec.ts +++ b/modules/4337/test/e2e/WebAuthnSingletonSigner.spec.ts @@ -8,7 +8,7 @@ import { extractPublicKey, extractSignature, } from '../utils/webauthn' -import { buildSafeUserOpTransaction, buildUserOperationFromSafeUserOperation } from '../../src/utils/userOp' +import { buildSafeUserOpTransaction, buildUserOperationFromSafeUserOperation, packAccountGasLimits } from '../../src/utils/userOp' import { buildSignatureBytes } from '../../src/utils/execution' describe('E2E - WebAuthn Singleton Signers', () => { @@ -135,7 +135,7 @@ describe('E2E - WebAuthn Singleton Signers', () => { false, { initCode, - verificationGasLimit: ethers.toBeHex(700000), + accountGasLimits: packAccountGasLimits(700000, 2000000), }, ) const opHash = await module.getOperationHash( diff --git a/modules/4337/test/erc4337/ERC4337ModuleExisting.spec.ts b/modules/4337/test/erc4337/ERC4337ModuleExisting.spec.ts index a12a8cce8..869a0cf3c 100644 --- a/modules/4337/test/erc4337/ERC4337ModuleExisting.spec.ts +++ b/modules/4337/test/erc4337/ERC4337ModuleExisting.spec.ts @@ -137,7 +137,7 @@ describe('Safe4337Module - Existing Safe', () => { const signature = buildSignatureBytes([await signHash(user1, safeOpHash)]) const userOp = buildUserOperationFromSafeUserOperation({ safeOp, signature }) const userOpHash = await entryPoint.getUserOpHash(userOp) - const expectedReturnData = validator.interface.encodeErrorResult('Error(string)', ['Execution failed']) + const expectedReturnData = validator.interface.encodeErrorResult('ExecutionFailed()', []) await expect(entryPoint.handleOps([userOp], user1.address)) .to.emit(entryPoint, 'UserOperationRevertReason') diff --git a/modules/4337/test/erc4337/ERC4337ModuleNew.spec.ts b/modules/4337/test/erc4337/ERC4337ModuleNew.spec.ts index da10d1221..748d14aab 100644 --- a/modules/4337/test/erc4337/ERC4337ModuleNew.spec.ts +++ b/modules/4337/test/erc4337/ERC4337ModuleNew.spec.ts @@ -147,7 +147,7 @@ describe('Safe4337Module - Newly deployed safe', () => { safeOp, signature, }) - const expectedReturnData = validator.interface.encodeErrorResult('Error(string)', ['Execution failed']) + const expectedReturnData = validator.interface.encodeErrorResult('ExecutionFailed()', []) await expect(entryPoint.handleOps([userOp], user1.address)) .to.emit(entryPoint, 'UserOperationRevertReason') .withArgs(await entryPoint.getUserOpHash(userOp), userOp.sender, 0, expectedReturnData) diff --git a/modules/4337/test/erc4337/ERC4337WebAuthn.spec.ts b/modules/4337/test/erc4337/ERC4337WebAuthn.spec.ts index cb656b812..a3b2a9970 100644 --- a/modules/4337/test/erc4337/ERC4337WebAuthn.spec.ts +++ b/modules/4337/test/erc4337/ERC4337WebAuthn.spec.ts @@ -2,7 +2,12 @@ import { expect } from 'chai' import { deployments, ethers } from 'hardhat' import { getEntryPoint } from '../utils/setup' import { buildSignatureBytes, logGas } from '../../src/utils/execution' -import { buildSafeUserOpTransaction, buildUserOperationFromSafeUserOperation, calculateSafeOperationHash } from '../../src/utils/userOp' +import { + buildSafeUserOpTransaction, + buildUserOperationFromSafeUserOperation, + calculateSafeOperationHash, + packAccountGasLimits, +} from '../../src/utils/userOp' import { chainId } from '../utils/encoding' import { UserVerificationRequirement, @@ -148,8 +153,7 @@ describe('Safe4337Module - WebAuthn Owner', () => { safeInit.fallbackHandler, module.interface.encodeFunctionData('executeUserOp', [user.address, ethers.parseEther('0.5'), '0x', 0]), ]), - callGasLimit: ethers.toBeHex(2500000), - verificationGasLimit: ethers.toBeHex(500000), + accountGasLimits: packAccountGasLimits(500000, 2500000), preVerificationGas: ethers.toBeHex(60000), maxFeePerGas: ethers.toBeHex(10000000000), maxPriorityFeePerGas: ethers.toBeHex(10000000000), diff --git a/modules/4337/test/erc4337/Safe4337Module.spec.ts b/modules/4337/test/erc4337/Safe4337Module.spec.ts index 38ed19eaa..a575da9ee 100644 --- a/modules/4337/test/erc4337/Safe4337Module.spec.ts +++ b/modules/4337/test/erc4337/Safe4337Module.spec.ts @@ -8,6 +8,7 @@ import { buildSafeUserOpTransaction, buildUserOperationFromSafeUserOperation, calculateSafeOperationHash, + packAccountGasLimits, packValidationData, } from '../../src/utils/userOp' import { chainId, timestamp } from '../utils/encoding' @@ -69,8 +70,7 @@ describe('Safe4337Module', () => { nonce: 0x12, initCode: '0x13', callData: '0x14', - callGasLimit: 0x15, - verificationGasLimit: 0x16, + accountGasLimits: packAccountGasLimits(0x16, 0x15), preVerificationGas: 0x17, maxFeePerGas: 0x18, maxPriorityFeePerGas: 0x19, @@ -87,8 +87,7 @@ describe('Safe4337Module', () => { ['nonce', 0x22], ['initCode', '0x23'], ['callData', '0x24'], - ['callGasLimit', 0x25], - ['verificationGasLimit', 0x26], + ['accountGasLimits', packAccountGasLimits(0x26, 0x25)], ['preVerificationGas', 0x27], ['maxFeePerGas', 0x28], ['maxPriorityFeePerGas', 0x29], diff --git a/package-lock.json b/package-lock.json index 5e6de8073..595db2884 100644 --- a/package-lock.json +++ b/package-lock.json @@ -177,7 +177,7 @@ "@safe-global/safe-contracts": "^1.4.1" }, "devDependencies": { - "@account-abstraction/contracts": "^0.6.0", + "@account-abstraction/contracts": "github:5afe/account-abstraction#a476d9da6342cf827d0a458c2fb6356e0f015342", "@noble/curves": "^1.3.0", "@nomicfoundation/hardhat-toolbox": "^4.0.0", "@openzeppelin/contracts": "^5.0.2", @@ -408,12 +408,465 @@ } } }, + "modules/4337/node_modules/@account-abstraction/contracts": { + "name": "accountabstraction", + "version": "0.6.0", + "resolved": "git+ssh://git@github.com/5afe/account-abstraction.git#a476d9da6342cf827d0a458c2fb6356e0f015342", + "integrity": "sha512-Q4AxShnnZyzTGKwTVxgjvtkNS708oyFibOApQbVfd6TCtn/T1ED5LaX0IAUkXvGG5SVN3iFkyIkUkgVixQ9kLQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nomiclabs/hardhat-etherscan": "^2.1.6", + "@openzeppelin/contracts": "^5.0.0", + "@thehubbleproject/bls": "^0.5.1", + "@typechain/hardhat": "^2.3.0", + "@types/mocha": "^9.0.0", + "ethereumjs-util": "^7.1.0", + "ethereumjs-wallet": "^1.0.1", + "hardhat-deploy": "^0.11.23", + "hardhat-deploy-ethers": "^0.3.0-beta.11", + "solidity-coverage": "^0.8.4", + "source-map-support": "^0.5.19", + "table": "^6.8.0", + "typescript": "^4.3.5" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/@nomiclabs/hardhat-etherscan": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.8.tgz", + "integrity": "sha512-0+rj0SsZotVOcTLyDOxnOc3Gulo8upo0rsw/h+gBPcmtj91YqYJNhdARHoBxOhhE8z+5IUQPx+Dii04lXT14PA==", + "deprecated": "The @nomiclabs/hardhat-etherscan package is deprecated, please use @nomicfoundation/hardhat-verify instead", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^5.0.2", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "node-fetch": "^2.6.0", + "semver": "^6.3.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/@nomiclabs/hardhat-etherscan/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/@typechain/hardhat": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-2.3.1.tgz", + "integrity": "sha512-BQV8OKQi0KAzLXCdsPO0pZBNQQ6ra8A2ucC26uFX/kquRBtJu1yEyWnVSmtr07b5hyRoJRpzUeINLnyqz4/MAw==", + "dev": true, + "dependencies": { + "fs-extra": "^9.1.0" + }, + "peerDependencies": { + "hardhat": "^2.0.10", + "lodash": "^4.17.15", + "typechain": "^5.1.2" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "dev": true, + "dependencies": { + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "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", + "@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" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/hardhat-deploy-ethers": { + "version": "0.3.0-beta.13", + "resolved": "https://registry.npmjs.org/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz", + "integrity": "sha512-PdWVcKB9coqWV1L7JTpfXRCI91Cgwsm7KLmBcwZ8f0COSm1xtABHZTyz3fvF6p42cTnz1VM0QnfDvMFlIRkSNw==", + "dev": true, + "peerDependencies": { + "ethers": "^5.0.0", + "hardhat": "^2.0.0" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/typechain": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-5.2.0.tgz", + "integrity": "sha512-0INirvQ+P+MwJOeMct+WLkUE4zov06QxC96D+i3uGFEHoiSkZN70MKDQsaj8zkL86wQwByJReI2e7fOUwECFuw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/prettier": "^2.1.1", + "command-line-args": "^4.0.7", + "debug": "^4.1.1", + "fs-extra": "^7.0.0", + "glob": "^7.1.6", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.1.2", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.1.0" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/typechain/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "modules/4337/node_modules/@account-abstraction/contracts/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "modules/4337/node_modules/@adraffy/ens-normalize": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", "dev": true }, + "modules/4337/node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@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/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "modules/4337/node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "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" + } + }, + "modules/4337/node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "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" + } + }, + "modules/4337/node_modules/@ethersproject/json-wallets/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "dev": true, + "peer": true + }, + "modules/4337/node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "modules/4337/node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "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" + } + }, + "modules/4337/node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "modules/4337/node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "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" + } + }, + "modules/4337/node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "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" + } + }, "modules/4337/node_modules/@noble/hashes": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", @@ -537,6 +990,19 @@ "typechain": "^8.3.2" } }, + "modules/4337/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "peer": true, + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, "modules/4337/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -551,6 +1017,21 @@ "node": ">=12" } }, + "modules/4337/node_modules/command-line-args": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz", + "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^2.0.0", + "find-replace": "^1.0.3", + "typical": "^2.6.1" + }, + "bin": { + "command-line-args": "bin/cli.js" + } + }, "modules/4337/node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -560,6 +1041,45 @@ "node": ">= 12" } }, + "modules/4337/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "modules/4337/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, "modules/4337/node_modules/ethers": { "version": "6.11.1", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.11.1.tgz", @@ -606,12 +1126,38 @@ "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", "dev": true }, + "modules/4337/node_modules/find-replace": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", + "integrity": "sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^1.0.4", + "test-value": "^2.1.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "modules/4337/node_modules/find-replace/node_modules/array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", + "dev": true, + "peer": true, + "dependencies": { + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, "modules/4337/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "peer": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -627,7 +1173,6 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "peer": true, "dependencies": { "universalify": "^2.0.0" }, @@ -635,6 +1180,44 @@ "graceful-fs": "^4.1.6" } }, + "modules/4337/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "modules/4337/node_modules/nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "modules/4337/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "modules/4337/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -671,12 +1254,18 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, + "modules/4337/node_modules/typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", + "dev": true, + "peer": true + }, "modules/4337/node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "dev": true, - "peer": true, "engines": { "node": ">= 10.0.0" } @@ -1673,12 +2262,6 @@ "node": ">=0.10.0" } }, - "node_modules/@account-abstraction/contracts": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@account-abstraction/contracts/-/contracts-0.6.0.tgz", - "integrity": "sha512-8ooRJuR7XzohMDM4MV34I12Ci2bmxfE9+cixakRL7lA4BAwJKQ3ahvd8FbJa9kiwkUPCUNtj+/zxDQWYYalLMQ==", - "dev": true - }, "node_modules/@adraffy/ens-normalize": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", @@ -5586,80 +6169,354 @@ "os": [ "linux" ], - "engines": { - "node": ">=10" + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.1.tgz", + "integrity": "sha512-OklkJYXXI/tntD2zaY8i3iZldpyDw5q+NAP3k9OlQ7wXXf37djRsHLV0NW4+ZNHBjE9xp2RsXJ0jlOJhfgGoFA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.1.tgz", + "integrity": "sha512-MBuc3/QfKX9FnLOU7iGN+6yHRTQaPQ9WskiC8s8JFiKQ+7I2p25tay2RplR9dIEEGgVAu6L7auv96LbNTh+FaA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.1.tgz", + "integrity": "sha512-lu4h4wFBb/bOK6N2MuZwg7TrEpwYXgpQf5R7ObNSXL65BwZ9BG8XRzD+dLJmALu8l5N08rP/TrpoKRoGT4WSxw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", + "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@thehubbleproject/bls": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@thehubbleproject/bls/-/bls-0.5.1.tgz", + "integrity": "sha512-g5zeMZ8js/yg6MjFoC+pt0eqfCL2jC46yLY1LbKNriyqftB1tE3jpG/FMMDIW3x9/yRg/AgUb8Nluqj15tQs+A==", + "dev": true, + "dependencies": { + "ethers": "^5.5.3", + "mcl-wasm": "^1.0.0" + } + }, + "node_modules/@thehubbleproject/bls/node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@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/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@thehubbleproject/bls/node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "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" + } + }, + "node_modules/@thehubbleproject/bls/node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "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" + } + }, + "node_modules/@thehubbleproject/bls/node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "node_modules/@thehubbleproject/bls/node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "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" } }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.1.tgz", - "integrity": "sha512-OklkJYXXI/tntD2zaY8i3iZldpyDw5q+NAP3k9OlQ7wXXf37djRsHLV0NW4+ZNHBjE9xp2RsXJ0jlOJhfgGoFA==", - "cpu": [ - "arm64" - ], + "node_modules/@thehubbleproject/bls/node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", "dev": true, - "optional": true, - "os": [ - "win32" + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } ], - "engines": { - "node": ">=10" + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.1.tgz", - "integrity": "sha512-MBuc3/QfKX9FnLOU7iGN+6yHRTQaPQ9WskiC8s8JFiKQ+7I2p25tay2RplR9dIEEGgVAu6L7auv96LbNTh+FaA==", - "cpu": [ - "ia32" - ], + "node_modules/@thehubbleproject/bls/node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "dev": true, - "optional": true, - "os": [ - "win32" + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } ], - "engines": { - "node": ">=10" + "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" } }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.1.tgz", - "integrity": "sha512-lu4h4wFBb/bOK6N2MuZwg7TrEpwYXgpQf5R7ObNSXL65BwZ9BG8XRzD+dLJmALu8l5N08rP/TrpoKRoGT4WSxw==", - "cpu": [ - "x64" - ], + "node_modules/@thehubbleproject/bls/node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "dev": true, - "optional": true, - "os": [ - "win32" + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } ], - "engines": { - "node": ">=10" + "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" } }, - "node_modules/@swc/counter": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", - "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", - "dev": true - }, - "node_modules/@swc/types": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", - "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "node_modules/@thehubbleproject/bls/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", "dev": true }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/@thehubbleproject/bls/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" + "@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", + "@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" } }, "node_modules/@tsconfig/node10": { @@ -7121,7 +7978,6 @@ "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, "optional": true, - "peer": true, "engines": { "node": ">=0.4.2" } @@ -7513,6 +8369,15 @@ "node": ">=14.0.0" } }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -9018,7 +9883,6 @@ "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, "optional": true, - "peer": true, "dependencies": { "amdefine": ">=0.0.4" }, @@ -10028,6 +10892,67 @@ "setimmediate": "^1.0.5" } }, + "node_modules/ethereumjs-wallet": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz", + "integrity": "sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA==", + "dev": true, + "dependencies": { + "aes-js": "^3.1.2", + "bs58check": "^2.1.2", + "ethereum-cryptography": "^0.1.3", + "ethereumjs-util": "^7.1.2", + "randombytes": "^2.1.0", + "scrypt-js": "^3.0.1", + "utf8": "^3.0.0", + "uuid": "^8.3.2" + } + }, + "node_modules/ethereumjs-wallet/node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", + "dev": true + }, + "node_modules/ethereumjs-wallet/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethereumjs-wallet/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/ethers": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.4.0.tgz", @@ -13181,6 +14106,18 @@ "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==", "dev": true }, + "node_modules/mcl-wasm": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-1.4.0.tgz", + "integrity": "sha512-90Tvmg2NXwnKMgTafA01PRELsYNNRb/F2bj3nzdByTLLMUmgkgL8H/oeWcjZtVVffnBJyNjDcYxY7cdOE/WoHg==", + "dev": true, + "dependencies": { + "@types/node": "^20.2.5" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -16365,6 +17302,40 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/test-value": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", + "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^1.0.3", + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-value/node_modules/array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", + "dev": true, + "peer": true, + "dependencies": { + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/test-value/node_modules/typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", + "dev": true, + "peer": true + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -16890,7 +17861,6 @@ "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true, - "peer": true, "bin": { "uglifyjs": "bin/uglifyjs" }, @@ -18085,12 +19055,6 @@ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true }, - "@account-abstraction/contracts": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@account-abstraction/contracts/-/contracts-0.6.0.tgz", - "integrity": "sha512-8ooRJuR7XzohMDM4MV34I12Ci2bmxfE9+cixakRL7lA4BAwJKQ3ahvd8FbJa9kiwkUPCUNtj+/zxDQWYYalLMQ==", - "dev": true - }, "@adraffy/ens-normalize": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", @@ -20599,122 +21563,451 @@ "path-scurry": "^1.10.1" } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dev": true, + "requires": { + "glob": "^10.3.7" + } + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + }, + "ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true, + "requires": {} + } + } + }, + "@safe-global/safe-contracts": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@safe-global/safe-contracts/-/safe-contracts-1.4.1.tgz", + "integrity": "sha512-fP1jewywSwsIniM04NsqPyVRFKPMAuirC3ftA/TA4X3Zc5EnwQp/UCJUU2PL/37/z/jMo8UUaJ+pnFNWmMU7dQ==", + "requires": {} + }, + "@safe-global/safe-deployments": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/@safe-global/safe-deployments/-/safe-deployments-1.32.0.tgz", + "integrity": "sha512-7RXmnBrUzJ9+Iat74yx3Gel0kygmsaWjJhqr+0Fy8mkP5ly/6dTZ/2ize1pv3j9Yal04NTOqXbaJG4JnbTANQw==", + "dev": true, + "requires": { + "semver": "^7.3.7" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@safe-global/safe-erc4337": { + "version": "file:modules/4337", + "requires": { + "@account-abstraction/contracts": "github:5afe/account-abstraction#a476d9da6342cf827d0a458c2fb6356e0f015342", + "@noble/curves": "^1.3.0", + "@nomicfoundation/hardhat-toolbox": "^4.0.0", + "@openzeppelin/contracts": "^5.0.2", + "@safe-global/safe-contracts": "^1.4.1", + "@simplewebauthn/server": "9.0.0", + "@types/chai": "^4.3.11", + "@types/mocha": "^10.0.6", + "@types/node": "^20.11.18", + "@types/yargs": "^17.0.32", + "cbor": "^9.0.2", + "debug": "^4.3.4", + "dotenv": "^16.4.4", + "ethers": "^6.11.1", + "hardhat": "^2.20.1", + "hardhat-deploy": "0.11.45", + "husky": "^9.0.11", + "solc": "^0.8.24", + "solhint": "^4.1.1", + "ts-node": "^10.9.2", + "typescript": "^5.3.3", + "yargs": "^17.7.2" + }, + "dependencies": { + "@account-abstraction/contracts": { + "version": "git+ssh://git@github.com/5afe/account-abstraction.git#a476d9da6342cf827d0a458c2fb6356e0f015342", + "integrity": "sha512-Q4AxShnnZyzTGKwTVxgjvtkNS708oyFibOApQbVfd6TCtn/T1ED5LaX0IAUkXvGG5SVN3iFkyIkUkgVixQ9kLQ==", + "dev": true, + "from": "@account-abstraction/contracts@github:5afe/account-abstraction#a476d9da6342cf827d0a458c2fb6356e0f015342", + "requires": { + "@nomiclabs/hardhat-etherscan": "^2.1.6", + "@openzeppelin/contracts": "^5.0.0", + "@thehubbleproject/bls": "^0.5.1", + "@typechain/hardhat": "^2.3.0", + "@types/mocha": "^9.0.0", + "ethereumjs-util": "^7.1.0", + "ethereumjs-wallet": "^1.0.1", + "hardhat-deploy": "^0.11.23", + "hardhat-deploy-ethers": "^0.3.0-beta.11", + "solidity-coverage": "^0.8.4", + "source-map-support": "^0.5.19", + "table": "^6.8.0", + "typescript": "^4.3.5" + }, + "dependencies": { + "@nomiclabs/hardhat-etherscan": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.8.tgz", + "integrity": "sha512-0+rj0SsZotVOcTLyDOxnOc3Gulo8upo0rsw/h+gBPcmtj91YqYJNhdARHoBxOhhE8z+5IUQPx+Dii04lXT14PA==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^5.0.2", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "node-fetch": "^2.6.0", + "semver": "^6.3.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "@typechain/hardhat": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-2.3.1.tgz", + "integrity": "sha512-BQV8OKQi0KAzLXCdsPO0pZBNQQ6ra8A2ucC26uFX/kquRBtJu1yEyWnVSmtr07b5hyRoJRpzUeINLnyqz4/MAw==", + "dev": true, + "requires": { + "fs-extra": "^9.1.0" + } + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "dev": true, + "requires": { + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + } + }, + "ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "peer": true, + "requires": { + "@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", + "@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" + } + }, + "hardhat-deploy-ethers": { + "version": "0.3.0-beta.13", + "resolved": "https://registry.npmjs.org/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.3.0-beta.13.tgz", + "integrity": "sha512-PdWVcKB9coqWV1L7JTpfXRCI91Cgwsm7KLmBcwZ8f0COSm1xtABHZTyz3fvF6p42cTnz1VM0QnfDvMFlIRkSNw==", + "dev": true, + "requires": {} + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "typechain": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-5.2.0.tgz", + "integrity": "sha512-0INirvQ+P+MwJOeMct+WLkUE4zov06QxC96D+i3uGFEHoiSkZN70MKDQsaj8zkL86wQwByJReI2e7fOUwECFuw==", + "dev": true, + "peer": true, + "requires": { + "@types/prettier": "^2.1.1", + "command-line-args": "^4.0.7", + "debug": "^4.1.1", + "fs-extra": "^7.0.0", + "glob": "^7.1.6", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.1.2", + "ts-essentials": "^7.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } + } + }, + "typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", + "dev": true + }, + "@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "dev": true, + "peer": true, + "requires": { + "@ethersproject/abi": "^5.7.0", + "@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/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "dev": true, + "peer": true, + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "dev": true, + "peer": true, + "requires": { + "@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" + }, + "dependencies": { + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "dev": true, + "peer": true + } + } + }, + "@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "dev": true, + "peer": true, "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" } }, - "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", "dev": true, + "peer": true, "requires": { - "brace-expansion": "^2.0.1" + "@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" } }, - "rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", "dev": true, + "peer": true, "requires": { - "glob": "^10.3.7" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "requires": {} - } - } - }, - "@safe-global/safe-contracts": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@safe-global/safe-contracts/-/safe-contracts-1.4.1.tgz", - "integrity": "sha512-fP1jewywSwsIniM04NsqPyVRFKPMAuirC3ftA/TA4X3Zc5EnwQp/UCJUU2PL/37/z/jMo8UUaJ+pnFNWmMU7dQ==", - "requires": {} - }, - "@safe-global/safe-deployments": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/@safe-global/safe-deployments/-/safe-deployments-1.32.0.tgz", - "integrity": "sha512-7RXmnBrUzJ9+Iat74yx3Gel0kygmsaWjJhqr+0Fy8mkP5ly/6dTZ/2ize1pv3j9Yal04NTOqXbaJG4JnbTANQw==", - "dev": true, - "requires": { - "semver": "^7.3.7" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "dev": true, + "peer": true, "requires": { - "yallist": "^4.0.0" + "@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" } }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "dev": true, + "peer": true, "requires": { - "lru-cache": "^6.0.0" + "@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" } - } - } - }, - "@safe-global/safe-erc4337": { - "version": "file:modules/4337", - "requires": { - "@account-abstraction/contracts": "^0.6.0", - "@noble/curves": "^1.3.0", - "@nomicfoundation/hardhat-toolbox": "^4.0.0", - "@openzeppelin/contracts": "^5.0.2", - "@safe-global/safe-contracts": "^1.4.1", - "@simplewebauthn/server": "9.0.0", - "@types/chai": "^4.3.11", - "@types/mocha": "^10.0.6", - "@types/node": "^20.11.18", - "@types/yargs": "^17.0.32", - "cbor": "^9.0.2", - "debug": "^4.3.4", - "dotenv": "^16.4.4", - "ethers": "^6.11.1", - "hardhat": "^2.20.1", - "hardhat-deploy": "0.11.45", - "husky": "^9.0.11", - "solc": "^0.8.24", - "solhint": "^4.1.1", - "ts-node": "^10.9.2", - "typescript": "^5.3.3", - "yargs": "^17.7.2" - }, - "dependencies": { - "@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", - "dev": true }, "@noble/hashes": { "version": "1.3.2", @@ -20791,6 +22084,16 @@ "fs-extra": "^9.1.0" } }, + "array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "peer": true, + "requires": { + "typical": "^2.6.1" + } + }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -20802,12 +22105,60 @@ "wrap-ansi": "^7.0.0" } }, + "command-line-args": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-4.0.7.tgz", + "integrity": "sha512-aUdPvQRAyBvQd2n7jXcsMDz68ckBJELXNzBybCHOibUWEg0mWTnaYCSRU8h9R+aNRSvDihJtssSRCiDRpLaezA==", + "dev": true, + "peer": true, + "requires": { + "array-back": "^2.0.0", + "find-replace": "^1.0.3", + "typical": "^2.6.1" + } + }, "commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "dev": true }, + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + } + }, "ethers": { "version": "6.11.1", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.11.1.tgz", @@ -20840,12 +22191,34 @@ } } }, + "find-replace": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz", + "integrity": "sha512-KrUnjzDCD9426YnCP56zGYy/eieTnhtK6Vn++j+JJzmlsWWwEkDnsyVF575spT6HJ6Ow9tlbT3TQTDsa+O4UWA==", + "dev": true, + "peer": true, + "requires": { + "array-back": "^1.0.4", + "test-value": "^2.1.0" + }, + "dependencies": { + "array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", + "dev": true, + "peer": true, + "requires": { + "typical": "^2.6.0" + } + } + } + }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "peer": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -20858,12 +22231,31 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, - "peer": true, "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" } }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "peer": true + }, + "nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "dev": true + }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "peer": true + }, "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -20891,12 +22283,18 @@ "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true }, + "typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", + "dev": true, + "peer": true + }, "universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "peer": true + "dev": true }, "ws": { "version": "8.5.0", @@ -21742,6 +23140,192 @@ "defer-to-connect": "^2.0.1" } }, + "@thehubbleproject/bls": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@thehubbleproject/bls/-/bls-0.5.1.tgz", + "integrity": "sha512-g5zeMZ8js/yg6MjFoC+pt0eqfCL2jC46yLY1LbKNriyqftB1tE3jpG/FMMDIW3x9/yRg/AgUb8Nluqj15tQs+A==", + "dev": true, + "requires": { + "ethers": "^5.5.3", + "mcl-wasm": "^1.0.0" + }, + "dependencies": { + "@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "dev": true, + "requires": { + "@ethersproject/abi": "^5.7.0", + "@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/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "dev": true, + "requires": { + "@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": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "dev": true, + "requires": { + "@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/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "dev": true, + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "dev": true, + "requires": { + "@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/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "dev": true, + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "dev": true, + "requires": { + "@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/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "dev": true, + "requires": { + "@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" + } + }, + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "dev": true + }, + "ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "requires": { + "@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", + "@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" + } + } + } + }, "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -22951,8 +24535,7 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "ansi-align": { "version": "3.0.1", @@ -23244,6 +24827,12 @@ "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", "dev": true }, + "bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "dev": true + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -24415,7 +26004,6 @@ "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, "optional": true, - "peer": true, "requires": { "amdefine": ">=0.0.4" } @@ -25164,6 +26752,66 @@ } } }, + "ethereumjs-wallet": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz", + "integrity": "sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA==", + "dev": true, + "requires": { + "aes-js": "^3.1.2", + "bs58check": "^2.1.2", + "ethereum-cryptography": "^0.1.3", + "ethereumjs-util": "^7.1.2", + "randombytes": "^2.1.0", + "scrypt-js": "^3.0.1", + "utf8": "^3.0.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==", + "dev": true + }, + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + } + } + } + }, "ethers": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.4.0.tgz", @@ -27396,6 +29044,15 @@ "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==", "dev": true }, + "mcl-wasm": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-1.4.0.tgz", + "integrity": "sha512-90Tvmg2NXwnKMgTafA01PRELsYNNRb/F2bj3nzdByTLLMUmgkgL8H/oeWcjZtVVffnBJyNjDcYxY7cdOE/WoHg==", + "dev": true, + "requires": { + "@types/node": "^20.2.5" + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -29832,6 +31489,36 @@ } } }, + "test-value": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", + "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==", + "dev": true, + "peer": true, + "requires": { + "array-back": "^1.0.3", + "typical": "^2.6.0" + }, + "dependencies": { + "array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", + "dev": true, + "peer": true, + "requires": { + "typical": "^2.6.0" + } + }, + "typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", + "dev": true, + "peer": true + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -30218,8 +31905,7 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "optional": true, - "peer": true + "optional": true }, "uint8arrays": { "version": "3.1.1",