From a5b8151550df66cbcdb49a7de229cc50e51116ab Mon Sep 17 00:00:00 2001 From: reddyismav Date: Wed, 17 Jun 2026 20:49:29 +0400 Subject: [PATCH 01/11] feat: rfq and celer executor --- scripts/deploy/celerExecutorAddresses.ts | 77 + scripts/deploy/create3.ts | 8 + scripts/deploy/deployCelerExecutor.ts | 301 +++ src/common/lib/Pb.sol | 114 ++ src/executors/CelerExecutor.sol | 179 ++ src/executors/RFQVaultExecutor.sol | 305 +++ src/interfaces/ICelerBridge.sol | 30 + test/unit/RFQVaultExecutor.t.sol | 744 ++++++++ yarn.lock | 2139 ++++++++++++++++++++++ 9 files changed, 3897 insertions(+) create mode 100644 scripts/deploy/celerExecutorAddresses.ts create mode 100644 scripts/deploy/deployCelerExecutor.ts create mode 100644 src/common/lib/Pb.sol create mode 100644 src/executors/CelerExecutor.sol create mode 100644 src/executors/RFQVaultExecutor.sol create mode 100644 src/interfaces/ICelerBridge.sol create mode 100644 test/unit/RFQVaultExecutor.t.sol create mode 100644 yarn.lock diff --git a/scripts/deploy/celerExecutorAddresses.ts b/scripts/deploy/celerExecutorAddresses.ts new file mode 100644 index 0000000..fef8dd8 --- /dev/null +++ b/scripts/deploy/celerExecutorAddresses.ts @@ -0,0 +1,77 @@ +import { mkdir, readFile, writeFile } from 'fs/promises'; +import { dirname, resolve } from 'path'; + +export type CelerExecutorDeployments = { + CelerExecutor: string; +}; + +export function celerExecutorAddressesPath( + network: string, + stage = 'prod', +): string { + return resolve( + process.cwd(), + 'deployments', + stage, + 'addresses', + `${network}.json`, + ); +} + +export async function readCelerExecutorAddress( + network: string, + stage = 'prod', +): Promise { + const filePath = celerExecutorAddressesPath(network, stage); + + try { + const raw = await readFile(filePath, 'utf8'); + const deployments = JSON.parse(raw) as Partial; + const address = deployments.CelerExecutor?.trim(); + + if (!address) { + return undefined; + } + + return address; + } catch (err) { + if ((err as NodeJS.ErrnoException).code === 'ENOENT') { + return undefined; + } + + throw err; + } +} + +/** + * Persists CelerExecutor address for a network. + * Creates deployments//addresses/ and .json when missing. + */ +export async function writeCelerExecutorAddress( + network: string, + address: string, + stage = 'prod', +): Promise { + const filePath = celerExecutorAddressesPath(network, stage); + let deployments: Partial = {}; + + try { + const raw = await readFile(filePath, 'utf8'); + deployments = JSON.parse(raw) as Partial; + } catch (err) { + if ((err as NodeJS.ErrnoException).code !== 'ENOENT') { + throw err; + } + } + + deployments.CelerExecutor = address; + + await mkdir(dirname(filePath), { recursive: true }); + await writeFile( + filePath, + `${JSON.stringify(deployments, null, 2)}\n`, + 'utf8', + ); + + return filePath; +} diff --git a/scripts/deploy/create3.ts b/scripts/deploy/create3.ts index 15ebe16..e58bca2 100644 --- a/scripts/deploy/create3.ts +++ b/scripts/deploy/create3.ts @@ -55,6 +55,14 @@ export const ACROSS_MANIPULATOR_CREATE3_SALT = keccak256( toUtf8Bytes(ACROSS_MANIPULATOR_CREATE3_SALT_TEXT), ); +/** CREATE3 salt label used by `deployCelerExecutor.ts`. */ +export const CELER_EXECUTOR_CREATE3_SALT_TEXT = 'CelerExecutor'; + +/** Keccak256 salt for deterministic CelerExecutor CREATE3 deployments. */ +export const CELER_EXECUTOR_CREATE3_SALT = keccak256( + toUtf8Bytes(CELER_EXECUTOR_CREATE3_SALT_TEXT), +); + const ADDR_HEX_RE = /^0x[a-fA-F0-9]{40}$/; const CREATE3_PROXY_INIT_CODE_HASH = keccak256( '0x67363d3d37363d34f03d5260086018f3', diff --git a/scripts/deploy/deployCelerExecutor.ts b/scripts/deploy/deployCelerExecutor.ts new file mode 100644 index 0000000..f90bf16 --- /dev/null +++ b/scripts/deploy/deployCelerExecutor.ts @@ -0,0 +1,301 @@ +/** + * Deployment script for CelerExecutor via CreateX CREATE3. + * + * Deploy on Celer direct-quote origin chains only (8 chains in CELER_EXECUTOR_CHAIN_CONFIG). + * + * Usage: + * npx hardhat run scripts/deploy/deployCelerExecutor.ts --network + * + * Supported hardhat networks for Celer origin: + * ethereum, optimism, bsc, polygon, arbitrum, avalanche, base, linea + * + * Required env vars: + * DEPLOYER_PRIVATE_KEY — deployer wallet private key + * + * Optional env vars: + * OWNER_ADDRESS — CelerExecutor owner (refund admin); defaults to DEFAULT_OWNER_ADDRESS or deployer + */ + +import hre, { ethers } from 'hardhat'; +import { + CELER_EXECUTOR_CREATE3_SALT, + CELER_EXECUTOR_CREATE3_SALT_TEXT, + CREATE_X_FACTORY, + Create3ABI, + OPEN_ROUTER_EXPECTED_ADDRESS, + decodeCreate3DeploymentFromTxReceipt, + hasContractBytecode, +} from './create3'; +import { findDeploymentRegistryRow } from './deploymentRegistry'; +import { writeCelerExecutorAddress } from './celerExecutorAddresses'; + +// ============================================================================= +// Deployment config — fill DEFAULT_OWNER_ADDRESS before mainnet deploy +// ============================================================================= + +/** CelerExecutor owner (refund admin). Override via OWNER_ADDRESS env at runtime. */ +const DEFAULT_OWNER_ADDRESS = '0x0E1B5AB67aF1c99F8c7Ebc71f41f75D4D6211e53'; + +/** + * Per-chain cBridge router addresses (Celer MessageBus). + * OpenRouter is resolved from deployments.csv per chainId. + */ +const CELER_EXECUTOR_CHAIN_CONFIG: Record< + number, + { name: string; cBridgeRouter: string } +> = { + 1: { + name: 'ethereum', + cBridgeRouter: '0x5427FEFA711Eff984124bFBB1AB6fbf5E3DA1820', + }, + 10: { + name: 'optimism', + cBridgeRouter: '0x9D39Fc627A6d9d9F8C831c16995b209548cc3401', + }, + 56: { + name: 'bsc', + cBridgeRouter: '0xdd90E5E87A2081Dcf0391920868eBc2FFB81a1aF', + }, + 137: { + name: 'polygon', + cBridgeRouter: '0x88DCDC47D2f83a99CF0000FDF667A468bB958a78', + }, + 42161: { + name: 'arbitrum', + cBridgeRouter: '0x1619DE6B6B20eD217a58d00f37B9d47C7663feca', + }, + 43114: { + name: 'avalanche', + cBridgeRouter: '0xef3c714c9425a8F3697A9C969Dc1af30ba82e5d4', + }, + 8453: { + name: 'base', + cBridgeRouter: '0x7d43AABC515C356145049227CeE54B608342c0ad', + }, + 59144: { + name: 'linea', + cBridgeRouter: '0x9B36f165baB9ebe611d491180418d8De4b8f3a1f', + }, +}; + +const ADDR_HEX_RE = /^0x[a-fA-F0-9]{40}$/; + +function resolveOwnerAddress(deployerAddress: string): string { + const envOwner = process.env.OWNER_ADDRESS?.trim(); + if (envOwner && ADDR_HEX_RE.test(envOwner)) { + return envOwner; + } + + if (DEFAULT_OWNER_ADDRESS && ADDR_HEX_RE.test(DEFAULT_OWNER_ADDRESS)) { + return DEFAULT_OWNER_ADDRESS; + } + + return deployerAddress; +} + +function resolveOpenRouterAddress(chainId: number): string { + const row = findDeploymentRegistryRow(chainId); + const registryAddress = row?.openRouterAddress?.trim(); + if (registryAddress && ADDR_HEX_RE.test(registryAddress)) { + return registryAddress; + } + + return OPEN_ROUTER_EXPECTED_ADDRESS; +} + +async function getCelerExecutorInitcode(params: { + owner: string; + openRouter: string; + cBridgeRouter: string; +}): Promise { + const factory = await ethers.getContractFactory('CelerExecutor'); + const deployTransaction = await factory.getDeployTransaction( + params.owner, + params.openRouter, + params.cBridgeRouter, + ); + + if (!deployTransaction.data) { + throw new Error('CelerExecutor deploy transaction data is empty'); + } + + return deployTransaction.data; +} + +async function assertCelerExecutorDeployment(params: { + address: string; + owner: string; + openRouter: string; + cBridgeRouter: string; +}): Promise { + const contract = new ethers.Contract( + params.address, + [ + 'function owner() view returns (address)', + 'function OPEN_ROUTER() view returns (address)', + 'function CELER_BRIDGE() view returns (address)', + ], + ethers.provider, + ); + + const [owner, openRouter, cBridge] = await Promise.all([ + contract.owner() as Promise, + contract.OPEN_ROUTER() as Promise, + contract.CELER_BRIDGE() as Promise, + ]); + + if (owner.toLowerCase() !== params.owner.toLowerCase()) { + throw new Error( + `CelerExecutor owner mismatch: expected ${params.owner}, got ${owner}`, + ); + } + + if (openRouter.toLowerCase() !== params.openRouter.toLowerCase()) { + throw new Error( + `CelerExecutor OPEN_ROUTER mismatch: expected ${params.openRouter}, got ${openRouter}`, + ); + } + + if (cBridge.toLowerCase() !== params.cBridgeRouter.toLowerCase()) { + throw new Error( + `CelerExecutor CELER_BRIDGE mismatch: expected ${params.cBridgeRouter}, got ${cBridge}`, + ); + } +} + +function printBackendConfigSnippet(chainId: number, address: string): void { + console.log('\n=== bungee-backend config snippet ==='); + console.log( + 'Update CELER_EXECUTOR_ADDRESSES in bungee-backend/src/modules/router/routers/staked/celer/celer.config.ts:', + ); + console.log(` [${chainId}]: '${address}',`); +} + +async function persistCelerExecutorAddress(params: { + network: string; + chainId: number; + address: string; +}): Promise { + const filePath = await writeCelerExecutorAddress( + params.network, + params.address, + ); + console.log('Deployment JSON:', filePath); + printBackendConfigSnippet(params.chainId, params.address); +} + +async function main() { + const [deployer] = await ethers.getSigners(); + const networkName = hre.network.name; + const chainId = Number((await ethers.provider.getNetwork()).chainId); + const chainConfig = CELER_EXECUTOR_CHAIN_CONFIG[chainId]; + + console.log('Deployer: ', deployer.address); + console.log('Network: ', networkName); + console.log('Chain ID: ', chainId); + console.log('CREATE3 salt: ', CELER_EXECUTOR_CREATE3_SALT_TEXT); + console.log(''); + + if (!chainConfig) { + throw new Error( + `Chain ${chainId} is not a Celer origin chain. Supported chainIds: ${Object.keys( + CELER_EXECUTOR_CHAIN_CONFIG, + ).join(', ')}`, + ); + } + + const owner = resolveOwnerAddress(deployer.address); + const openRouter = resolveOpenRouterAddress(chainId); + const { cBridgeRouter } = chainConfig; + + console.log('Owner: ', owner); + console.log('OpenRouter: ', openRouter); + console.log('cBridgeRouter:', cBridgeRouter); + console.log(''); + + const initcode = await getCelerExecutorInitcode({ + owner, + openRouter, + cBridgeRouter, + }); + + const create3Factory = new ethers.Contract( + CREATE_X_FACTORY, + Create3ABI, + deployer, + ); + + const expectedAddress = (await create3Factory.deployCreate3.staticCall( + CELER_EXECUTOR_CREATE3_SALT, + initcode, + )) as string; + + console.log('Expected address:', expectedAddress); + + const existingBytecode = await ethers.provider.getCode(expectedAddress); + if (hasContractBytecode(existingBytecode)) { + console.log(`CelerExecutor already deployed at ${expectedAddress}`); + await assertCelerExecutorDeployment({ + address: expectedAddress, + owner, + openRouter, + cBridgeRouter, + }); + await persistCelerExecutorAddress({ + network: chainConfig.name, + chainId, + address: expectedAddress, + }); + return; + } + + console.log('Deploying CelerExecutor via CREATE3...'); + const create3Deployment = await create3Factory.deployCreate3( + CELER_EXECUTOR_CREATE3_SALT, + initcode, + ); + console.log('CREATE3 deployment tx:', create3Deployment.hash); + + const receipt = await create3Deployment.wait(); + const executorAddress = decodeCreate3DeploymentFromTxReceipt({ receipt }); + if (!executorAddress) { + throw new Error( + 'CelerExecutor address not found in CREATE3 deployment receipt', + ); + } + + if (executorAddress.toLowerCase() !== expectedAddress.toLowerCase()) { + throw new Error( + `Deployed address ${executorAddress} does not match staticCall ${expectedAddress}`, + ); + } + + await assertCelerExecutorDeployment({ + address: executorAddress, + owner, + openRouter, + cBridgeRouter, + }); + + console.log('\n=== Deployment Summary ==='); + console.log(`CelerExecutor (${chainConfig.name}): ${executorAddress}`); + await persistCelerExecutorAddress({ + network: chainConfig.name, + chainId, + address: executorAddress, + }); + + if (chainId !== 31337) { + await new Promise((resolve) => setTimeout(resolve, 5000)); + + await hre.run('verify:verify', { + address: executorAddress, + constructorArguments: [owner, openRouter, cBridgeRouter], + }); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/src/common/lib/Pb.sol b/src/common/lib/Pb.sol new file mode 100644 index 0000000..e8a475f --- /dev/null +++ b/src/common/lib/Pb.sol @@ -0,0 +1,114 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity 0.8.34; + +/// @notice Runtime protobuf decoder for Celer withdraw messages. +library Pb { + enum WireType { + Varint, + Fixed64, + LengthDelim, + StartGroup, + EndGroup, + Fixed32 + } + + struct Buffer { + uint256 idx; + bytes b; + } + + function fromBytes(bytes memory raw) internal pure returns (Buffer memory buf) { + buf.b = raw; + buf.idx = 0; + } + + function hasMore(Buffer memory buf) internal pure returns (bool) { + return buf.idx < buf.b.length; + } + + function decKey(Buffer memory buf) internal pure returns (uint256 tag, WireType wiretype) { + uint256 v = decVarint(buf); + tag = v / 8; + wiretype = WireType(v & 7); + } + + function decVarint(Buffer memory buf) internal pure returns (uint256 v) { + bytes10 tmp; + bytes memory bb = buf.b; + v = buf.idx; + assembly ("memory-safe") { + tmp := mload(add(add(bb, 32), v)) + } + uint256 b; + v = 0; + for (uint256 i = 0; i < 10; i++) { + assembly ("memory-safe") { + b := byte(i, tmp) + } + v |= (b & 0x7F) << (i * 7); + if (b & 0x80 == 0) { + buf.idx += i + 1; + return v; + } + } + revert(); + } + + function decBytes(Buffer memory buf) internal pure returns (bytes memory b) { + uint256 len = decVarint(buf); + uint256 end = buf.idx + len; + require(end <= buf.b.length); + b = new bytes(len); + bytes memory bufB = buf.b; + uint256 bStart; + uint256 bufBStart = buf.idx; + assembly ("memory-safe") { + bStart := add(b, 32) + bufBStart := add(add(bufB, 32), bufBStart) + } + for (uint256 i = 0; i < len; i += 32) { + assembly ("memory-safe") { + mstore(add(bStart, i), mload(add(bufBStart, i))) + } + } + buf.idx = end; + } + + function skipValue(Buffer memory buf, WireType wire) internal pure { + if (wire == WireType.Varint) { + decVarint(buf); + } else if (wire == WireType.LengthDelim) { + uint256 len = decVarint(buf); + buf.idx += len; + require(buf.idx <= buf.b.length); + } else { + revert(); + } + } + + function _uint256(bytes memory b) internal pure returns (uint256 v) { + require(b.length <= 32); + assembly ("memory-safe") { + v := mload(add(b, 32)) + } + v = v >> (8 * (32 - b.length)); + } + + function _address(bytes memory b) internal pure returns (address v) { + v = _addressPayable(b); + } + + function _addressPayable(bytes memory b) internal pure returns (address payable v) { + require(b.length == 20); + assembly ("memory-safe") { + v := div(mload(add(b, 32)), 0x1000000000000000000000000) + } + } + + function _bytes32(bytes memory b) internal pure returns (bytes32 v) { + require(b.length == 32); + assembly ("memory-safe") { + v := mload(add(b, 32)) + } + } +} diff --git a/src/executors/CelerExecutor.sol b/src/executors/CelerExecutor.sol new file mode 100644 index 0000000..71857f7 --- /dev/null +++ b/src/executors/CelerExecutor.sol @@ -0,0 +1,179 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity 0.8.34; + +import {SafeTransferLib} from "solady/src/utils/SafeTransferLib.sol"; + +import {Ownable} from "../common/utils/Ownable.sol"; +import {RescueFundsLib} from "../common/lib/RescueFundsLib.sol"; +import {Pb} from "../common/lib/Pb.sol"; +import {IERC20} from "../common/interfaces/IERC20.sol"; +import {ICelerBridge} from "../interfaces/ICelerBridge.sol"; + +/// @title CelerExecutor +/// @notice Proxies Celer bridge calls from OpenRouter so refunds return to this contract. +contract CelerExecutor is Ownable { + using Pb for Pb.Buffer; + + error CallerNotOpenRouter(); + error InvalidCelerRefund(); + error CelerRefundNotReady(); + + struct WithdrawMsg { + uint64 chainid; + uint64 seqnum; + address receiver; + address token; + uint256 amount; + bytes32 refid; + } + + ICelerBridge public immutable CELER_BRIDGE; + address public immutable OPEN_ROUTER; + uint64 public immutable CHAIN_ID; + + constructor(address _owner, address _openRouter, address _celerBridgeRouter) Ownable(_owner) { + CELER_BRIDGE = ICelerBridge(_celerBridgeRouter); + OPEN_ROUTER = _openRouter; + CHAIN_ID = uint64(block.chainid); + } + + /// @notice Bridge tokens via Celer; only callable by OpenRouter. + /// @param receiver Destination receiver on the dst chain. + /// @param token ERC-20 token to bridge; ignored when `isNative` is true. + /// @param amount Amount to bridge; may be spliced at runtime by OpenRouter on swapAndBridge. + /// @param dstChainId Celer destination chain id. + /// @param nonce Unique nonce for the transfer. + /// @param maxSlippage Max slippage in basis points. + /// @param isNative When true, forwards `amount` as msg.value to `sendNative`. + function execute( + address receiver, + address token, + uint256 amount, + uint64 dstChainId, + uint64 nonce, + uint32 maxSlippage, + bool isNative + ) external payable { + if (msg.sender != OPEN_ROUTER) { + revert CallerNotOpenRouter(); + } + + if (isNative) { + CELER_BRIDGE.sendNative{value: amount}(receiver, amount, dstChainId, nonce, maxSlippage); + return; + } + + SafeTransferLib.safeTransferFrom(token, OPEN_ROUTER, address(this), amount); + + if (amount > IERC20(token).allowance(address(this), address(CELER_BRIDGE))) { + SafeTransferLib.safeApproveWithRetry(token, address(CELER_BRIDGE), type(uint256).max); + } + + CELER_BRIDGE.send(receiver, token, amount, dstChainId, nonce, maxSlippage); + } + + /// @notice Admin refund handler for Celer bridge withdrawals. + /// @param _receiver Address that receives the refunded funds. + /// @param _request Withdraw message from the Celer SDK. + /// @param _sigs Validator signatures. + /// @param _signers Validator signer addresses. + /// @param _powers Validator powers. + function refundCelerUserAdmin( + address _receiver, + bytes calldata _request, + bytes[] calldata _sigs, + address[] calldata _signers, + uint256[] calldata _powers + ) external payable onlyOwner { + WithdrawMsg memory request = decWithdrawMsg(_request); + + if (request.receiver != address(this)) { + revert InvalidCelerRefund(); + } + + uint256 snapNative = address(this).balance; + uint256 snapToken = SafeTransferLib.balanceOf(request.token, address(this)); + + _withdrawIfNeeded(request, _request, _sigs, _signers, _powers); + _payoutRefund(request, _receiver, snapNative, snapToken); + } + + function _withdrawIfNeeded( + WithdrawMsg memory request, + bytes calldata requestBytes, + bytes[] calldata sigs, + address[] calldata signers, + uint256[] calldata powers + ) private { + bytes32 transferId = keccak256( + abi.encodePacked(request.chainid, request.seqnum, request.receiver, request.token, request.amount) + ); + + if (!CELER_BRIDGE.withdraws(transferId)) { + CELER_BRIDGE.withdraw(requestBytes, sigs, signers, powers); + } + } + + function _payoutRefund( + WithdrawMsg memory request, + address receiver, + uint256 snapNative, + uint256 snapToken + ) private { + uint256 nativeAfter = address(this).balance; + + if (nativeAfter > snapNative) { + if ((nativeAfter - snapNative) != request.amount) { + revert CelerRefundNotReady(); + } + SafeTransferLib.safeTransferETH(receiver, request.amount); + return; + } + + uint256 tokenAfter = SafeTransferLib.balanceOf(request.token, address(this)); + + if (tokenAfter > snapToken) { + if ((tokenAfter - snapToken) != request.amount) { + revert CelerRefundNotReady(); + } + SafeTransferLib.safeTransfer(request.token, receiver, request.amount); + return; + } + + revert CelerRefundNotReady(); + } + + /// @notice Rescues funds locked in the contract. + function rescueFunds(address token_, address rescueTo_, uint256 amount_) external onlyOwner { + RescueFundsLib.rescueFunds(token_, rescueTo_, amount_); + } + + function decWithdrawMsg(bytes memory raw) internal pure returns (WithdrawMsg memory m) { + Pb.Buffer memory buf = Pb.fromBytes(raw); + + uint256 tag; + Pb.WireType wire; + while (buf.hasMore()) { + (tag, wire) = buf.decKey(); + if (tag == 1) { + m.chainid = uint64(buf.decVarint()); + } else if (tag == 2) { + m.seqnum = uint64(buf.decVarint()); + } else if (tag == 3) { + m.receiver = Pb._address(buf.decBytes()); + } else if (tag == 4) { + m.token = Pb._address(buf.decBytes()); + } else if (tag == 5) { + m.amount = Pb._uint256(buf.decBytes()); + } else if (tag == 6) { + m.refid = Pb._bytes32(buf.decBytes()); + } else { + buf.skipValue(wire); + } + } + } + + receive() external payable {} + + fallback() external payable {} +} diff --git a/src/executors/RFQVaultExecutor.sol b/src/executors/RFQVaultExecutor.sol new file mode 100644 index 0000000..13f9fa3 --- /dev/null +++ b/src/executors/RFQVaultExecutor.sol @@ -0,0 +1,305 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity 0.8.34; + +import {SafeTransferLib} from "solady/src/utils/SafeTransferLib.sol"; + +import {Ownable} from "../common/utils/Ownable.sol"; +import {RescueFundsLib} from "../common/lib/RescueFundsLib.sol"; +import {AuthenticationLib} from "../common/lib/AuthenticationLib.sol"; +import {CurrencyLib} from "../common/lib/CurrencyLib.sol"; + +/// @title RFQVaultExecutor +/// @notice Solver-controlled vault that receives funds from OpenRouter and releases them via signed fulfil/refund flows. +contract RFQVaultExecutor is Ownable { + struct Action { + address target; + uint256 value; + bytes data; + } + + error ActionFailed(uint256 index); + error CallerNotOpenRouter(); + error InvalidQuoteId(); + error InvalidNonce(); + error InvalidSigner(); + error SwapOutputInsufficient(); + + uint256 internal constant FULFIL_DISCRIMINATOR = 1; + uint256 internal constant REFUND_DISCRIMINATOR = 2; + uint256 internal constant SWAP_AND_FULFIL_DISCRIMINATOR = 3; + + address public immutable OPEN_ROUTER; + + address internal SOLVER_SIGNER; + + mapping(bytes32 quoteId => uint256 isUsed) public quoteIdUsed; + mapping(uint256 nonce => uint256 isUsed) public nonceUsed; + + event NativeDeposited(bytes32 indexed quoteId, uint256 amount); + event Fulfilled(bytes32 indexed quoteId, address token, uint256 amount, address receiver); + event Refunded(bytes32 indexed quoteId, address token, uint256 amount, address receiver); + + constructor(address _owner, address _openRouter, address _solverSigner) Ownable(_owner) { + OPEN_ROUTER = _openRouter; + SOLVER_SIGNER = _solverSigner; + } + + /// @notice Accept native deposits from OpenRouter and emit a correlating event. + function receiveNative(bytes32 quoteId) external payable { + if (msg.sender != OPEN_ROUTER) { + revert CallerNotOpenRouter(); + } + + emit NativeDeposited(quoteId, msg.value); + } + + /// @notice Transfer vault funds to a receiver for a signed quote. + function fulfil( + bytes32 quoteId, + uint256 nonce, + address token, + uint256 amount, + address receiver, + bytes calldata signature + ) external { + bytes32 messageHash = _hashFulfilOrRefund(FULFIL_DISCRIMINATOR, quoteId, nonce, token, amount, receiver); + _verifyAndMarkQuoteId(messageHash, signature, quoteId); + + CurrencyLib.transfer(token, receiver, amount); + emit Fulfilled(quoteId, token, amount, receiver); + } + + /// @notice Swap vault inventory then transfer swap output to the receiver. + function swapAndFulfil( + bytes32 quoteId, + uint256 nonce, + address approvalToken, + address approvalSpender, + uint256 approvalAmount, + address outputToken, + uint256 minOutput, + Action calldata swapAction, + address receiver, + bytes calldata signature + ) external { + bytes32 messageHash = _hashSwapAndFulfil( + quoteId, + nonce, + approvalToken, + approvalSpender, + approvalAmount, + outputToken, + minOutput, + swapAction, + receiver + ); + _verifyAndMarkQuoteId(messageHash, signature, quoteId); + + if (approvalToken != address(0)) { + SafeTransferLib.safeApproveWithRetry(approvalToken, approvalSpender, approvalAmount); + } + + uint256 beforeBalance = CurrencyLib.balanceOf(outputToken, address(this)); + if (!_performAction(swapAction)) { + revert ActionFailed(0); + } + + uint256 swapOutput; + unchecked { + swapOutput = CurrencyLib.balanceOf(outputToken, address(this)) - beforeBalance; + } + + if (swapOutput < minOutput) { + revert SwapOutputInsufficient(); + } + + CurrencyLib.transfer(outputToken, receiver, swapOutput); + emit Fulfilled(quoteId, outputToken, swapOutput, receiver); + } + + /// @notice Execute arbitrary signed actions unrelated to quote fulfilment. + function performActions(uint256 nonce, Action[] calldata actions, bytes calldata signature) external { + bytes32 messageHash = keccak256(abi.encode(block.chainid, address(this), nonce, actions)); + _verifyAndMarkNonce(messageHash, signature, nonce); + + uint256 actionsLength = actions.length; + for (uint256 i = 0; i < actionsLength;) { + if (!_performAction(actions[i])) { + revert ActionFailed(i); + } + unchecked { + ++i; + } + } + } + + /// @notice Refund vault funds to a receiver for a signed quote. + function refund( + bytes32 quoteId, + uint256 nonce, + address token, + uint256 amount, + address receiver, + bytes calldata signature + ) external { + bytes32 messageHash = _hashFulfilOrRefund(REFUND_DISCRIMINATOR, quoteId, nonce, token, amount, receiver); + _verifyAndMarkQuoteId(messageHash, signature, quoteId); + + CurrencyLib.transfer(token, receiver, amount); + emit Refunded(quoteId, token, amount, receiver); + } + + function setSolverSigner(address _solverSigner) external onlyOwner { + SOLVER_SIGNER = _solverSigner; + } + + function rescueFunds(address token_, address rescueTo_, uint256 amount_) external onlyOwner { + RescueFundsLib.rescueFunds(token_, rescueTo_, amount_); + } + + receive() external payable {} + + /// @dev Fixed-size fulfil/refund hash without abi.encode overhead. + function _hashFulfilOrRefund( + uint256 discriminator, + bytes32 quoteId, + uint256 nonce, + address token, + uint256 amount, + address receiver + ) internal view returns (bytes32 hash) { + assembly { + let ptr := mload(0x40) + mstore(ptr, chainid()) + mstore(add(ptr, 0x20), address()) + mstore(add(ptr, 0x40), discriminator) + mstore(add(ptr, 0x60), quoteId) + mstore(add(ptr, 0x80), nonce) + mstore(add(ptr, 0xa0), token) + mstore(add(ptr, 0xc0), amount) + mstore(add(ptr, 0xe0), receiver) + hash := keccak256(ptr, 0x100) + mstore(0x40, add(ptr, 0x100)) + } + } + + function _hashSwapAndFulfil( + bytes32 quoteId, + uint256 nonce, + address approvalToken, + address approvalSpender, + uint256 approvalAmount, + address outputToken, + uint256 minOutput, + Action calldata swapAction, + address receiver + ) internal view returns (bytes32 hash) { + bytes32 dataHash = _keccak256CalldataBytes(swapAction.data); + + assembly { + let ptr := mload(0x40) + mstore(ptr, chainid()) + mstore(add(ptr, 0x20), address()) + mstore(add(ptr, 0x40), SWAP_AND_FULFIL_DISCRIMINATOR) + mstore(add(ptr, 0x60), quoteId) + mstore(add(ptr, 0x80), nonce) + mstore(add(ptr, 0xa0), approvalToken) + mstore(add(ptr, 0xc0), approvalSpender) + mstore(add(ptr, 0xe0), approvalAmount) + mstore(add(ptr, 0x100), outputToken) + mstore(add(ptr, 0x120), minOutput) + mstore(add(ptr, 0x140), calldataload(swapAction)) + mstore(add(ptr, 0x160), calldataload(add(swapAction, 0x20))) + mstore(add(ptr, 0x180), dataHash) + mstore(add(ptr, 0x1a0), receiver) + hash := keccak256(ptr, 0x1c0) + mstore(0x40, add(ptr, 0x1c0)) + } + } + + function _keccak256CalldataBytes(bytes calldata data) internal pure returns (bytes32 hash) { + assembly { + let ptr := mload(0x40) + let len := data.length + calldatacopy(ptr, data.offset, len) + hash := keccak256(ptr, len) + mstore(0x40, add(ptr, and(add(len, 0x1f), not(0x1f)))) + } + } + + function _verifyAndMarkQuoteId(bytes32 messageHash, bytes calldata signature, bytes32 quoteId) internal { + address signer = SOLVER_SIGNER; + if (signer != AuthenticationLib.authenticate(messageHash, signature)) { + assembly { + mstore(0x00, 0x815e1d64) + revert(0x1c, 0x04) + } + } + _markQuoteId(quoteId); + } + + function _verifyAndMarkNonce(bytes32 messageHash, bytes calldata signature, uint256 nonce) internal { + address signer = SOLVER_SIGNER; + if (signer != AuthenticationLib.authenticate(messageHash, signature)) { + assembly { + mstore(0x00, 0x815e1d64) + revert(0x1c, 0x04) + } + } + _markNonce(nonce); + } + + function _markQuoteId(bytes32 quoteId) internal { + assembly { + mstore(0, quoteId) + mstore(0x20, quoteIdUsed.slot) + let dataSlot := keccak256(0, 0x40) + + if sload(dataSlot) { + mstore(0x00, 0x140dcdb5) + revert(0x1c, 0x04) + } + + sstore(dataSlot, 0x01) + } + } + + function _markNonce(uint256 nonce) internal { + assembly { + mstore(0, nonce) + mstore(0x20, nonceUsed.slot) + let dataSlot := keccak256(0, 0x40) + + if sload(dataSlot) { + mstore(0x00, 0x756688fe) + revert(0x1c, 0x04) + } + + sstore(dataSlot, 0x01) + } + } + + /// @dev Does not revert on failure. Caller should check the return value. + function _performAction(Action calldata action) internal returns (bool success) { + assembly { + let actionDataLength := calldataload(add(action, 0x60)) + + let freeMemPtr := mload(0x40) + calldatacopy( + freeMemPtr, + add(add(action, 0x20), calldataload(add(action, 0x40))), + actionDataLength + ) + + success := call( + gas(), + calldataload(action), + calldataload(add(action, 0x20)), + freeMemPtr, + actionDataLength, + 0, + 0 + ) + } + } +} diff --git a/src/interfaces/ICelerBridge.sol b/src/interfaces/ICelerBridge.sol new file mode 100644 index 0000000..9b3f79a --- /dev/null +++ b/src/interfaces/ICelerBridge.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity 0.8.34; + +interface ICelerBridge { + function send( + address _receiver, + address _token, + uint256 _amount, + uint64 _dstChainId, + uint64 _nonce, + uint32 _maxSlippage + ) external; + + function sendNative( + address _receiver, + uint256 _amount, + uint64 _dstChainId, + uint64 _nonce, + uint32 _maxSlippage + ) external payable; + + function withdraws(bytes32 withdrawId) external view returns (bool); + + function withdraw( + bytes calldata _wdmsg, + bytes[] calldata _sigs, + address[] calldata _signers, + uint256[] calldata _powers + ) external; +} diff --git a/test/unit/RFQVaultExecutor.t.sol b/test/unit/RFQVaultExecutor.t.sol new file mode 100644 index 0000000..6d53888 --- /dev/null +++ b/test/unit/RFQVaultExecutor.t.sol @@ -0,0 +1,744 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.34; + +import {Test} from "forge-std/Test.sol"; +import {ERC20} from "solady/src/tokens/ERC20.sol"; + +import {RFQVaultExecutor} from "../../src/executors/RFQVaultExecutor.sol"; +import {AuthenticationLib} from "../../src/common/lib/AuthenticationLib.sol"; +import {CurrencyLib} from "../../src/common/lib/CurrencyLib.sol"; + +contract RFQVaultExecutorTest is Test { + uint256 internal constant FULFIL_DISCRIMINATOR = 1; + uint256 internal constant REFUND_DISCRIMINATOR = 2; + uint256 internal constant SWAP_AND_FULFIL_DISCRIMINATOR = 3; + + address internal constant NATIVE_TOKEN = CurrencyLib.NATIVE_TOKEN_ADDRESS; + address internal constant OWNER = address(0x2222); + address internal constant RECEIVER = address(0xB0B); + address internal constant OTHER = address(0xCAFE); + + uint256 internal constant SOLVER_PRIVATE_KEY = 0xA11CE; + address internal solverSigner; + address internal openRouter; + + bytes32 internal constant QUOTE_ID = keccak256("quote-1"); + uint256 internal constant NONCE = 1; + uint256 internal constant AMOUNT = 100 ether; + uint256 internal constant SWAP_OUTPUT = 175 ether; + + RFQVaultExecutor internal vault; + MockERC20 internal token; + MockERC20 internal outputToken; + MockSwap internal swapTarget; + MockActionTarget internal actionTarget; + + function setUp() public { + solverSigner = vm.addr(SOLVER_PRIVATE_KEY); + openRouter = address(new OpenRouterStub()); + + vault = new RFQVaultExecutor(OWNER, openRouter, solverSigner); + token = new MockERC20("Input", "IN"); + outputToken = new MockERC20("Output", "OUT"); + swapTarget = new MockSwap(); + actionTarget = new MockActionTarget(); + + vm.label(address(vault), "vault"); + vm.label(address(token), "token"); + vm.label(address(outputToken), "outputToken"); + vm.label(address(swapTarget), "swapTarget"); + vm.label(address(actionTarget), "actionTarget"); + vm.label(openRouter, "openRouter"); + vm.label(RECEIVER, "receiver"); + vm.label(solverSigner, "solverSigner"); + } + + function test_receiveNative_emitsEvent() public { + vm.deal(openRouter, AMOUNT); + + vm.expectEmit(true, false, false, true, address(vault)); + emit RFQVaultExecutor.NativeDeposited(QUOTE_ID, AMOUNT); + + OpenRouterStub(openRouter).sendNativeFromBalance(address(vault), QUOTE_ID, AMOUNT); + } + + function test_receiveNative_revertsIfNotOpenRouter() public { + CallerStub otherCaller = new CallerStub(); + vm.deal(address(otherCaller), AMOUNT); + + vm.expectRevert(RFQVaultExecutor.CallerNotOpenRouter.selector); + otherCaller.sendNativeFromBalance(address(vault), QUOTE_ID, AMOUNT); + } + + function test_fulfil_erc20() public { + token.mint(address(vault), AMOUNT); + + bytes memory signature = _signFulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER); + + vm.expectEmit(true, false, false, true, address(vault)); + emit RFQVaultExecutor.Fulfilled(QUOTE_ID, address(token), AMOUNT, RECEIVER); + + vault.fulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); + + assertEq(token.balanceOf(RECEIVER), AMOUNT); + assertEq(vault.quoteIdUsed(QUOTE_ID), 1); + } + + function test_fulfil_native() public { + vm.deal(address(vault), AMOUNT); + + bytes memory signature = _signFulfil(QUOTE_ID, NONCE, NATIVE_TOKEN, AMOUNT, RECEIVER); + + vault.fulfil(QUOTE_ID, NONCE, NATIVE_TOKEN, AMOUNT, RECEIVER, signature); + + assertEq(RECEIVER.balance, AMOUNT); + } + + function test_fulfil_marksQuoteId() public { + token.mint(address(vault), AMOUNT * 2); + + bytes memory signature = _signFulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER); + vault.fulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); + + vm.expectRevert(RFQVaultExecutor.InvalidQuoteId.selector); + vault.fulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); + } + + function test_fulfil_revertsIfQuoteIdUsedByRefund() public { + token.mint(address(vault), AMOUNT * 2); + + bytes memory refundSig = _signRefund(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER); + vault.refund(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, refundSig); + + bytes memory fulfilSig = _signFulfil(QUOTE_ID, NONCE + 1, address(token), AMOUNT, RECEIVER); + + vm.expectRevert(RFQVaultExecutor.InvalidQuoteId.selector); + vault.fulfil(QUOTE_ID, NONCE + 1, address(token), AMOUNT, RECEIVER, fulfilSig); + } + + function test_fulfil_revertsIfInvalidSigner() public { + token.mint(address(vault), AMOUNT); + + bytes memory signature = _signFulfilWithKey( + 0xBEEF, + QUOTE_ID, + NONCE, + address(token), + AMOUNT, + RECEIVER + ); + + vm.expectRevert(RFQVaultExecutor.InvalidSigner.selector); + vault.fulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); + } + + function test_swapAndFulfil_erc20() public { + token.mint(address(vault), AMOUNT); + outputToken.mint(address(swapTarget), SWAP_OUTPUT); + + RFQVaultExecutor.Action memory swapAction = RFQVaultExecutor.Action({ + target: address(swapTarget), + value: 0, + data: abi.encodeCall( + MockSwap.swapToVault, + (address(token), address(outputToken), AMOUNT, SWAP_OUTPUT, address(vault)) + ) + }); + + bytes memory signature = _signSwapAndFulfil( + QUOTE_ID, + NONCE, + address(token), + address(swapTarget), + AMOUNT, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER + ); + + vault.swapAndFulfil( + QUOTE_ID, + NONCE, + address(token), + address(swapTarget), + AMOUNT, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER, + signature + ); + + assertEq(outputToken.balanceOf(RECEIVER), SWAP_OUTPUT); + assertEq(vault.quoteIdUsed(QUOTE_ID), 1); + } + + function test_swapAndFulfil_revertsIfSwapOutputInsufficient() public { + token.mint(address(vault), AMOUNT); + outputToken.mint(address(swapTarget), SWAP_OUTPUT - 1 ether); + + RFQVaultExecutor.Action memory swapAction = RFQVaultExecutor.Action({ + target: address(swapTarget), + value: 0, + data: abi.encodeCall( + MockSwap.swapToVault, + (address(token), address(outputToken), AMOUNT, SWAP_OUTPUT - 1 ether, address(vault)) + ) + }); + + bytes memory signature = _signSwapAndFulfil( + QUOTE_ID, + NONCE, + address(token), + address(swapTarget), + AMOUNT, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER + ); + + vm.expectRevert(RFQVaultExecutor.SwapOutputInsufficient.selector); + vault.swapAndFulfil( + QUOTE_ID, + NONCE, + address(token), + address(swapTarget), + AMOUNT, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER, + signature + ); + } + + function test_swapAndFulfil_marksQuoteId() public { + token.mint(address(vault), AMOUNT); + outputToken.mint(address(swapTarget), SWAP_OUTPUT); + + RFQVaultExecutor.Action memory swapAction = RFQVaultExecutor.Action({ + target: address(swapTarget), + value: 0, + data: abi.encodeCall( + MockSwap.swapToVault, + (address(token), address(outputToken), AMOUNT, SWAP_OUTPUT, address(vault)) + ) + }); + + bytes memory signature = _signSwapAndFulfil( + QUOTE_ID, + NONCE, + address(token), + address(swapTarget), + AMOUNT, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER + ); + + vault.swapAndFulfil( + QUOTE_ID, + NONCE, + address(token), + address(swapTarget), + AMOUNT, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER, + signature + ); + + vm.expectRevert(RFQVaultExecutor.InvalidQuoteId.selector); + vault.swapAndFulfil( + QUOTE_ID, + NONCE, + address(token), + address(swapTarget), + AMOUNT, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER, + signature + ); + } + + function test_swapAndFulfil_revertsIfInvalidSigner() public { + token.mint(address(vault), AMOUNT); + outputToken.mint(address(swapTarget), SWAP_OUTPUT); + + RFQVaultExecutor.Action memory swapAction = RFQVaultExecutor.Action({ + target: address(swapTarget), + value: 0, + data: abi.encodeCall( + MockSwap.swapToVault, + (address(token), address(outputToken), AMOUNT, SWAP_OUTPUT, address(vault)) + ) + }); + + bytes memory signature = _signSwapAndFulfilWithKey( + 0xBEEF, + QUOTE_ID, + NONCE, + address(token), + address(swapTarget), + AMOUNT, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER + ); + + vm.expectRevert(RFQVaultExecutor.InvalidSigner.selector); + vault.swapAndFulfil( + QUOTE_ID, + NONCE, + address(token), + address(swapTarget), + AMOUNT, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER, + signature + ); + } + + function test_swapAndFulfil_skipsApprovalWhenTokenIsZero() public { + bytes32 quoteId = keccak256("quote-skip-approval"); + uint256 approveNonce = 99; + + token.mint(address(vault), AMOUNT); + outputToken.mint(address(swapTarget), SWAP_OUTPUT); + + RFQVaultExecutor.Action[] memory approveActions = new RFQVaultExecutor.Action[](1); + approveActions[0] = RFQVaultExecutor.Action({ + target: address(token), + value: 0, + data: abi.encodeWithSelector(0x095ea7b3, address(swapTarget), AMOUNT) + }); + + bytes memory approveSig = _signPerformActions(approveNonce, approveActions); + vault.performActions(approveNonce, approveActions, approveSig); + + RFQVaultExecutor.Action memory swapAction = RFQVaultExecutor.Action({ + target: address(swapTarget), + value: 0, + data: abi.encodeCall( + MockSwap.swapToVault, + (address(token), address(outputToken), AMOUNT, SWAP_OUTPUT, address(vault)) + ) + }); + + bytes memory signature = _signSwapAndFulfil( + quoteId, + NONCE, + address(0), + address(0), + 0, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER + ); + + vault.swapAndFulfil( + quoteId, + NONCE, + address(0), + address(0), + 0, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER, + signature + ); + + assertEq(outputToken.balanceOf(RECEIVER), SWAP_OUTPUT); + } + + function test_refund_erc20() public { + token.mint(address(vault), AMOUNT); + + bytes memory signature = _signRefund(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER); + + vm.expectEmit(true, false, false, true, address(vault)); + emit RFQVaultExecutor.Refunded(QUOTE_ID, address(token), AMOUNT, RECEIVER); + + vault.refund(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); + + assertEq(token.balanceOf(RECEIVER), AMOUNT); + } + + function test_refund_native() public { + vm.deal(address(vault), AMOUNT); + + bytes memory signature = _signRefund(QUOTE_ID, NONCE, NATIVE_TOKEN, AMOUNT, RECEIVER); + + vault.refund(QUOTE_ID, NONCE, NATIVE_TOKEN, AMOUNT, RECEIVER, signature); + + assertEq(RECEIVER.balance, AMOUNT); + } + + function test_refund_marksQuoteId() public { + token.mint(address(vault), AMOUNT * 2); + + bytes memory signature = _signRefund(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER); + vault.refund(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); + + vm.expectRevert(RFQVaultExecutor.InvalidQuoteId.selector); + vault.refund(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); + } + + function test_refund_revertsIfQuoteIdUsedByFulfil() public { + token.mint(address(vault), AMOUNT * 2); + + bytes memory fulfilSig = _signFulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER); + vault.fulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, fulfilSig); + + bytes memory refundSig = _signRefund(QUOTE_ID, NONCE + 1, address(token), AMOUNT, RECEIVER); + + vm.expectRevert(RFQVaultExecutor.InvalidQuoteId.selector); + vault.refund(QUOTE_ID, NONCE + 1, address(token), AMOUNT, RECEIVER, refundSig); + } + + function test_refund_revertsIfInvalidSigner() public { + token.mint(address(vault), AMOUNT); + + bytes memory signature = _signRefundWithKey(0xBEEF, QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER); + + vm.expectRevert(RFQVaultExecutor.InvalidSigner.selector); + vault.refund(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); + } + + function test_performActions_executesAction() public { + RFQVaultExecutor.Action[] memory actions = new RFQVaultExecutor.Action[](1); + actions[0] = RFQVaultExecutor.Action({ + target: address(actionTarget), + value: 0, + data: abi.encodeCall(MockActionTarget.setValue, (42)) + }); + + bytes memory signature = _signPerformActions(NONCE, actions); + + vault.performActions(NONCE, actions, signature); + + assertEq(actionTarget.value(), 42); + assertEq(vault.nonceUsed(NONCE), 1); + } + + function test_performActions_marksNonce() public { + RFQVaultExecutor.Action[] memory actions = new RFQVaultExecutor.Action[](1); + actions[0] = RFQVaultExecutor.Action({ + target: address(actionTarget), + value: 0, + data: abi.encodeCall(MockActionTarget.setValue, (42)) + }); + + bytes memory signature = _signPerformActions(NONCE, actions); + + vault.performActions(NONCE, actions, signature); + + vm.expectRevert(RFQVaultExecutor.InvalidNonce.selector); + vault.performActions(NONCE, actions, signature); + } + + function test_performActions_revertsIfActionFails() public { + RFQVaultExecutor.Action[] memory actions = new RFQVaultExecutor.Action[](1); + actions[0] = RFQVaultExecutor.Action({ + target: address(actionTarget), + value: 0, + data: abi.encodeCall(MockActionTarget.revertAlways, ()) + }); + + bytes memory signature = _signPerformActions(NONCE, actions); + + vm.expectRevert(abi.encodeWithSelector(RFQVaultExecutor.ActionFailed.selector, uint256(0))); + vault.performActions(NONCE, actions, signature); + } + + function test_performActions_revertsIfInvalidSigner() public { + RFQVaultExecutor.Action[] memory actions = new RFQVaultExecutor.Action[](1); + actions[0] = RFQVaultExecutor.Action({ + target: address(actionTarget), + value: 0, + data: abi.encodeCall(MockActionTarget.setValue, (42)) + }); + + bytes memory signature = _signPerformActionsWithKey(0xBEEF, NONCE, actions); + + vm.expectRevert(RFQVaultExecutor.InvalidSigner.selector); + vault.performActions(NONCE, actions, signature); + } + + function test_setSolverSigner_updatesAndOnlyOwner() public { + address newSigner = address(0x1234); + + vm.prank(OTHER); + vm.expectRevert(); + vault.setSolverSigner(newSigner); + + vm.prank(OWNER); + vault.setSolverSigner(newSigner); + + token.mint(address(vault), AMOUNT); + bytes memory oldSig = _signFulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER); + + vm.expectRevert(RFQVaultExecutor.InvalidSigner.selector); + vault.fulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, oldSig); + } + + function test_rescueFunds_onlyOwner() public { + token.mint(address(vault), AMOUNT); + + vm.prank(OTHER); + vm.expectRevert(); + vault.rescueFunds(address(token), OWNER, AMOUNT); + + vm.prank(OWNER); + vault.rescueFunds(address(token), OWNER, AMOUNT); + + assertEq(token.balanceOf(OWNER), AMOUNT); + } + + function _signFulfil( + bytes32 quoteId, + uint256 nonce, + address token_, + uint256 amount, + address receiver + ) internal view returns (bytes memory) { + return _signFulfilWithKey(SOLVER_PRIVATE_KEY, quoteId, nonce, token_, amount, receiver); + } + + function _signFulfilWithKey( + uint256 privateKey, + bytes32 quoteId, + uint256 nonce, + address token_, + uint256 amount, + address receiver + ) internal view returns (bytes memory) { + bytes32 messageHash = _hashFulfilOrRefund(FULFIL_DISCRIMINATOR, quoteId, nonce, token_, amount, receiver); + return _signMessage(privateKey, messageHash); + } + + function _signRefund( + bytes32 quoteId, + uint256 nonce, + address token_, + uint256 amount, + address receiver + ) internal view returns (bytes memory) { + return _signRefundWithKey(SOLVER_PRIVATE_KEY, quoteId, nonce, token_, amount, receiver); + } + + function _signRefundWithKey( + uint256 privateKey, + bytes32 quoteId, + uint256 nonce, + address token_, + uint256 amount, + address receiver + ) internal view returns (bytes memory) { + bytes32 messageHash = _hashFulfilOrRefund(REFUND_DISCRIMINATOR, quoteId, nonce, token_, amount, receiver); + return _signMessage(privateKey, messageHash); + } + + function _signSwapAndFulfil( + bytes32 quoteId, + uint256 nonce, + address approvalToken, + address approvalSpender, + uint256 approvalAmount, + address outputToken_, + uint256 minOutput, + RFQVaultExecutor.Action memory swapAction, + address receiver + ) internal view returns (bytes memory) { + return _signSwapAndFulfilWithKey( + SOLVER_PRIVATE_KEY, + quoteId, + nonce, + approvalToken, + approvalSpender, + approvalAmount, + outputToken_, + minOutput, + swapAction, + receiver + ); + } + + function _signSwapAndFulfilWithKey( + uint256 privateKey, + bytes32 quoteId, + uint256 nonce, + address approvalToken, + address approvalSpender, + uint256 approvalAmount, + address outputToken_, + uint256 minOutput, + RFQVaultExecutor.Action memory swapAction, + address receiver + ) internal view returns (bytes memory) { + bytes32 messageHash = _hashSwapAndFulfil( + quoteId, + nonce, + approvalToken, + approvalSpender, + approvalAmount, + outputToken_, + minOutput, + swapAction, + receiver + ); + return _signMessage(privateKey, messageHash); + } + + function _signPerformActions(uint256 nonce, RFQVaultExecutor.Action[] memory actions) + internal + view + returns (bytes memory) + { + return _signPerformActionsWithKey(SOLVER_PRIVATE_KEY, nonce, actions); + } + + function _signPerformActionsWithKey( + uint256 privateKey, + uint256 nonce, + RFQVaultExecutor.Action[] memory actions + ) internal view returns (bytes memory) { + bytes32 messageHash = keccak256(abi.encode(block.chainid, address(vault), nonce, actions)); + return _signMessage(privateKey, messageHash); + } + + function _signMessage(uint256 privateKey, bytes32 messageHash) internal pure returns (bytes memory) { + bytes32 ethSigned = AuthenticationLib.getEthSignedMessageHash(messageHash); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, ethSigned); + return abi.encodePacked(r, s, v); + } + + function _hashFulfilOrRefund( + uint256 discriminator, + bytes32 quoteId, + uint256 nonce, + address token_, + uint256 amount, + address receiver + ) internal view returns (bytes32 hash) { + address vaultAddress = address(vault); + assembly { + let ptr := mload(0x40) + mstore(ptr, chainid()) + mstore(add(ptr, 0x20), vaultAddress) + mstore(add(ptr, 0x40), discriminator) + mstore(add(ptr, 0x60), quoteId) + mstore(add(ptr, 0x80), nonce) + mstore(add(ptr, 0xa0), token_) + mstore(add(ptr, 0xc0), amount) + mstore(add(ptr, 0xe0), receiver) + hash := keccak256(ptr, 0x100) + mstore(0x40, add(ptr, 0x100)) + } + } + + function _hashSwapAndFulfil( + bytes32 quoteId, + uint256 nonce, + address approvalToken, + address approvalSpender, + uint256 approvalAmount, + address outputToken_, + uint256 minOutput, + RFQVaultExecutor.Action memory swapAction, + address receiver + ) internal view returns (bytes32 hash) { + bytes32 dataHash = keccak256(swapAction.data); + address vaultAddress = address(vault); + + assembly { + let ptr := mload(0x40) + mstore(ptr, chainid()) + mstore(add(ptr, 0x20), vaultAddress) + mstore(add(ptr, 0x40), SWAP_AND_FULFIL_DISCRIMINATOR) + mstore(add(ptr, 0x60), quoteId) + mstore(add(ptr, 0x80), nonce) + mstore(add(ptr, 0xa0), approvalToken) + mstore(add(ptr, 0xc0), approvalSpender) + mstore(add(ptr, 0xe0), approvalAmount) + mstore(add(ptr, 0x100), outputToken_) + mstore(add(ptr, 0x120), minOutput) + mstore(add(ptr, 0x140), mload(swapAction)) + mstore(add(ptr, 0x160), mload(add(swapAction, 0x20))) + mstore(add(ptr, 0x180), dataHash) + mstore(add(ptr, 0x1a0), receiver) + hash := keccak256(ptr, 0x1c0) + mstore(0x40, add(ptr, 0x1c0)) + } + } +} + +contract MockERC20 is ERC20 { + string private _name; + string private _symbol; + + constructor(string memory name_, string memory symbol_) { + _name = name_; + _symbol = symbol_; + } + + function name() public view override returns (string memory) { + return _name; + } + + function symbol() public view override returns (string memory) { + return _symbol; + } + + function mint(address to, uint256 amount) external { + _mint(to, amount); + } +} + +contract MockSwap { + function swapToVault( + address inputToken, + address outputToken, + uint256 inputAmount, + uint256 outputAmount, + address vault + ) external { + ERC20(inputToken).transferFrom(msg.sender, address(this), inputAmount); + ERC20(outputToken).transfer(vault, outputAmount); + } +} + +contract MockActionTarget { + uint256 public value; + + function setValue(uint256 newValue) external { + value = newValue; + } + + function revertAlways() external pure { + revert("fail"); + } +} + +contract OpenRouterStub { + function sendNativeFromBalance(address vault, bytes32 quoteId, uint256 amount) external { + RFQVaultExecutor(payable(vault)).receiveNative{value: amount}(quoteId); + } +} + +contract CallerStub { + function sendNativeFromBalance(address vault, bytes32 quoteId, uint256 amount) external { + RFQVaultExecutor(payable(vault)).receiveNative{value: amount}(quoteId); + } +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..7ffd61c --- /dev/null +++ b/yarn.lock @@ -0,0 +1,2139 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@adraffy/ens-normalize@1.10.1": + version "1.10.1" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== + +"@arbitrum/sdk@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@arbitrum/sdk/-/sdk-4.0.5.tgz#c7abf6fcec72b36faee7af704245a7e14c49ad7f" + integrity sha512-bADi4kVzSBUAV+GkxuKMx7zrkCVahIE4+fkBi0Ee18EPqGt1Wiub+yQCGTh+llApn1RpRtwwtYeZXhz9XelqGQ== + dependencies: + "@ethersproject/address" "^5.0.8" + "@ethersproject/bignumber" "^5.1.1" + "@ethersproject/bytes" "^5.0.8" + async-mutex "^0.4.0" + ethers "^5.1.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@ethereumjs/rlp@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.2.tgz#c89bd82f2f3bec248ab2d517ae25f5bbc4aac842" + integrity sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA== + +"@ethereumjs/util@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" + integrity sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog== + dependencies: + "@ethereumjs/rlp" "^5.0.2" + ethereum-cryptography "^2.2.1" + +"@ethersproject/abi@5.8.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" + integrity sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/abstract-provider@5.8.0", "@ethersproject/abstract-provider@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" + integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/networks" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/web" "^5.8.0" + +"@ethersproject/abstract-signer@5.8.0", "@ethersproject/abstract-signer@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" + integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + +"@ethersproject/address@5.8.0", "@ethersproject/address@^5.0.8", "@ethersproject/address@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" + integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + +"@ethersproject/base64@5.8.0", "@ethersproject/base64@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" + integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== + dependencies: + "@ethersproject/bytes" "^5.8.0" + +"@ethersproject/basex@5.8.0", "@ethersproject/basex@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.8.0.tgz#1d279a90c4be84d1c1139114a1f844869e57d03a" + integrity sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + +"@ethersproject/bignumber@5.8.0", "@ethersproject/bignumber@^5.1.1", "@ethersproject/bignumber@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" + integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.8.0", "@ethersproject/bytes@^5.0.8", "@ethersproject/bytes@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" + integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/constants@5.8.0", "@ethersproject/constants@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" + integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + +"@ethersproject/contracts@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.8.0.tgz#243a38a2e4aa3e757215ea64e276f8a8c9d8ed73" + integrity sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ== + dependencies: + "@ethersproject/abi" "^5.8.0" + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + +"@ethersproject/hash@5.8.0", "@ethersproject/hash@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" + integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/hdnode@5.8.0", "@ethersproject/hdnode@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.8.0.tgz#a51ae2a50bcd48ef6fd108c64cbae5e6ff34a761" + integrity sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/basex" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/pbkdf2" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/wordlists" "^5.8.0" + +"@ethersproject/json-wallets@5.8.0", "@ethersproject/json-wallets@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz#d18de0a4cf0f185f232eb3c17d5e0744d97eb8c9" + integrity sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w== + dependencies: + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hdnode" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/pbkdf2" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.8.0", "@ethersproject/keccak256@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" + integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== + dependencies: + "@ethersproject/bytes" "^5.8.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.8.0", "@ethersproject/logger@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" + integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== + +"@ethersproject/networks@5.8.0", "@ethersproject/networks@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" + integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/pbkdf2@5.8.0", "@ethersproject/pbkdf2@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz#cd2621130e5dd51f6a0172e63a6e4a0c0a0ec37e" + integrity sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + +"@ethersproject/properties@5.8.0", "@ethersproject/properties@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" + integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== + dependencies: + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/providers@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.8.0.tgz#6c2ae354f7f96ee150439f7de06236928bc04cb4" + integrity sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/base64" "^5.8.0" + "@ethersproject/basex" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/networks" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/web" "^5.8.0" + bech32 "1.1.4" + ws "8.18.0" + +"@ethersproject/random@5.8.0", "@ethersproject/random@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.8.0.tgz#1bced04d49449f37c6437c701735a1a022f0057a" + integrity sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/rlp@5.8.0", "@ethersproject/rlp@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" + integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/sha2@5.8.0", "@ethersproject/sha2@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.8.0.tgz#8954a613bb78dac9b46829c0a95de561ef74e5e1" + integrity sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.8.0", "@ethersproject/signing-key@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" + integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + bn.js "^5.2.1" + elliptic "6.6.1" + hash.js "1.1.7" + +"@ethersproject/solidity@5.8.0", "@ethersproject/solidity@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.8.0.tgz#429bb9fcf5521307a9448d7358c26b93695379b9" + integrity sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/sha2" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/strings@5.8.0", "@ethersproject/strings@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" + integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/transactions@5.8.0", "@ethersproject/transactions@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" + integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== + dependencies: + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/rlp" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + +"@ethersproject/units@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.8.0.tgz#c12f34ba7c3a2de0e9fa0ed0ee32f3e46c5c2c6a" + integrity sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ== + dependencies: + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/constants" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + +"@ethersproject/wallet@5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.8.0.tgz#49c300d10872e6986d953e8310dc33d440da8127" + integrity sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA== + dependencies: + "@ethersproject/abstract-provider" "^5.8.0" + "@ethersproject/abstract-signer" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/hdnode" "^5.8.0" + "@ethersproject/json-wallets" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/random" "^5.8.0" + "@ethersproject/signing-key" "^5.8.0" + "@ethersproject/transactions" "^5.8.0" + "@ethersproject/wordlists" "^5.8.0" + +"@ethersproject/web@5.8.0", "@ethersproject/web@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" + integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== + dependencies: + "@ethersproject/base64" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@ethersproject/wordlists@5.8.0", "@ethersproject/wordlists@^5.8.0": + version "5.8.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.8.0.tgz#7a5654ee8d1bb1f4dbe43f91d217356d650ad821" + integrity sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg== + dependencies: + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/hash" "^5.8.0" + "@ethersproject/logger" "^5.8.0" + "@ethersproject/properties" "^5.8.0" + "@ethersproject/strings" "^5.8.0" + +"@fastify/busboy@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@layerzerolabs/lz-v2-utilities@^3.0.168": + version "3.0.168" + resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-v2-utilities/-/lz-v2-utilities-3.0.168.tgz#a7b62a1422f978151ca0f3fc77e3ab511f9e6eb3" + integrity sha512-5gb5QH3q+JIOkwuJnmv3hWidwLE7ySC0G4IYCL9pwl80bkdkuY9TwfG3KqWri2F5mCzRYs6xx7vaYP5zFqY7yA== + dependencies: + "@ethersproject/abi" "^5.8.0" + "@ethersproject/address" "^5.8.0" + "@ethersproject/bignumber" "^5.8.0" + "@ethersproject/bytes" "^5.8.0" + "@ethersproject/keccak256" "^5.8.0" + "@ethersproject/solidity" "^5.8.0" + bs58 "^5.0.0" + tiny-invariant "^1.3.1" + +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/curves@1.4.2", "@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/curves@~1.8.1": + version "1.8.2" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.2.tgz#8f24c037795e22b90ae29e222a856294c1d9ffc7" + integrity sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g== + dependencies: + "@noble/hashes" "1.7.2" + +"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + +"@noble/hashes@1.7.2", "@noble/hashes@~1.7.1": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.2.tgz#d53c65a21658fb02f3303e7ee3ba89d6754c64b4" + integrity sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ== + +"@noble/secp256k1@1.7.1": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== + +"@noble/secp256k1@~1.7.0": + version "1.7.2" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.2.tgz#c2c3343e2dce80e15a914d7442147507f8a98e7f" + integrity sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ== + +"@nomicfoundation/edr-darwin-arm64@0.12.0-next.23": + version "0.12.0-next.23" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.23.tgz#b1587edd46476d271b3dd54c024054a964fa9f66" + integrity sha512-Amh7mRoDzZyJJ4efqoePqdoZOzharmSOttZuJDlVE5yy07BoE8hL6ZRpa5fNYn0LCqn/KoWs8OHANWxhKDGhvQ== + +"@nomicfoundation/edr-darwin-x64@0.12.0-next.23": + version "0.12.0-next.23" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.23.tgz#6b61903e93eb40716ea3ed7c4f24f793e6566591" + integrity sha512-9wn489FIQm7m0UCD+HhktjWx6vskZzeZD9oDc2k9ZvbBzdXwPp5tiDqUBJ+eQpByAzCDfteAJwRn2lQCE0U+Iw== + +"@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.23": + version "0.12.0-next.23" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.23.tgz#0c141a621c9dbe6b0dc414da5913b1f94833676e" + integrity sha512-nlk5EejSzEUfEngv0Jkhqq3/wINIfF2ED9wAofc22w/V1DV99ASh9l3/e/MIHOQFecIZ9MDqt0Em9/oDyB1Uew== + +"@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.23": + version "0.12.0-next.23" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.23.tgz#bd996171aa0f90eb722984436449fd2ddb4de065" + integrity sha512-SJuPBp3Rc6vM92UtVTUxZQ/QlLhLfwTftt2XUiYohmGKB3RjGzpgduEFMCA0LEnucUckU6UHrJNFHiDm77C4PQ== + +"@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.23": + version "0.12.0-next.23" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.23.tgz#fb411c5b5efeb96d0d859bb34ff0f466201c3f5d" + integrity sha512-NU+Qs3u7Qt6t3bJFdmmjd5CsvgI2bPPzO31KifM2Ez96/jsXYho5debtTQnimlb5NAqiHTSlxjh/F8ROcptmeQ== + +"@nomicfoundation/edr-linux-x64-musl@0.12.0-next.23": + version "0.12.0-next.23" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.23.tgz#18685a6489167d1386db8d31823ce7d92fd789b5" + integrity sha512-F78fZA2h6/ssiCSZOovlgIu0dUeI7ItKPsDDF3UUlIibef052GCXmliMinC90jVPbrjUADMd1BUwjfI0Z8OllQ== + +"@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.23": + version "0.12.0-next.23" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.23.tgz#20cc6fcdb22500df1e48fab0a397bc30a22ec37f" + integrity sha512-IfJZQJn7d/YyqhmguBIGoCKjE9dKjbu6V6iNEPApfwf5JyyjHYyyfkLU4rf7hygj57bfH4sl1jtQ6r8HnT62lw== + +"@nomicfoundation/edr@0.12.0-next.23": + version "0.12.0-next.23" + resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.12.0-next.23.tgz#483b29bed5165bf6f97b9be01f1536d0f1e1845a" + integrity sha512-F2/6HZh8Q9RsgkOIkRrckldbhPjIZY7d4mT9LYuW68miwGQ5l7CkAgcz9fRRiurA0+YJhtsbx/EyrD9DmX9BOw== + dependencies: + "@nomicfoundation/edr-darwin-arm64" "0.12.0-next.23" + "@nomicfoundation/edr-darwin-x64" "0.12.0-next.23" + "@nomicfoundation/edr-linux-arm64-gnu" "0.12.0-next.23" + "@nomicfoundation/edr-linux-arm64-musl" "0.12.0-next.23" + "@nomicfoundation/edr-linux-x64-gnu" "0.12.0-next.23" + "@nomicfoundation/edr-linux-x64-musl" "0.12.0-next.23" + "@nomicfoundation/edr-win32-x64-msvc" "0.12.0-next.23" + +"@nomicfoundation/hardhat-foundry@^1.1.2": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-foundry/-/hardhat-foundry-1.2.1.tgz#2d0b8bd8d2815a4217d05381520520a6b74c2d3c" + integrity sha512-pH1KeyI0sysgi7I7uQKPLXWl895EkuS6V41rSi820Ipqp/FScIwDh27RbevgC9zJ4ufSsSz34njm9cvRMGMNVA== + dependencies: + picocolors "^1.1.0" + +"@nomicfoundation/hardhat-toolbox@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-5.0.0.tgz#165b47f8a3d2bf668cc5d453ce7f496a1156948d" + integrity sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ== + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" + integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" + integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" + integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" + integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" + integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" + integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" + integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" + integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.2" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" + +"@scure/base@~1.1.0", "@scure/base@~1.1.6": + version "1.1.9" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + +"@scure/base@~1.2.5": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6" + integrity sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg== + +"@scure/bip32@1.1.5": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== + dependencies: + "@noble/hashes" "~1.2.0" + "@noble/secp256k1" "~1.7.0" + "@scure/base" "~1.1.0" + +"@scure/bip32@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== + dependencies: + "@noble/curves" "~1.4.0" + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@scure/bip39@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== + dependencies: + "@noble/hashes" "~1.2.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== + dependencies: + "@noble/hashes" "~1.4.0" + "@scure/base" "~1.1.6" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@tsconfig/node10@^1.0.7": + version "1.0.12" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4" + integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/node@22.7.5": + version "22.7.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== + dependencies: + undici-types "~6.19.2" + +acorn-walk@^8.1.1: + version "8.3.5" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" + integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1: + version "8.16.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== + +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + +ansi-colors@^4.1.1, ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +async-mutex@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c" + integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== + dependencies: + tslib "^2.4.0" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.16.0: + version "1.16.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.16.1.tgz#517e29291d19d6e8cf919ff264f4fe157261ba12" + integrity sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A== + dependencies: + follow-redirects "^1.16.0" + form-data "^4.0.5" + https-proxy-agent "^5.0.1" + proxy-from-env "^2.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.1.tgz#817fb7b57143c501f649805cb247617ad016a885" + integrity sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw== + +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bn.js@^4.11.9: + version "4.12.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.3.tgz#2cc2c679188eb35b006f2d0d4710bed8437a769e" + integrity sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g== + +bn.js@^5.2.1: + version "5.2.3" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.3.tgz#16a9e409616b23fef3ccbedb8d42f13bff80295e" + integrity sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w== + +boxen@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== + dependencies: + ansi-align "^3.0.0" + camelcase "^6.2.0" + chalk "^4.1.0" + cli-boxes "^2.2.1" + string-width "^4.2.2" + type-fest "^0.20.2" + widest-line "^3.1.0" + wrap-ansi "^7.0.0" + +brace-expansion@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.0.tgz#4f41a41190216ee36067ec381526fe9539c4f0ae" + integrity sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w== + dependencies: + balanced-match "^1.0.0" + +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +bytes@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +camelcase@^6.0.0, camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chokidar@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-boxes@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@^8.1.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +cookie@^0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +debug@4, debug@^4.1.1, debug@^4.3.5: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +diff@^4.0.1: + version "4.0.4" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.4.tgz#7a6dbfda325f25f07517e9b518f897c08332e07d" + integrity sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ== + +diff@^5.2.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.2.tgz#0a4742797281d09cfa699b79ea32d27723623bad" + integrity sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A== + +dotenv@^16.0.0: + version "16.6.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" + integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== + +dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +elliptic@6.6.1: + version "6.6.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +enquirer@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== + dependencies: + ansi-colors "^4.1.1" + strip-ansi "^6.0.1" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== + dependencies: + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" + +escalade@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +ethereum-cryptography@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== + dependencies: + "@noble/hashes" "1.2.0" + "@noble/secp256k1" "1.7.1" + "@scure/bip32" "1.1.5" + "@scure/bip39" "1.1.1" + +ethereum-cryptography@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== + dependencies: + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + +ethers@^5.1.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.8.0.tgz#97858dc4d4c74afce83ea7562fe9493cedb4d377" + integrity sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg== + dependencies: + "@ethersproject/abi" "5.8.0" + "@ethersproject/abstract-provider" "5.8.0" + "@ethersproject/abstract-signer" "5.8.0" + "@ethersproject/address" "5.8.0" + "@ethersproject/base64" "5.8.0" + "@ethersproject/basex" "5.8.0" + "@ethersproject/bignumber" "5.8.0" + "@ethersproject/bytes" "5.8.0" + "@ethersproject/constants" "5.8.0" + "@ethersproject/contracts" "5.8.0" + "@ethersproject/hash" "5.8.0" + "@ethersproject/hdnode" "5.8.0" + "@ethersproject/json-wallets" "5.8.0" + "@ethersproject/keccak256" "5.8.0" + "@ethersproject/logger" "5.8.0" + "@ethersproject/networks" "5.8.0" + "@ethersproject/pbkdf2" "5.8.0" + "@ethersproject/properties" "5.8.0" + "@ethersproject/providers" "5.8.0" + "@ethersproject/random" "5.8.0" + "@ethersproject/rlp" "5.8.0" + "@ethersproject/sha2" "5.8.0" + "@ethersproject/signing-key" "5.8.0" + "@ethersproject/solidity" "5.8.0" + "@ethersproject/strings" "5.8.0" + "@ethersproject/transactions" "5.8.0" + "@ethersproject/units" "5.8.0" + "@ethersproject/wallet" "5.8.0" + "@ethersproject/web" "5.8.0" + "@ethersproject/wordlists" "5.8.0" + +ethers@^6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.16.0.tgz#fff9b4f05d7a359c774ad6e91085a800f7fccf65" + integrity sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "22.7.5" + aes-js "4.0.0-beta.5" + tslib "2.7.0" + ws "8.17.1" + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +follow-redirects@^1.12.1, follow-redirects@^1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== + +form-data@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.2.6: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== + dependencies: + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +graceful-fs@^4.1.2, graceful-fs@^4.1.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +hardhat@^2.22.7: + version "2.28.6" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.28.6.tgz#1346f90796492097ee6a802e762a2f4883817db6" + integrity sha512-zQze7qe+8ltwHvhX5NQ8sN1N37WWZGw8L63y+2XcPxGwAjc/SMF829z3NS6o1krX0sryhAsVBK/xrwUqlsot4Q== + dependencies: + "@ethereumjs/util" "^9.1.0" + "@ethersproject/abi" "^5.1.2" + "@nomicfoundation/edr" "0.12.0-next.23" + "@nomicfoundation/solidity-analyzer" "^0.1.0" + "@sentry/node" "^5.18.1" + adm-zip "^0.4.16" + aggregate-error "^3.0.0" + ansi-escapes "^4.3.0" + boxen "^5.1.2" + chokidar "^4.0.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + ethereum-cryptography "^1.0.3" + find-up "^5.0.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + json-stream-stringify "^3.1.4" + keccak "^3.0.2" + lodash "^4.17.11" + micro-eth-signer "^0.14.0" + mnemonist "^0.38.0" + mocha "^10.0.0" + p-map "^4.0.0" + picocolors "^1.1.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + solc "0.8.26" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + tinyglobby "^0.2.6" + tsort "0.0.1" + undici "^5.14.0" + uuid "^8.3.2" + ws "^7.4.6" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasown@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.3.tgz#5e5c2b15b60370a4c7930c383dfb76bf17bc403c" + integrity sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg== + dependencies: + function-bind "^1.1.2" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== + dependencies: + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" + +https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@~0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +immutable@^4.0.0-rc.12: + version "4.3.8" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.8.tgz#02d183c7727fb2bb1d5d0380da0d779dce9296a7" + integrity sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-yaml@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== + dependencies: + argparse "^2.0.1" + +json-stream-stringify@^3.1.4: + version "3.1.6" + resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +keccak@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash@^4.17.11: + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== + +micro-eth-signer@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz#8aa1fe997d98d6bdf42f2071cef7eb01a66ecb22" + integrity sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw== + dependencies: + "@noble/curves" "~1.8.1" + "@noble/hashes" "~1.7.1" + micro-packed "~0.7.2" + +micro-packed@~0.7.2: + version "0.7.3" + resolved "https://registry.yarnpkg.com/micro-packed/-/micro-packed-0.7.3.tgz#59e96b139dffeda22705c7a041476f24cabb12b6" + integrity sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg== + dependencies: + "@scure/base" "~1.2.5" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.9.tgz#1293ef15db0098b394540e8f9f744f9fda8dee4b" + integrity sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw== + dependencies: + brace-expansion "^2.0.1" + +mnemonist@^0.38.0: + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== + dependencies: + obliterator "^2.0.0" + +mocha@^10.0.0: + version "10.8.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-gyp-build@^4.2.0: + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +obliterator@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.5.tgz#031e0145354b0c18840336ae51d41e7d6d2c76aa" + integrity sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== + +picomatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== + +proxy-from-env@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +raw-body@^2.4.1: + version "2.5.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" + integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== + dependencies: + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + unpipe "~1.0.0" + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +semver@^5.5.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.0: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +setprototypeof@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +solc@0.8.26: + version "0.8.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== + dependencies: + command-exists "^1.2.8" + commander "^8.1.0" + follow-redirects "^1.12.1" + js-sha3 "0.8.0" + memorystream "^0.3.1" + semver "^5.5.0" + tmp "0.0.33" + +source-map-support@^0.5.13: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +stacktrace-parser@^0.1.10: + version "0.1.11" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz#c7c08f9b29ef566b9a6f7b255d7db572f66fabc4" + integrity sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg== + dependencies: + type-fest "^0.7.1" + +statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +tiny-invariant@^1.3.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== + +tinyglobby@^0.2.6: + version "0.2.16" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.16.tgz#1c3b7eb953fce42b226bc5a1ee06428281aff3d6" + integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + +tmp@0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +ts-node@^10.9.0: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== + +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.4.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typescript@^5.0.0: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + +undici@^5.14.0: + version "5.29.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.29.0.tgz#419595449ae3f2cdcba3580a2e8903399bd1f5a3" + integrity sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg== + dependencies: + "@fastify/busboy" "^2.0.0" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@8.17.1: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +ws@8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +ws@^7.4.6: + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@^20.2.2, yargs-parser@^20.2.9: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 7a9312256ee7812f49540cdd571ffc25abb1f965 Mon Sep 17 00:00:00 2001 From: reddyismav Date: Wed, 17 Jun 2026 20:55:16 +0400 Subject: [PATCH 02/11] feat: rfq vault executor --- .env.example | 2 +- package.json | 1 + scripts/deploy/create3.ts | 8 + scripts/deploy/deployRFQVaultExecutor.ts | 255 ++++++++++++++++++++ scripts/deploy/rfqVaultExecutorAddresses.ts | 77 ++++++ src/executors/RFQVaultExecutor.sol | 4 + 6 files changed, 346 insertions(+), 1 deletion(-) create mode 100644 scripts/deploy/deployRFQVaultExecutor.ts create mode 100644 scripts/deploy/rfqVaultExecutorAddresses.ts diff --git a/.env.example b/.env.example index 02a008a..635f541 100644 --- a/.env.example +++ b/.env.example @@ -6,7 +6,7 @@ PRIVATE_KEY= # Constructor arguments / deployment checks OWNER_ADDRESS= -SOLVER_SIGNER_ADDRESS= # BungeeReceiver deploy only; defaults to deployer +SOLVER_SIGNER_ADDRESS= # BungeeReceiver / RFQVaultExecutor deploy; defaults to deployer OPENROUTER_ADDRESS= # optional override for check:openrouter OPENROUTER_EVM_VERSION= # optional compile override: cancun or shanghai ACROSS_MANIPULATOR_ADDRESS= # optional override for check:across-manipulator diff --git a/package.json b/package.json index 0a35b01..cf58431 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "deploy:allowance-holder": "hardhat run scripts/deploy/deployAllowanceHolder.ts --network", "deploy:receiver-executor": "hardhat run scripts/deploy/deployReceiverAllChains.ts", "deploy:across-manipulator": "hardhat run scripts/deploy/deployAcrossERC20AmountManipulator.ts --network", + "deploy:rfq-vault-executor": "hardhat run scripts/deploy/deployRFQVaultExecutor.ts --network", "check:openrouter": "hardhat run scripts/deploy/checkOpenRouterDeployment.ts", "verify:openrouter": "ts-node scripts/deploy/verifyOpenRouterBatch.ts", "check:allowance-holder": "hardhat run scripts/deploy/checkAllowanceHolderDeployment.ts", diff --git a/scripts/deploy/create3.ts b/scripts/deploy/create3.ts index e58bca2..d3d5071 100644 --- a/scripts/deploy/create3.ts +++ b/scripts/deploy/create3.ts @@ -63,6 +63,14 @@ export const CELER_EXECUTOR_CREATE3_SALT = keccak256( toUtf8Bytes(CELER_EXECUTOR_CREATE3_SALT_TEXT), ); +/** CREATE3 salt label used by `deployRFQVaultExecutor.ts`. */ +export const RFQ_VAULT_EXECUTOR_CREATE3_SALT_TEXT = 'RFQVaultExecutor'; + +/** Keccak256 salt for deterministic RFQVaultExecutor CREATE3 deployments. */ +export const RFQ_VAULT_EXECUTOR_CREATE3_SALT = keccak256( + toUtf8Bytes(RFQ_VAULT_EXECUTOR_CREATE3_SALT_TEXT), +); + const ADDR_HEX_RE = /^0x[a-fA-F0-9]{40}$/; const CREATE3_PROXY_INIT_CODE_HASH = keccak256( '0x67363d3d37363d34f03d5260086018f3', diff --git a/scripts/deploy/deployRFQVaultExecutor.ts b/scripts/deploy/deployRFQVaultExecutor.ts new file mode 100644 index 0000000..14bec78 --- /dev/null +++ b/scripts/deploy/deployRFQVaultExecutor.ts @@ -0,0 +1,255 @@ +/** + * Deployment script for RFQVaultExecutor via CreateX CREATE3. + * + * Deploy on any network configured in hardhat.config.ts. + * + * Usage: + * npx hardhat run scripts/deploy/deployRFQVaultExecutor.ts --network + * + * Required env vars: + * DEPLOYER_PRIVATE_KEY — deployer wallet private key + * + * Optional env vars: + * OWNER_ADDRESS — RFQVaultExecutor owner; defaults to DEFAULT_OWNER_ADDRESS or deployer + * SOLVER_SIGNER_ADDRESS — solver signer for fulfil/refund signatures; defaults to deployer + */ + +import hre, { ethers } from 'hardhat'; +import { + CREATE_X_FACTORY, + Create3ABI, + OPEN_ROUTER_EXPECTED_ADDRESS, + RFQ_VAULT_EXECUTOR_CREATE3_SALT, + RFQ_VAULT_EXECUTOR_CREATE3_SALT_TEXT, + decodeCreate3DeploymentFromTxReceipt, + hasContractBytecode, +} from './create3'; +import { findDeploymentRegistryRow } from './deploymentRegistry'; +import { writeRFQVaultExecutorAddress } from './rfqVaultExecutorAddresses'; + +// ============================================================================= +// Deployment config — fill DEFAULT_OWNER_ADDRESS before mainnet deploy +// ============================================================================= + +/** RFQVaultExecutor owner (admin). Override via OWNER_ADDRESS env at runtime. */ +const DEFAULT_OWNER_ADDRESS = '0x0E1B5AB67aF1c99F8c7Ebc71f41f75D4D6211e53'; + +const ADDR_HEX_RE = /^0x[a-fA-F0-9]{40}$/; + +function resolveOwnerAddress(deployerAddress: string): string { + const envOwner = process.env.OWNER_ADDRESS?.trim(); + if (envOwner && ADDR_HEX_RE.test(envOwner)) { + return envOwner; + } + + if (DEFAULT_OWNER_ADDRESS && ADDR_HEX_RE.test(DEFAULT_OWNER_ADDRESS)) { + return DEFAULT_OWNER_ADDRESS; + } + + return deployerAddress; +} + +function resolveSolverSignerAddress(deployerAddress: string): string { + const envSolverSigner = process.env.SOLVER_SIGNER_ADDRESS?.trim(); + if (envSolverSigner && ADDR_HEX_RE.test(envSolverSigner)) { + return envSolverSigner; + } + + return deployerAddress; +} + +function resolveOpenRouterAddress(chainId: number): string { + const row = findDeploymentRegistryRow(chainId); + const registryAddress = row?.openRouterAddress?.trim(); + if (registryAddress && ADDR_HEX_RE.test(registryAddress)) { + return registryAddress; + } + + return OPEN_ROUTER_EXPECTED_ADDRESS; +} + +async function getRFQVaultExecutorInitcode(params: { + owner: string; + openRouter: string; + solverSigner: string; +}): Promise { + const factory = await ethers.getContractFactory('RFQVaultExecutor'); + const deployTransaction = await factory.getDeployTransaction( + params.owner, + params.openRouter, + params.solverSigner, + ); + + if (!deployTransaction.data) { + throw new Error('RFQVaultExecutor deploy transaction data is empty'); + } + + return deployTransaction.data; +} + +async function assertRFQVaultExecutorDeployment(params: { + address: string; + owner: string; + openRouter: string; + solverSigner: string; +}): Promise { + const contract = new ethers.Contract( + params.address, + [ + 'function owner() view returns (address)', + 'function OPEN_ROUTER() view returns (address)', + 'function solverSigner() view returns (address)', + ], + ethers.provider, + ); + + const [owner, openRouter, solverSigner] = await Promise.all([ + contract.owner() as Promise, + contract.OPEN_ROUTER() as Promise, + contract.solverSigner() as Promise, + ]); + + if (owner.toLowerCase() !== params.owner.toLowerCase()) { + throw new Error( + `RFQVaultExecutor owner mismatch: expected ${params.owner}, got ${owner}`, + ); + } + + if (openRouter.toLowerCase() !== params.openRouter.toLowerCase()) { + throw new Error( + `RFQVaultExecutor OPEN_ROUTER mismatch: expected ${params.openRouter}, got ${openRouter}`, + ); + } + + if (solverSigner.toLowerCase() !== params.solverSigner.toLowerCase()) { + throw new Error( + `RFQVaultExecutor solverSigner mismatch: expected ${params.solverSigner}, got ${solverSigner}`, + ); + } +} + +function printBackendConfigSnippet(chainId: number, address: string): void { + console.log('\n=== bungee-backend config snippet (placeholder) ==='); + console.log('Add RFQVaultExecutor address when RFQ router config is introduced:'); + console.log(` [${chainId}]: '${address}',`); +} + +async function persistRFQVaultExecutorAddress(params: { + network: string; + chainId: number; + address: string; +}): Promise { + const filePath = await writeRFQVaultExecutorAddress( + params.network, + params.address, + ); + console.log('Deployment JSON:', filePath); + printBackendConfigSnippet(params.chainId, params.address); +} + +async function main() { + const [deployer] = await ethers.getSigners(); + const networkName = hre.network.name; + const chainId = Number((await ethers.provider.getNetwork()).chainId); + + console.log('Deployer: ', deployer.address); + console.log('Network: ', networkName); + console.log('Chain ID: ', chainId); + console.log('CREATE3 salt: ', RFQ_VAULT_EXECUTOR_CREATE3_SALT_TEXT); + console.log(''); + + const owner = resolveOwnerAddress(deployer.address); + const openRouter = resolveOpenRouterAddress(chainId); + const solverSigner = resolveSolverSignerAddress(deployer.address); + + console.log('Owner: ', owner); + console.log('OpenRouter: ', openRouter); + console.log('SolverSigner: ', solverSigner); + console.log(''); + + const initcode = await getRFQVaultExecutorInitcode({ + owner, + openRouter, + solverSigner, + }); + + const create3Factory = new ethers.Contract( + CREATE_X_FACTORY, + Create3ABI, + deployer, + ); + + const expectedAddress = (await create3Factory.deployCreate3.staticCall( + RFQ_VAULT_EXECUTOR_CREATE3_SALT, + initcode, + )) as string; + + console.log('Expected address:', expectedAddress); + + const existingBytecode = await ethers.provider.getCode(expectedAddress); + if (hasContractBytecode(existingBytecode)) { + console.log(`RFQVaultExecutor already deployed at ${expectedAddress}`); + await assertRFQVaultExecutorDeployment({ + address: expectedAddress, + owner, + openRouter, + solverSigner, + }); + await persistRFQVaultExecutorAddress({ + network: networkName, + chainId, + address: expectedAddress, + }); + return; + } + + console.log('Deploying RFQVaultExecutor via CREATE3...'); + const create3Deployment = await create3Factory.deployCreate3( + RFQ_VAULT_EXECUTOR_CREATE3_SALT, + initcode, + ); + console.log('CREATE3 deployment tx:', create3Deployment.hash); + + const receipt = await create3Deployment.wait(); + const executorAddress = decodeCreate3DeploymentFromTxReceipt({ receipt }); + if (!executorAddress) { + throw new Error( + 'RFQVaultExecutor address not found in CREATE3 deployment receipt', + ); + } + + if (executorAddress.toLowerCase() !== expectedAddress.toLowerCase()) { + throw new Error( + `Deployed address ${executorAddress} does not match staticCall ${expectedAddress}`, + ); + } + + await assertRFQVaultExecutorDeployment({ + address: executorAddress, + owner, + openRouter, + solverSigner, + }); + + console.log('\n=== Deployment Summary ==='); + console.log(`RFQVaultExecutor (${networkName}): ${executorAddress}`); + await persistRFQVaultExecutorAddress({ + network: networkName, + chainId, + address: executorAddress, + }); + + if (chainId !== 31337) { + await new Promise((resolve) => setTimeout(resolve, 5000)); + + await hre.run('verify:verify', { + address: executorAddress, + constructorArguments: [owner, openRouter, solverSigner], + }); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/scripts/deploy/rfqVaultExecutorAddresses.ts b/scripts/deploy/rfqVaultExecutorAddresses.ts new file mode 100644 index 0000000..09a8af3 --- /dev/null +++ b/scripts/deploy/rfqVaultExecutorAddresses.ts @@ -0,0 +1,77 @@ +import { mkdir, readFile, writeFile } from 'fs/promises'; +import { dirname, resolve } from 'path'; + +export type RFQVaultExecutorDeployments = { + RFQVaultExecutor: string; +}; + +export function rfqVaultExecutorAddressesPath( + network: string, + stage = 'prod', +): string { + return resolve( + process.cwd(), + 'deployments', + stage, + 'addresses', + `${network}.json`, + ); +} + +export async function readRFQVaultExecutorAddress( + network: string, + stage = 'prod', +): Promise { + const filePath = rfqVaultExecutorAddressesPath(network, stage); + + try { + const raw = await readFile(filePath, 'utf8'); + const deployments = JSON.parse(raw) as Partial; + const address = deployments.RFQVaultExecutor?.trim(); + + if (!address) { + return undefined; + } + + return address; + } catch (err) { + if ((err as NodeJS.ErrnoException).code === 'ENOENT') { + return undefined; + } + + throw err; + } +} + +/** + * Persists RFQVaultExecutor address for a network. + * Creates deployments//addresses/ and .json when missing. + */ +export async function writeRFQVaultExecutorAddress( + network: string, + address: string, + stage = 'prod', +): Promise { + const filePath = rfqVaultExecutorAddressesPath(network, stage); + let deployments: Partial = {}; + + try { + const raw = await readFile(filePath, 'utf8'); + deployments = JSON.parse(raw) as Partial; + } catch (err) { + if ((err as NodeJS.ErrnoException).code !== 'ENOENT') { + throw err; + } + } + + deployments.RFQVaultExecutor = address; + + await mkdir(dirname(filePath), { recursive: true }); + await writeFile( + filePath, + `${JSON.stringify(deployments, null, 2)}\n`, + 'utf8', + ); + + return filePath; +} diff --git a/src/executors/RFQVaultExecutor.sol b/src/executors/RFQVaultExecutor.sol index 13f9fa3..f2e76bb 100644 --- a/src/executors/RFQVaultExecutor.sol +++ b/src/executors/RFQVaultExecutor.sol @@ -153,6 +153,10 @@ contract RFQVaultExecutor is Ownable { SOLVER_SIGNER = _solverSigner; } + function solverSigner() external view returns (address) { + return SOLVER_SIGNER; + } + function rescueFunds(address token_, address rescueTo_, uint256 amount_) external onlyOwner { RescueFundsLib.rescueFunds(token_, rescueTo_, amount_); } From 10a000e55463ba5529dfbb37310e0af8e97541fe Mon Sep 17 00:00:00 2001 From: reddyismav Date: Thu, 18 Jun 2026 00:34:41 +0400 Subject: [PATCH 03/11] feat: add a mark refund function to make the refunds robust --- src/executors/RFQVaultExecutor.sol | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/executors/RFQVaultExecutor.sol b/src/executors/RFQVaultExecutor.sol index f2e76bb..62c3a6c 100644 --- a/src/executors/RFQVaultExecutor.sol +++ b/src/executors/RFQVaultExecutor.sol @@ -157,6 +157,16 @@ contract RFQVaultExecutor is Ownable { return SOLVER_SIGNER; } + /// @notice Mark a quoteId as used to block any further fulfil for this quote. + /// @dev Permissionless — no financial incentive exists to grief a fulfil. + /// Called by the solver on the destination chain before initiating an + /// origin-chain refund, preventing race conditions where an in-flight + /// fulfil relay lands after the refund is already processed. + /// Reverts with InvalidQuoteId if the quoteId was already used. + function markForRefund(bytes32 quoteId) external { + _markQuoteId(quoteId); + } + function rescueFunds(address token_, address rescueTo_, uint256 amount_) external onlyOwner { RescueFundsLib.rescueFunds(token_, rescueTo_, amount_); } From acf917b5ea641542df1e00cb7be232d02663f7f8 Mon Sep 17 00:00:00 2001 From: reddyismav Date: Thu, 18 Jun 2026 01:07:09 +0400 Subject: [PATCH 04/11] feat: mark for refund robustness to avoid race condition --- src/executors/RFQVaultExecutor.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/executors/RFQVaultExecutor.sol b/src/executors/RFQVaultExecutor.sol index 62c3a6c..adb9c54 100644 --- a/src/executors/RFQVaultExecutor.sol +++ b/src/executors/RFQVaultExecutor.sol @@ -34,6 +34,7 @@ contract RFQVaultExecutor is Ownable { mapping(bytes32 quoteId => uint256 isUsed) public quoteIdUsed; mapping(uint256 nonce => uint256 isUsed) public nonceUsed; + mapping(bytes32 quoteId => uint256 isMarked) public isMarkedForRefund; event NativeDeposited(bytes32 indexed quoteId, uint256 amount); event Fulfilled(bytes32 indexed quoteId, address token, uint256 amount, address receiver); @@ -165,6 +166,7 @@ contract RFQVaultExecutor is Ownable { /// Reverts with InvalidQuoteId if the quoteId was already used. function markForRefund(bytes32 quoteId) external { _markQuoteId(quoteId); + isMarkedForRefund[quoteId] = 1; } function rescueFunds(address token_, address rescueTo_, uint256 amount_) external onlyOwner { From 0df0d44e285921b8454638c42edd5ba414ab9d92 Mon Sep 17 00:00:00 2001 From: reddyismav Date: Thu, 18 Jun 2026 16:31:09 +0400 Subject: [PATCH 05/11] feat: changes --- scripts/deploy/deployRFQVaultExecutor.ts | 32 +------ src/executors/RFQVaultExecutor.sol | 117 +++++++++++++++++------ test/unit/RFQVaultExecutor.t.sol | 54 +++++++---- 3 files changed, 129 insertions(+), 74 deletions(-) diff --git a/scripts/deploy/deployRFQVaultExecutor.ts b/scripts/deploy/deployRFQVaultExecutor.ts index 14bec78..d4a68aa 100644 --- a/scripts/deploy/deployRFQVaultExecutor.ts +++ b/scripts/deploy/deployRFQVaultExecutor.ts @@ -18,13 +18,11 @@ import hre, { ethers } from 'hardhat'; import { CREATE_X_FACTORY, Create3ABI, - OPEN_ROUTER_EXPECTED_ADDRESS, RFQ_VAULT_EXECUTOR_CREATE3_SALT, RFQ_VAULT_EXECUTOR_CREATE3_SALT_TEXT, decodeCreate3DeploymentFromTxReceipt, hasContractBytecode, } from './create3'; -import { findDeploymentRegistryRow } from './deploymentRegistry'; import { writeRFQVaultExecutorAddress } from './rfqVaultExecutorAddresses'; // ============================================================================= @@ -58,25 +56,13 @@ function resolveSolverSignerAddress(deployerAddress: string): string { return deployerAddress; } -function resolveOpenRouterAddress(chainId: number): string { - const row = findDeploymentRegistryRow(chainId); - const registryAddress = row?.openRouterAddress?.trim(); - if (registryAddress && ADDR_HEX_RE.test(registryAddress)) { - return registryAddress; - } - - return OPEN_ROUTER_EXPECTED_ADDRESS; -} - async function getRFQVaultExecutorInitcode(params: { owner: string; - openRouter: string; solverSigner: string; }): Promise { const factory = await ethers.getContractFactory('RFQVaultExecutor'); const deployTransaction = await factory.getDeployTransaction( params.owner, - params.openRouter, params.solverSigner, ); @@ -90,22 +76,19 @@ async function getRFQVaultExecutorInitcode(params: { async function assertRFQVaultExecutorDeployment(params: { address: string; owner: string; - openRouter: string; solverSigner: string; }): Promise { const contract = new ethers.Contract( params.address, [ 'function owner() view returns (address)', - 'function OPEN_ROUTER() view returns (address)', 'function solverSigner() view returns (address)', ], ethers.provider, ); - const [owner, openRouter, solverSigner] = await Promise.all([ + const [owner, solverSigner] = await Promise.all([ contract.owner() as Promise, - contract.OPEN_ROUTER() as Promise, contract.solverSigner() as Promise, ]); @@ -115,12 +98,6 @@ async function assertRFQVaultExecutorDeployment(params: { ); } - if (openRouter.toLowerCase() !== params.openRouter.toLowerCase()) { - throw new Error( - `RFQVaultExecutor OPEN_ROUTER mismatch: expected ${params.openRouter}, got ${openRouter}`, - ); - } - if (solverSigner.toLowerCase() !== params.solverSigner.toLowerCase()) { throw new Error( `RFQVaultExecutor solverSigner mismatch: expected ${params.solverSigner}, got ${solverSigner}`, @@ -159,17 +136,14 @@ async function main() { console.log(''); const owner = resolveOwnerAddress(deployer.address); - const openRouter = resolveOpenRouterAddress(chainId); const solverSigner = resolveSolverSignerAddress(deployer.address); console.log('Owner: ', owner); - console.log('OpenRouter: ', openRouter); console.log('SolverSigner: ', solverSigner); console.log(''); const initcode = await getRFQVaultExecutorInitcode({ owner, - openRouter, solverSigner, }); @@ -192,7 +166,6 @@ async function main() { await assertRFQVaultExecutorDeployment({ address: expectedAddress, owner, - openRouter, solverSigner, }); await persistRFQVaultExecutorAddress({ @@ -227,7 +200,6 @@ async function main() { await assertRFQVaultExecutorDeployment({ address: executorAddress, owner, - openRouter, solverSigner, }); @@ -244,7 +216,7 @@ async function main() { await hre.run('verify:verify', { address: executorAddress, - constructorArguments: [owner, openRouter, solverSigner], + constructorArguments: [owner, solverSigner], }); } } diff --git a/src/executors/RFQVaultExecutor.sol b/src/executors/RFQVaultExecutor.sol index adb9c54..ab26f29 100644 --- a/src/executors/RFQVaultExecutor.sol +++ b/src/executors/RFQVaultExecutor.sol @@ -9,7 +9,7 @@ import {AuthenticationLib} from "../common/lib/AuthenticationLib.sol"; import {CurrencyLib} from "../common/lib/CurrencyLib.sol"; /// @title RFQVaultExecutor -/// @notice Solver-controlled vault that receives funds from OpenRouter and releases them via signed fulfil/refund flows. +/// @notice Solver-controlled vault that receives deposits and releases funds via signed fulfil/refund flows. contract RFQVaultExecutor is Ownable { struct Action { address target; @@ -18,7 +18,6 @@ contract RFQVaultExecutor is Ownable { } error ActionFailed(uint256 index); - error CallerNotOpenRouter(); error InvalidQuoteId(); error InvalidNonce(); error InvalidSigner(); @@ -28,32 +27,51 @@ contract RFQVaultExecutor is Ownable { uint256 internal constant REFUND_DISCRIMINATOR = 2; uint256 internal constant SWAP_AND_FULFIL_DISCRIMINATOR = 3; - address public immutable OPEN_ROUTER; - address internal SOLVER_SIGNER; mapping(bytes32 quoteId => uint256 isUsed) public quoteIdUsed; mapping(uint256 nonce => uint256 isUsed) public nonceUsed; mapping(bytes32 quoteId => uint256 isMarked) public isMarkedForRefund; - event NativeDeposited(bytes32 indexed quoteId, uint256 amount); - event Fulfilled(bytes32 indexed quoteId, address token, uint256 amount, address receiver); - event Refunded(bytes32 indexed quoteId, address token, uint256 amount, address receiver); + event NativeDeposited(bytes32 quoteId, uint256 amount); + event ERC20Deposited(bytes32 quoteId, address token, uint256 amount); + event Fulfilled( + bytes32 quoteId, + address token, + uint256 amount, + address receiver + ); + event Refunded( + bytes32 quoteId, + address token, + uint256 amount, + address receiver + ); - constructor(address _owner, address _openRouter, address _solverSigner) Ownable(_owner) { - OPEN_ROUTER = _openRouter; + constructor(address _owner, address _solverSigner) Ownable(_owner) { SOLVER_SIGNER = _solverSigner; } - /// @notice Accept native deposits from OpenRouter and emit a correlating event. + /// @notice Accept native deposits and emit a correlating event. function receiveNative(bytes32 quoteId) external payable { - if (msg.sender != OPEN_ROUTER) { - revert CallerNotOpenRouter(); - } - emit NativeDeposited(quoteId, msg.value); } + /// @notice Pull ERC20 tokens from the caller into the vault and emit a correlating event. + function receiveERC20( + bytes32 quoteId, + address token, + uint256 amount + ) external { + SafeTransferLib.safeTransferFrom( + token, + msg.sender, + address(this), + amount + ); + emit ERC20Deposited(quoteId, token, amount); + } + /// @notice Transfer vault funds to a receiver for a signed quote. function fulfil( bytes32 quoteId, @@ -63,7 +81,14 @@ contract RFQVaultExecutor is Ownable { address receiver, bytes calldata signature ) external { - bytes32 messageHash = _hashFulfilOrRefund(FULFIL_DISCRIMINATOR, quoteId, nonce, token, amount, receiver); + bytes32 messageHash = _hashFulfilOrRefund( + FULFIL_DISCRIMINATOR, + quoteId, + nonce, + token, + amount, + receiver + ); _verifyAndMarkQuoteId(messageHash, signature, quoteId); CurrencyLib.transfer(token, receiver, amount); @@ -97,17 +122,26 @@ contract RFQVaultExecutor is Ownable { _verifyAndMarkQuoteId(messageHash, signature, quoteId); if (approvalToken != address(0)) { - SafeTransferLib.safeApproveWithRetry(approvalToken, approvalSpender, approvalAmount); + SafeTransferLib.safeApproveWithRetry( + approvalToken, + approvalSpender, + approvalAmount + ); } - uint256 beforeBalance = CurrencyLib.balanceOf(outputToken, address(this)); + uint256 beforeBalance = CurrencyLib.balanceOf( + outputToken, + address(this) + ); if (!_performAction(swapAction)) { revert ActionFailed(0); } uint256 swapOutput; unchecked { - swapOutput = CurrencyLib.balanceOf(outputToken, address(this)) - beforeBalance; + swapOutput = + CurrencyLib.balanceOf(outputToken, address(this)) - + beforeBalance; } if (swapOutput < minOutput) { @@ -119,12 +153,18 @@ contract RFQVaultExecutor is Ownable { } /// @notice Execute arbitrary signed actions unrelated to quote fulfilment. - function performActions(uint256 nonce, Action[] calldata actions, bytes calldata signature) external { - bytes32 messageHash = keccak256(abi.encode(block.chainid, address(this), nonce, actions)); + function performActions( + uint256 nonce, + Action[] calldata actions, + bytes calldata signature + ) external { + bytes32 messageHash = keccak256( + abi.encode(block.chainid, address(this), nonce, actions) + ); _verifyAndMarkNonce(messageHash, signature, nonce); uint256 actionsLength = actions.length; - for (uint256 i = 0; i < actionsLength;) { + for (uint256 i = 0; i < actionsLength; ) { if (!_performAction(actions[i])) { revert ActionFailed(i); } @@ -143,7 +183,14 @@ contract RFQVaultExecutor is Ownable { address receiver, bytes calldata signature ) external { - bytes32 messageHash = _hashFulfilOrRefund(REFUND_DISCRIMINATOR, quoteId, nonce, token, amount, receiver); + bytes32 messageHash = _hashFulfilOrRefund( + REFUND_DISCRIMINATOR, + quoteId, + nonce, + token, + amount, + receiver + ); _verifyAndMarkQuoteId(messageHash, signature, quoteId); CurrencyLib.transfer(token, receiver, amount); @@ -169,7 +216,11 @@ contract RFQVaultExecutor is Ownable { isMarkedForRefund[quoteId] = 1; } - function rescueFunds(address token_, address rescueTo_, uint256 amount_) external onlyOwner { + function rescueFunds( + address token_, + address rescueTo_, + uint256 amount_ + ) external onlyOwner { RescueFundsLib.rescueFunds(token_, rescueTo_, amount_); } @@ -233,7 +284,9 @@ contract RFQVaultExecutor is Ownable { } } - function _keccak256CalldataBytes(bytes calldata data) internal pure returns (bytes32 hash) { + function _keccak256CalldataBytes( + bytes calldata data + ) internal pure returns (bytes32 hash) { assembly { let ptr := mload(0x40) let len := data.length @@ -243,7 +296,11 @@ contract RFQVaultExecutor is Ownable { } } - function _verifyAndMarkQuoteId(bytes32 messageHash, bytes calldata signature, bytes32 quoteId) internal { + function _verifyAndMarkQuoteId( + bytes32 messageHash, + bytes calldata signature, + bytes32 quoteId + ) internal { address signer = SOLVER_SIGNER; if (signer != AuthenticationLib.authenticate(messageHash, signature)) { assembly { @@ -254,7 +311,11 @@ contract RFQVaultExecutor is Ownable { _markQuoteId(quoteId); } - function _verifyAndMarkNonce(bytes32 messageHash, bytes calldata signature, uint256 nonce) internal { + function _verifyAndMarkNonce( + bytes32 messageHash, + bytes calldata signature, + uint256 nonce + ) internal { address signer = SOLVER_SIGNER; if (signer != AuthenticationLib.authenticate(messageHash, signature)) { assembly { @@ -296,7 +357,9 @@ contract RFQVaultExecutor is Ownable { } /// @dev Does not revert on failure. Caller should check the return value. - function _performAction(Action calldata action) internal returns (bool success) { + function _performAction( + Action calldata action + ) internal returns (bool success) { assembly { let actionDataLength := calldataload(add(action, 0x60)) diff --git a/test/unit/RFQVaultExecutor.t.sol b/test/unit/RFQVaultExecutor.t.sol index 6d53888..aaa5d15 100644 --- a/test/unit/RFQVaultExecutor.t.sol +++ b/test/unit/RFQVaultExecutor.t.sol @@ -20,7 +20,6 @@ contract RFQVaultExecutorTest is Test { uint256 internal constant SOLVER_PRIVATE_KEY = 0xA11CE; address internal solverSigner; - address internal openRouter; bytes32 internal constant QUOTE_ID = keccak256("quote-1"); uint256 internal constant NONCE = 1; @@ -35,9 +34,8 @@ contract RFQVaultExecutorTest is Test { function setUp() public { solverSigner = vm.addr(SOLVER_PRIVATE_KEY); - openRouter = address(new OpenRouterStub()); - vault = new RFQVaultExecutor(OWNER, openRouter, solverSigner); + vault = new RFQVaultExecutor(OWNER, solverSigner); token = new MockERC20("Input", "IN"); outputToken = new MockERC20("Output", "OUT"); swapTarget = new MockSwap(); @@ -48,25 +46,27 @@ contract RFQVaultExecutorTest is Test { vm.label(address(outputToken), "outputToken"); vm.label(address(swapTarget), "swapTarget"); vm.label(address(actionTarget), "actionTarget"); - vm.label(openRouter, "openRouter"); vm.label(RECEIVER, "receiver"); vm.label(solverSigner, "solverSigner"); } function test_receiveNative_emitsEvent() public { - vm.deal(openRouter, AMOUNT); + CallerStub caller = new CallerStub(); + vm.deal(address(caller), AMOUNT); vm.expectEmit(true, false, false, true, address(vault)); emit RFQVaultExecutor.NativeDeposited(QUOTE_ID, AMOUNT); - OpenRouterStub(openRouter).sendNativeFromBalance(address(vault), QUOTE_ID, AMOUNT); + caller.sendNativeFromBalance(address(vault), QUOTE_ID, AMOUNT); } - function test_receiveNative_revertsIfNotOpenRouter() public { + function test_receiveNative_permissionless() public { CallerStub otherCaller = new CallerStub(); vm.deal(address(otherCaller), AMOUNT); - vm.expectRevert(RFQVaultExecutor.CallerNotOpenRouter.selector); + vm.expectEmit(true, false, false, true, address(vault)); + emit RFQVaultExecutor.NativeDeposited(QUOTE_ID, AMOUNT); + otherCaller.sendNativeFromBalance(address(vault), QUOTE_ID, AMOUNT); } @@ -75,7 +75,7 @@ contract RFQVaultExecutorTest is Test { bytes memory signature = _signFulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER); - vm.expectEmit(true, false, false, true, address(vault)); + vm.expectEmit(false, false, false, true, address(vault)); emit RFQVaultExecutor.Fulfilled(QUOTE_ID, address(token), AMOUNT, RECEIVER); vault.fulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); @@ -587,7 +587,8 @@ contract RFQVaultExecutorTest is Test { RFQVaultExecutor.Action memory swapAction, address receiver ) internal view returns (bytes memory) { - bytes32 messageHash = _hashSwapAndFulfil( + bytes32 messageHash = _hashSwapAndFulfilAt( + address(vault), quoteId, nonce, approvalToken, @@ -658,9 +659,34 @@ contract RFQVaultExecutorTest is Test { uint256 minOutput, RFQVaultExecutor.Action memory swapAction, address receiver + ) internal view returns (bytes32 hash) { + return _hashSwapAndFulfilAt( + address(vault), + quoteId, + nonce, + approvalToken, + approvalSpender, + approvalAmount, + outputToken_, + minOutput, + swapAction, + receiver + ); + } + + function _hashSwapAndFulfilAt( + address vaultAddress, + bytes32 quoteId, + uint256 nonce, + address approvalToken, + address approvalSpender, + uint256 approvalAmount, + address outputToken_, + uint256 minOutput, + RFQVaultExecutor.Action memory swapAction, + address receiver ) internal view returns (bytes32 hash) { bytes32 dataHash = keccak256(swapAction.data); - address vaultAddress = address(vault); assembly { let ptr := mload(0x40) @@ -731,12 +757,6 @@ contract MockActionTarget { } } -contract OpenRouterStub { - function sendNativeFromBalance(address vault, bytes32 quoteId, uint256 amount) external { - RFQVaultExecutor(payable(vault)).receiveNative{value: amount}(quoteId); - } -} - contract CallerStub { function sendNativeFromBalance(address vault, bytes32 quoteId, uint256 amount) external { RFQVaultExecutor(payable(vault)).receiveNative{value: amount}(quoteId); From e4b35b896c1d54cbed60a6ec33e195a35b616a05 Mon Sep 17 00:00:00 2001 From: arthcp Date: Fri, 19 Jun 2026 16:47:55 +0400 Subject: [PATCH 06/11] feat: optimise gas for rfq --- src/executors/RFQVaultExecutor.sol | 57 +++++++++++++++++++----------- test/unit/RFQVaultExecutor.t.sol | 9 +++++ 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/executors/RFQVaultExecutor.sol b/src/executors/RFQVaultExecutor.sol index ab26f29..d710438 100644 --- a/src/executors/RFQVaultExecutor.sol +++ b/src/executors/RFQVaultExecutor.sol @@ -5,7 +5,6 @@ import {SafeTransferLib} from "solady/src/utils/SafeTransferLib.sol"; import {Ownable} from "../common/utils/Ownable.sol"; import {RescueFundsLib} from "../common/lib/RescueFundsLib.sol"; -import {AuthenticationLib} from "../common/lib/AuthenticationLib.sol"; import {CurrencyLib} from "../common/lib/CurrencyLib.sol"; /// @title RFQVaultExecutor @@ -246,7 +245,6 @@ contract RFQVaultExecutor is Ownable { mstore(add(ptr, 0xc0), amount) mstore(add(ptr, 0xe0), receiver) hash := keccak256(ptr, 0x100) - mstore(0x40, add(ptr, 0x100)) } } @@ -261,10 +259,12 @@ contract RFQVaultExecutor is Ownable { Action calldata swapAction, address receiver ) internal view returns (bytes32 hash) { - bytes32 dataHash = _keccak256CalldataBytes(swapAction.data); - assembly { let ptr := mload(0x40) + let dataLength := calldataload(add(swapAction, 0x60)) + calldatacopy(ptr, add(swapAction, 0x80), dataLength) + let dataHash := keccak256(ptr, dataLength) + mstore(ptr, chainid()) mstore(add(ptr, 0x20), address()) mstore(add(ptr, 0x40), SWAP_AND_FULFIL_DISCRIMINATOR) @@ -280,19 +280,6 @@ contract RFQVaultExecutor is Ownable { mstore(add(ptr, 0x180), dataHash) mstore(add(ptr, 0x1a0), receiver) hash := keccak256(ptr, 0x1c0) - mstore(0x40, add(ptr, 0x1c0)) - } - } - - function _keccak256CalldataBytes( - bytes calldata data - ) internal pure returns (bytes32 hash) { - assembly { - let ptr := mload(0x40) - let len := data.length - calldatacopy(ptr, data.offset, len) - hash := keccak256(ptr, len) - mstore(0x40, add(ptr, and(add(len, 0x1f), not(0x1f)))) } } @@ -302,7 +289,7 @@ contract RFQVaultExecutor is Ownable { bytes32 quoteId ) internal { address signer = SOLVER_SIGNER; - if (signer != AuthenticationLib.authenticate(messageHash, signature)) { + if (signer != _authenticate(messageHash, signature)) { assembly { mstore(0x00, 0x815e1d64) revert(0x1c, 0x04) @@ -317,7 +304,7 @@ contract RFQVaultExecutor is Ownable { uint256 nonce ) internal { address signer = SOLVER_SIGNER; - if (signer != AuthenticationLib.authenticate(messageHash, signature)) { + if (signer != _authenticate(messageHash, signature)) { assembly { mstore(0x00, 0x815e1d64) revert(0x1c, 0x04) @@ -326,6 +313,36 @@ contract RFQVaultExecutor is Ownable { _markNonce(nonce); } + function _authenticate( + bytes32 messageHash, + bytes calldata signature + ) internal view returns (address signer) { + assembly { + if iszero(eq(signature.length, 0x41)) { + mstore(0x00, 0x815e1d64) + revert(0x1c, 0x04) + } + + let ptr := mload(0x40) + mstore( + ptr, + 0x19457468657265756d205369676e6564204d6573736167653a0a333200000000 + ) + mstore(add(ptr, 0x1c), messageHash) + let digest := keccak256(ptr, 0x3c) + + mstore(ptr, digest) + mstore(add(ptr, 0x20), byte(0, calldataload(add(signature.offset, 0x40)))) + mstore(add(ptr, 0x40), calldataload(signature.offset)) + mstore(add(ptr, 0x60), calldataload(add(signature.offset, 0x20))) + + signer := mul( + mload(ptr), + staticcall(gas(), 0x01, ptr, 0x80, ptr, 0x20) + ) + } + } + function _markQuoteId(bytes32 quoteId) internal { assembly { mstore(0, quoteId) @@ -366,7 +383,7 @@ contract RFQVaultExecutor is Ownable { let freeMemPtr := mload(0x40) calldatacopy( freeMemPtr, - add(add(action, 0x20), calldataload(add(action, 0x40))), + add(action, 0x80), actionDataLength ) diff --git a/test/unit/RFQVaultExecutor.t.sol b/test/unit/RFQVaultExecutor.t.sol index aaa5d15..6984f96 100644 --- a/test/unit/RFQVaultExecutor.t.sol +++ b/test/unit/RFQVaultExecutor.t.sol @@ -132,6 +132,15 @@ contract RFQVaultExecutorTest is Test { vault.fulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); } + function test_fulfil_revertsIfMalformedSignature() public { + token.mint(address(vault), AMOUNT); + + bytes memory signature = new bytes(64); + + vm.expectRevert(RFQVaultExecutor.InvalidSigner.selector); + vault.fulfil(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); + } + function test_swapAndFulfil_erc20() public { token.mint(address(vault), AMOUNT); outputToken.mint(address(swapTarget), SWAP_OUTPUT); From 0162dfd08fcb8c6044a9f52597193ee5874f8d19 Mon Sep 17 00:00:00 2001 From: arthcp Date: Fri, 19 Jun 2026 16:48:22 +0400 Subject: [PATCH 07/11] feat: enforce solver signer in deploy --- scripts/deploy/deployRFQVaultExecutor.ts | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/scripts/deploy/deployRFQVaultExecutor.ts b/scripts/deploy/deployRFQVaultExecutor.ts index d4a68aa..220534f 100644 --- a/scripts/deploy/deployRFQVaultExecutor.ts +++ b/scripts/deploy/deployRFQVaultExecutor.ts @@ -8,10 +8,10 @@ * * Required env vars: * DEPLOYER_PRIVATE_KEY — deployer wallet private key + * SOLVER_SIGNER_ADDRESS — solver signer for fulfil/refund signatures * * Optional env vars: * OWNER_ADDRESS — RFQVaultExecutor owner; defaults to DEFAULT_OWNER_ADDRESS or deployer - * SOLVER_SIGNER_ADDRESS — solver signer for fulfil/refund signatures; defaults to deployer */ import hre, { ethers } from 'hardhat'; @@ -33,6 +33,7 @@ import { writeRFQVaultExecutorAddress } from './rfqVaultExecutorAddresses'; const DEFAULT_OWNER_ADDRESS = '0x0E1B5AB67aF1c99F8c7Ebc71f41f75D4D6211e53'; const ADDR_HEX_RE = /^0x[a-fA-F0-9]{40}$/; +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; function resolveOwnerAddress(deployerAddress: string): string { const envOwner = process.env.OWNER_ADDRESS?.trim(); @@ -47,13 +48,21 @@ function resolveOwnerAddress(deployerAddress: string): string { return deployerAddress; } -function resolveSolverSignerAddress(deployerAddress: string): string { +function resolveSolverSignerAddress(): string { const envSolverSigner = process.env.SOLVER_SIGNER_ADDRESS?.trim(); - if (envSolverSigner && ADDR_HEX_RE.test(envSolverSigner)) { - return envSolverSigner; + if (!envSolverSigner) { + throw new Error('SOLVER_SIGNER_ADDRESS is required'); } - return deployerAddress; + if (!ADDR_HEX_RE.test(envSolverSigner)) { + throw new Error(`Invalid SOLVER_SIGNER_ADDRESS: ${envSolverSigner}`); + } + + if (envSolverSigner.toLowerCase() === ZERO_ADDRESS) { + throw new Error('SOLVER_SIGNER_ADDRESS cannot be zero'); + } + + return envSolverSigner; } async function getRFQVaultExecutorInitcode(params: { @@ -136,7 +145,7 @@ async function main() { console.log(''); const owner = resolveOwnerAddress(deployer.address); - const solverSigner = resolveSolverSignerAddress(deployer.address); + const solverSigner = resolveSolverSignerAddress(); console.log('Owner: ', owner); console.log('SolverSigner: ', solverSigner); From cacd6fea3a72a60baa22f2f87e39e95fcaba2331 Mon Sep 17 00:00:00 2001 From: arthcp Date: Fri, 19 Jun 2026 18:46:37 +0400 Subject: [PATCH 08/11] feat: deploy rfq vault --- .gitignore | 2 + package.json | 2 + .../deploy/deployRFQVaultExecutorAllChains.ts | 416 +++++++++++++ scripts/deploy/verifyRFQVaultExecutorBatch.ts | 549 ++++++++++++++++++ src/executors/RFQVaultExecutor.sol | 44 +- test/unit/RFQVaultExecutor.t.sol | 105 ++++ 6 files changed, 1109 insertions(+), 9 deletions(-) create mode 100644 scripts/deploy/deployRFQVaultExecutorAllChains.ts create mode 100644 scripts/deploy/verifyRFQVaultExecutorBatch.ts diff --git a/.gitignore b/.gitignore index cee3436..3ecf9a0 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ node_modules /cache-hh /artifacts-tron /cache_hardhat-tron + +.DS_Store diff --git a/package.json b/package.json index cf58431..8e339d8 100644 --- a/package.json +++ b/package.json @@ -11,11 +11,13 @@ "deploy:allowance-holder": "hardhat run scripts/deploy/deployAllowanceHolder.ts --network", "deploy:receiver-executor": "hardhat run scripts/deploy/deployReceiverAllChains.ts", "deploy:across-manipulator": "hardhat run scripts/deploy/deployAcrossERC20AmountManipulator.ts --network", + "deploy:rfq-vault-executor:all": "ts-node scripts/deploy/deployRFQVaultExecutorAllChains.ts", "deploy:rfq-vault-executor": "hardhat run scripts/deploy/deployRFQVaultExecutor.ts --network", "check:openrouter": "hardhat run scripts/deploy/checkOpenRouterDeployment.ts", "verify:openrouter": "ts-node scripts/deploy/verifyOpenRouterBatch.ts", "check:allowance-holder": "hardhat run scripts/deploy/checkAllowanceHolderDeployment.ts", "verify:allowance-holder": "ts-node scripts/deploy/verifyAllowanceHolderBatch.ts", + "verify:rfq-vault-executor": "ts-node scripts/deploy/verifyRFQVaultExecutorBatch.ts", "check:receiver": "hardhat run scripts/deploy/checkReceiverAllChains.ts", "check:deployer-balances": "hardhat run scripts/deploy/checkDeployerBalances.ts", "check:across-manipulator": "hardhat run scripts/deploy/checkAcrossManipulatorDeployment.ts", diff --git a/scripts/deploy/deployRFQVaultExecutorAllChains.ts b/scripts/deploy/deployRFQVaultExecutorAllChains.ts new file mode 100644 index 0000000..0f69f17 --- /dev/null +++ b/scripts/deploy/deployRFQVaultExecutorAllChains.ts @@ -0,0 +1,416 @@ +/** + * Deploys RFQVaultExecutor on all receiver deployment chains via CreateX CREATE3. + * + * Usage: + * OWNER_ADDRESS=0x... SOLVER_SIGNER_ADDRESS=0x... npx ts-node scripts/deploy/deployRFQVaultExecutorAllChains.ts + * + * Required env: + * DEPLOYER_PRIVATE_KEY + * OWNER_ADDRESS + * SOLVER_SIGNER_ADDRESS + * + * Optional env: + * DRY_RUN=true — print plan only, do not send txs + * CHAINS=base,arbitrum — comma-separated hardhat network names to limit scope + * PARALLELISM=6 — max chains deployed concurrently (default: 6) + * TX_WAIT_TIMEOUT_MS — receipt wait timeout per tx (default: 10000) + */ + +import { readFile } from 'fs/promises'; +import { resolve } from 'path'; +import { + AbiCoder, + Contract, + JsonRpcProvider, + Wallet, + ZeroAddress, + formatEther, + isAddress, + keccak256, +} from 'ethers'; +import { + CREATE_X_FACTORY, + Create3ABI, + RFQ_VAULT_EXECUTOR_CREATE3_SALT, + RFQ_VAULT_EXECUTOR_CREATE3_SALT_TEXT, + computeFinalAddress, + decodeCreate3DeploymentFromTxReceipt, + hasContractBytecode, +} from './create3'; +import { + RECEIVER_DEPLOY_NETWORKS, + ReceiverDeployNetwork, + resolveRpcUrl, +} from './networks'; +import { getDeploymentTransactionOverrides } from './transactionOverrides'; +import { writeRFQVaultExecutorAddress } from './rfqVaultExecutorAddresses'; + +type NetworkRunResult = { + deployed: number; + alreadyDeployed: number; + dryRun: number; + failed: number; +}; + +type RFQVaultExecutorArtifact = { + abi: unknown[]; + bytecode: { + object?: string; + }; +}; + +const EMPTY_RESULT: NetworkRunResult = { + deployed: 0, + alreadyDeployed: 0, + dryRun: 0, + failed: 0, +}; + +const TX_WAIT_TIMEOUT_MS = Number( + process.env.TX_WAIT_TIMEOUT_MS?.trim() || '10000', +); + +function resolvePrivateKey(): string { + const key = process.env.DEPLOYER_PRIVATE_KEY?.trim(); + if (!key) { + throw new Error('DEPLOYER_PRIVATE_KEY is required'); + } + + return key.startsWith('0x') ? key : `0x${key}`; +} + +function resolveAddressEnv(name: string): string { + const address = process.env[name]?.trim(); + if (!address) { + throw new Error(`${name} is required`); + } + if (!isAddress(address)) { + throw new Error(`Invalid ${name}: ${address}`); + } + if (address.toLowerCase() === ZeroAddress.toLowerCase()) { + throw new Error(`${name} cannot be zero`); + } + + return address; +} + +function parseChainFilter(): Set | null { + const raw = process.env.CHAINS?.trim(); + if (!raw) { + return null; + } + + return new Set( + raw + .split(',') + .map((name) => name.trim().toLowerCase()) + .filter(Boolean), + ); +} + +function resolveParallelism(networkCount: number): number { + const raw = process.env.PARALLELISM?.trim(); + if (!raw) { + return Math.min(6, networkCount); + } + + const parsed = Number(raw); + if (!Number.isInteger(parsed) || parsed <= 0) { + throw new Error(`PARALLELISM must be a positive integer, got ${raw}`); + } + + return Math.min(parsed, networkCount); +} + +function createNetworkProvider(network: ReceiverDeployNetwork): JsonRpcProvider { + return new JsonRpcProvider(resolveRpcUrl(network), network.chainId, { + staticNetwork: true, + }); +} + +async function loadRFQVaultExecutorInitcode(params: { + owner: string; + solverSigner: string; +}): Promise<{ initcode: string; initcodeHash: string }> { + const artifactPath = resolve( + process.cwd(), + 'out', + 'RFQVaultExecutor.sol', + 'RFQVaultExecutor.json', + ); + const artifact = JSON.parse( + await readFile(artifactPath, 'utf8'), + ) as RFQVaultExecutorArtifact; + const bytecode = artifact.bytecode.object; + if (!bytecode || !bytecode.startsWith('0x')) { + throw new Error(`Invalid RFQVaultExecutor bytecode in ${artifactPath}`); + } + + const constructorArgs = AbiCoder.defaultAbiCoder() + .encode(['address', 'address'], [params.owner, params.solverSigner]) + .slice(2); + const initcode = `${bytecode}${constructorArgs}`; + + return { initcode, initcodeHash: keccak256(initcode) }; +} + +async function waitForReceiptWithTimeout Promise; hash: string }>( + transaction: T, + label: string, +): Promise { + let timeout: NodeJS.Timeout | undefined; + try { + return await Promise.race([ + transaction.wait(), + new Promise((_, reject) => { + timeout = setTimeout( + () => + reject( + new Error( + `${label} transaction ${transaction.hash} was not mined within ${TX_WAIT_TIMEOUT_MS}ms`, + ), + ), + TX_WAIT_TIMEOUT_MS, + ); + }), + ]); + } finally { + if (timeout) { + clearTimeout(timeout); + } + } +} + +async function runWithConcurrency( + items: readonly T[], + concurrency: number, + worker: (item: T) => Promise, +): Promise { + let nextIndex = 0; + const results = new Array(items.length); + + const workers = Array.from({ length: concurrency }, async () => { + while (true) { + const index = nextIndex; + nextIndex += 1; + if (index >= items.length) { + return; + } + + results[index] = await worker(items[index]); + } + }); + + await Promise.all(workers); + return results.map((result) => result ?? EMPTY_RESULT); +} + +async function assertRFQVaultExecutorDeployment(params: { + provider: JsonRpcProvider; + address: string; + owner: string; + solverSigner: string; +}): Promise { + const contract = new Contract( + params.address, + [ + 'function owner() view returns (address)', + 'function solverSigner() view returns (address)', + ], + params.provider, + ); + + const [owner, solverSigner] = (await Promise.all([ + contract.owner(), + contract.solverSigner(), + ])) as [string, string]; + + if (owner.toLowerCase() !== params.owner.toLowerCase()) { + throw new Error( + `RFQVaultExecutor owner mismatch: expected ${params.owner}, got ${owner}`, + ); + } + + if (solverSigner.toLowerCase() !== params.solverSigner.toLowerCase()) { + throw new Error( + `RFQVaultExecutor solverSigner mismatch: expected ${params.solverSigner}, got ${solverSigner}`, + ); + } +} + +async function persistRFQVaultExecutorAddress(params: { + network: ReceiverDeployNetwork; + address: string; +}): Promise { + const filePath = await writeRFQVaultExecutorAddress( + params.network.name, + params.address, + ); + console.log(` [${params.network.name}] Deployment JSON: ${filePath}`); +} + +async function deployNetwork(params: { + network: ReceiverDeployNetwork; + deployerPrivateKey: string; + owner: string; + solverSigner: string; + initcode: string; + dryRun: boolean; +}): Promise { + const { network, deployerPrivateKey, owner, solverSigner, initcode, dryRun } = + params; + console.log(`--- ${network.name} (chainId=${network.chainId}) ---`); + + try { + const provider = createNetworkProvider(network); + const wallet = new Wallet(deployerPrivateKey, provider); + const create3Factory = new Contract( + CREATE_X_FACTORY, + Create3ABI, + wallet, + ); + const expectedAddress = await computeFinalAddress( + RFQ_VAULT_EXECUTOR_CREATE3_SALT, + create3Factory, + ); + const existingBytecode = await provider.getCode(expectedAddress); + + if (hasContractBytecode(existingBytecode)) { + await assertRFQVaultExecutorDeployment({ + provider, + address: expectedAddress, + owner, + solverSigner, + }); + await persistRFQVaultExecutorAddress({ + network, + address: expectedAddress, + }); + console.log(` [${network.name}] Already deployed: ${expectedAddress}`); + return { ...EMPTY_RESULT, alreadyDeployed: 1 }; + } + + if (dryRun) { + console.log(` [${network.name}] Would deploy to ${expectedAddress}`); + return { ...EMPTY_RESULT, dryRun: 1 }; + } + + const balance = await provider.getBalance(wallet.address); + console.log( + ` [${network.name}] Deploying RFQVaultExecutor to ${expectedAddress} (deployer balance ${formatEther(balance)})`, + ); + const overrides = await getDeploymentTransactionOverrides({ + network, + provider, + }); + const tx = await create3Factory.deployCreate3( + RFQ_VAULT_EXECUTOR_CREATE3_SALT, + initcode, + overrides, + ); + console.log(` [${network.name}] Tx: ${tx.hash}`); + const receipt = await waitForReceiptWithTimeout(tx, 'RFQVaultExecutor'); + const deployedAddress = decodeCreate3DeploymentFromTxReceipt({ + receipt: receipt as Awaited>, + }); + + if ( + !deployedAddress || + deployedAddress.toLowerCase() !== expectedAddress.toLowerCase() + ) { + throw new Error( + `RFQVaultExecutor address mismatch: got ${deployedAddress}, expected ${expectedAddress}`, + ); + } + + await assertRFQVaultExecutorDeployment({ + provider, + address: expectedAddress, + owner, + solverSigner, + }); + await persistRFQVaultExecutorAddress({ + network, + address: expectedAddress, + }); + console.log(` [${network.name}] Deployed`); + return { ...EMPTY_RESULT, deployed: 1 }; + } catch (err) { + console.error( + ` [${network.name}] Failed: ${err instanceof Error ? err.message : String(err)}`, + ); + return { ...EMPTY_RESULT, failed: 1 }; + } +} + +async function main() { + const deployerPrivateKey = resolvePrivateKey(); + const deployer = new Wallet(deployerPrivateKey); + const owner = resolveAddressEnv('OWNER_ADDRESS'); + const solverSigner = resolveAddressEnv('SOLVER_SIGNER_ADDRESS'); + const dryRun = process.env.DRY_RUN?.trim().toLowerCase() === 'true'; + const chainFilter = parseChainFilter(); + const networks = chainFilter + ? RECEIVER_DEPLOY_NETWORKS.filter((n) => + chainFilter.has(n.name.toLowerCase()), + ) + : [...RECEIVER_DEPLOY_NETWORKS]; + + if (networks.length === 0) { + throw new Error('No networks matched CHAINS filter'); + } + + const parallelism = resolveParallelism(networks.length); + const { initcode, initcodeHash } = await loadRFQVaultExecutorInitcode({ + owner, + solverSigner, + }); + + console.log(`Deployer: ${deployer.address}`); + console.log(`Owner: ${owner}`); + console.log(`SolverSigner: ${solverSigner}`); + console.log(`CREATE3 salt: ${RFQ_VAULT_EXECUTOR_CREATE3_SALT_TEXT}`); + console.log(`Initcode hash: ${initcodeHash}`); + console.log(`Dry run: ${dryRun}`); + console.log(`Parallelism: ${parallelism}`); + console.log(`Chains: ${networks.map((n) => n.name).join(', ')}`); + console.log(''); + + const results = await runWithConcurrency( + networks, + parallelism, + (network) => + deployNetwork({ + network, + deployerPrivateKey, + owner, + solverSigner, + initcode, + dryRun, + }), + ); + + const summary = results.reduce( + (acc, result) => ({ + deployed: acc.deployed + result.deployed, + alreadyDeployed: acc.alreadyDeployed + result.alreadyDeployed, + dryRun: acc.dryRun + result.dryRun, + failed: acc.failed + result.failed, + }), + EMPTY_RESULT, + ); + + console.log(''); + console.log( + `Summary: ${summary.deployed} deployed, ${summary.alreadyDeployed} already deployed, ${summary.dryRun} dry-run, ${summary.failed} failed`, + ); + + if (summary.failed > 0) { + process.exit(1); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/scripts/deploy/verifyRFQVaultExecutorBatch.ts b/scripts/deploy/verifyRFQVaultExecutorBatch.ts new file mode 100644 index 0000000..75ba2f0 --- /dev/null +++ b/scripts/deploy/verifyRFQVaultExecutorBatch.ts @@ -0,0 +1,549 @@ +/** + * Verifies deployed RFQVaultExecutor source code on block explorers. + * + * Usage: + * OWNER_ADDRESS=0x... SOLVER_SIGNER_ADDRESS=0x... npm run verify:rfq-vault-executor + * OWNER_ADDRESS=0x... SOLVER_SIGNER_ADDRESS=0x... npm run verify:rfq-vault-executor -- polygon base + */ + +import { mkdirSync, readFileSync, writeFileSync } from 'fs'; +import { join, resolve } from 'path'; +import { spawnSync } from 'child_process'; +import { request } from 'https'; +import { URL } from 'url'; +import { AbiCoder, ZeroAddress, isAddress } from 'ethers'; +import { RECEIVER_DEPLOY_NETWORKS } from './networks'; +import { readRFQVaultExecutorAddress } from './rfqVaultExecutorAddresses'; + +type ExplorerConfig = + | { verifier: 'etherscan'; chainArg: string } + | { verifier: 'custom'; chainArg: string; verifierUrl: string } + | { verifier: 'sourcify'; chainArg: string }; + +interface RFQVaultExecutorDeploymentRecord { + chainId: number; + network: string; + address: string; +} + +const ADDR_HEX_RE = /^0x[a-fA-F0-9]{40}$/; +const CONTRACT_ID = 'src/executors/RFQVaultExecutor.sol:RFQVaultExecutor'; +const ETHERSCAN_V2_HOST = 'api.etherscan.io'; +const ETHERSCAN_V2_IPS = [ + '23.92.68.154', + '23.111.175.138', + '162.252.84.9', + '217.79.240.58', + '217.79.243.34', +]; + +const EXPLORERS_BY_CHAIN_ID = new Map([ + [1, { verifier: 'etherscan', chainArg: '1' }], + [10, { verifier: 'etherscan', chainArg: '10' }], + [56, { verifier: 'etherscan', chainArg: '56' }], + [100, { verifier: 'etherscan', chainArg: '100' }], + [130, { verifier: 'etherscan', chainArg: '130' }], + [137, { verifier: 'etherscan', chainArg: '137' }], + [143, { verifier: 'custom', chainArg: '1', verifierUrl: 'https://api.etherscan.io/v2/api?chainid=143' }], + [146, { verifier: 'etherscan', chainArg: '146' }], + [480, { verifier: 'etherscan', chainArg: '480' }], + [999, { verifier: 'etherscan', chainArg: '999' }], + [1868, { verifier: 'custom', chainArg: '1868', verifierUrl: 'https://soneium.blockscout.com/api' }], + [4326, { verifier: 'custom', chainArg: '1', verifierUrl: 'https://api.etherscan.io/v2/api?chainid=4326' }], + [5000, { verifier: 'custom', chainArg: '1', verifierUrl: 'https://api.etherscan.io/v2/api?chainid=5000' }], + [5042, { verifier: 'sourcify', chainArg: '5042' }], + [8453, { verifier: 'etherscan', chainArg: '8453' }], + [9745, { verifier: 'custom', chainArg: '1', verifierUrl: 'https://api.routescan.io/v2/network/mainnet/evm/9745/etherscan/api' }], + [1329, { verifier: 'custom', chainArg: '1', verifierUrl: 'https://api.etherscan.io/v2/api?chainid=1329' }], + [34443, { verifier: 'custom', chainArg: '34443', verifierUrl: 'https://explorer.mode.network/api' }], + [42161, { verifier: 'etherscan', chainArg: '42161' }], + [43114, { verifier: 'etherscan', chainArg: '43114' }], + [57073, { verifier: 'custom', chainArg: '57073', verifierUrl: 'https://explorer.inkonchain.com/api' }], + [59144, { verifier: 'etherscan', chainArg: '59144' }], + [80094, { verifier: 'etherscan', chainArg: '80094' }], + [81457, { verifier: 'etherscan', chainArg: '81457' }], + [98866, { verifier: 'sourcify', chainArg: '98866' }], + [534352, { verifier: 'custom', chainArg: '534352', verifierUrl: 'https://scrollscan.com/api' }], + [747474, { verifier: 'etherscan', chainArg: '747474' }], +]); + +function isAlreadyVerified(output: string): boolean { + return /already verified|already been verified|source code already verified|exact match already verified|similar match source code/i.test( + output, + ); +} + +function isVerified(output: string): boolean { + return /Contract successfully verified|Pass - Verified|Submitted contract for verification|partially matches the deployed version/i.test( + output, + ); +} + +function rpcEnvName(network: string): string { + return `${network.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase()}_RPC`; +} + +function resolveAddressEnv(name: string): string { + const address = process.env[name]?.trim(); + if (!address) { + throw new Error(`${name} is required`); + } + if (!isAddress(address)) { + throw new Error(`Invalid ${name}: ${address}`); + } + if (address.toLowerCase() === ZeroAddress.toLowerCase()) { + throw new Error(`${name} cannot be zero`); + } + + return address; +} + +function verifierArgs( + config: ExplorerConfig, + apiKey: string, + network: string, +): string[] { + const args = ['--chain', config.chainArg, '--verifier', config.verifier]; + + if (config.verifier === 'sourcify') { + args.push( + '--verifier-url', + process.env.SOURCIFY_SERVER_URL ?? 'https://sourcify.dev/server', + '--skip-is-verified-check', + ); + const rpcUrl = process.env[rpcEnvName(network)] ?? process.env.ETH_RPC_URL; + if (rpcUrl) { + args.push('--rpc-url', rpcUrl); + } + } + + if (config.verifier === 'custom') { + args.push('--verifier-url', config.verifierUrl, '--verifier-api-key', apiKey); + } else if (config.verifier === 'etherscan') { + args.push('--etherscan-api-key', apiKey); + } + + if (config.verifier === 'custom' && config.chainArg === '1') { + args.push('--skip-is-verified-check'); + } + if (config.verifier === 'etherscan') { + args.push('--skip-is-verified-check'); + } + + return args; +} + +function isEtherscanV2Config(config: ExplorerConfig): boolean { + return ( + config.verifier === 'etherscan' || + (config.verifier === 'custom' && + config.verifierUrl.startsWith('https://api.etherscan.io/v2/api')) + ); +} + +function isSourcifyConfig(config: ExplorerConfig): boolean { + return config.verifier === 'sourcify'; +} + +function etherscanV2Url(config: ExplorerConfig): string { + if (config.verifier === 'etherscan') { + return `https://${ETHERSCAN_V2_HOST}/v2/api?chainid=${config.chainArg}`; + } + + if (config.verifier === 'custom') { + return config.verifierUrl; + } + + throw new Error('Sourcify does not use Etherscan v2'); +} + +function loadStandardJsonInput(): string { + const buildInfoDir = resolve(process.cwd(), 'out', 'build-info'); + const buildInfoPath = join(buildInfoDir, '701184e0c43d8ca1.json'); + const buildInfo = JSON.parse(readFileSync(buildInfoPath, 'utf8')) as { + input: { + language: string; + sources: Record; + settings: Record; + }; + }; + + return JSON.stringify({ + language: buildInfo.input.language, + sources: buildInfo.input.sources, + settings: buildInfo.input.settings, + }); +} + +function compilerVersion(): string { + const artifact = JSON.parse( + readFileSync( + resolve( + process.cwd(), + 'out', + 'RFQVaultExecutor.sol', + 'RFQVaultExecutor.json', + ), + 'utf8', + ), + ) as { rawMetadata: string }; + const metadata = JSON.parse(artifact.rawMetadata) as { + compiler: { version: string }; + }; + + return `v${metadata.compiler.version}`; +} + +function postForm(params: { + url: string; + form: URLSearchParams; +}): Promise { + const parsed = new URL(params.url); + const body = params.form.toString(); + let ipIndex = 0; + + return new Promise((resolvePost, rejectPost) => { + const req = request( + { + protocol: parsed.protocol, + hostname: parsed.hostname, + path: `${parsed.pathname}${parsed.search}`, + method: 'POST', + headers: { + 'content-type': 'application/x-www-form-urlencoded', + 'content-length': Buffer.byteLength(body), + }, + lookup: (hostname, options, callback) => { + if (hostname === ETHERSCAN_V2_HOST) { + const ip = ETHERSCAN_V2_IPS[ipIndex % ETHERSCAN_V2_IPS.length]; + ipIndex += 1; + if (typeof options === 'object' && options.all) { + callback( + null, + ETHERSCAN_V2_IPS.map((address) => ({ address, family: 4 })), + ); + return; + } + callback(null, ip, 4); + return; + } + + callback(new Error(`No custom lookup for ${hostname}`), '', 4); + }, + }, + (res) => { + const chunks: Buffer[] = []; + res.on('data', (chunk) => chunks.push(Buffer.from(chunk))); + res.on('end', () => { + resolvePost(Buffer.concat(chunks).toString('utf8')); + }); + }, + ); + + req.on('error', rejectPost); + req.write(body); + req.end(); + }); +} + +function sleep(ms: number): Promise { + return new Promise((resolveSleep) => setTimeout(resolveSleep, ms)); +} + +async function verifyWithEtherscanV2Direct(params: { + config: ExplorerConfig; + apiKey: string; + address: string; + constructorArgs: string; + standardJsonInput: string; + compilerVersion: string; +}): Promise<{ status: number; output: string }> { + const url = etherscanV2Url(params.config); + const constructorArgs = params.constructorArgs.startsWith('0x') + ? params.constructorArgs.slice(2) + : params.constructorArgs; + const submission = new URLSearchParams({ + apikey: params.apiKey, + module: 'contract', + action: 'verifysourcecode', + contractaddress: params.address, + sourceCode: params.standardJsonInput, + codeformat: 'solidity-standard-json-input', + contractname: CONTRACT_ID, + compilerversion: params.compilerVersion, + optimizationUsed: '1', + runs: '2000', + constructorArguements: constructorArgs, + constructorArguments: constructorArgs, + evmversion: 'cancun', + licenseType: '13', + }); + + const submitRaw = await postForm({ url, form: submission }); + let output = `submit: ${submitRaw}\n`; + const submit = JSON.parse(submitRaw) as { + status?: string; + message?: string; + result?: string; + }; + + if (submit.status !== '1') { + return { + status: + isAlreadyVerified(`${submit.message ?? ''} ${submit.result ?? ''}`) + ? 0 + : 1, + output, + }; + } + + const guid = submit.result ?? ''; + for (let attempt = 0; attempt < 30; attempt += 1) { + await sleep(5_000); + const check = new URLSearchParams({ + apikey: params.apiKey, + module: 'contract', + action: 'checkverifystatus', + guid, + }); + const checkRaw = await postForm({ url, form: check }); + output += `check ${attempt + 1}: ${checkRaw}\n`; + const status = JSON.parse(checkRaw) as { + status?: string; + message?: string; + result?: string; + }; + const result = status.result ?? ''; + if (status.status === '1' || isVerified(result) || isAlreadyVerified(result)) { + return { status: 0, output }; + } + if (!/pending|in queue|already verified/i.test(result)) { + return { status: 1, output }; + } + } + + return { status: 1, output: `${output}timed out waiting for verification\n` }; +} + +async function verifyWithSourcifyV2Direct(params: { + chainId: number; + address: string; + standardJsonInput: string; + compilerVersion: string; +}): Promise<{ status: number; output: string }> { + const baseUrl = process.env.SOURCIFY_SERVER_URL ?? 'https://sourcify.dev/server'; + const submitUrl = `${baseUrl.replace(/\/$/, '')}/v2/verify/${params.chainId}/${params.address}`; + const submitResponse = await fetch(submitUrl, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ + stdJsonInput: JSON.parse(params.standardJsonInput), + compilerVersion: params.compilerVersion.replace(/^v/, ''), + contractIdentifier: CONTRACT_ID, + }), + }); + const submitRaw = await submitResponse.text(); + let output = `submit ${submitResponse.status}: ${submitRaw}\n`; + + if (!submitResponse.ok) { + return { status: 1, output }; + } + + const submit = JSON.parse(submitRaw) as { verificationId?: string }; + const verificationId = submit.verificationId; + if (!verificationId) { + return { status: 1, output: `${output}missing verificationId\n` }; + } + + for (let attempt = 0; attempt < 30; attempt += 1) { + await sleep(5_000); + const checkResponse = await fetch( + `${baseUrl.replace(/\/$/, '')}/v2/verify/${verificationId}`, + ); + const checkRaw = await checkResponse.text(); + output += `check ${attempt + 1} ${checkResponse.status}: ${checkRaw}\n`; + if (!checkResponse.ok) { + return { status: 1, output }; + } + + const check = JSON.parse(checkRaw) as { + isJobCompleted?: boolean; + contract?: { + match?: string | null; + creationMatch?: string | null; + runtimeMatch?: string | null; + }; + error?: { message?: string }; + }; + if (!check.isJobCompleted) { + continue; + } + + if ( + check.contract?.match || + check.contract?.creationMatch || + check.contract?.runtimeMatch + ) { + return { status: 0, output }; + } + + return { status: 1, output }; + } + + return { status: 1, output: `${output}timed out waiting for verification\n` }; +} + +async function readDeploymentRecords(): Promise { + const records: RFQVaultExecutorDeploymentRecord[] = []; + const requestedNetworks = new Set(process.argv.slice(2)); + + for (const network of RECEIVER_DEPLOY_NETWORKS) { + if ( + requestedNetworks.size > 0 && + !requestedNetworks.has(network.name) + ) { + continue; + } + + const address = await readRFQVaultExecutorAddress(network.name); + if (!address) { + throw new Error(`Missing RFQVaultExecutor address for ${network.name}`); + } + if (!ADDR_HEX_RE.test(address)) { + throw new Error( + `Invalid RFQVaultExecutor address for ${network.name}: ${address}`, + ); + } + + records.push({ + chainId: network.chainId, + network: network.name, + address, + }); + } + + return records.sort((a, b) => a.network.localeCompare(b.network)); +} + +async function main() { + const owner = resolveAddressEnv('OWNER_ADDRESS'); + const solverSigner = resolveAddressEnv('SOLVER_SIGNER_ADDRESS'); + const constructorArgs = AbiCoder.defaultAbiCoder().encode( + ['address', 'address'], + [owner, solverSigner], + ); + const standardJsonInput = loadStandardJsonInput(); + const solcVersion = compilerVersion(); + const apiKey = process.env.ETHERSCAN_API_KEY ?? ''; + const records = await readDeploymentRecords(); + + if (records.length === 0) { + throw new Error('No RFQVaultExecutor deployment records selected'); + } + + const verifyDir = resolve( + process.cwd(), + 'deployments', + 'verify', + 'rfq-vault-executor', + ); + mkdirSync(verifyDir, { recursive: true }); + + const summaryPath = join( + verifyDir, + `summary-${new Date().toISOString().replace(/[-:]/g, '').replace(/\.\d{3}Z$/, 'Z')}.tsv`, + ); + const rows = ['network\tchainId\tstatus\tverifier\taddress']; + + for (const record of records) { + const explorer = EXPLORERS_BY_CHAIN_ID.get(record.chainId); + if (!explorer) { + rows.push( + `${record.network}\t${record.chainId}\tunsupported\t\t${record.address}`, + ); + continue; + } + if (explorer.verifier !== 'sourcify' && !apiKey) { + throw new Error('ETHERSCAN_API_KEY is required for non-Sourcify verification'); + } + + console.log( + `Verifying ${record.network} (${record.chainId}) via ${explorer.verifier}`, + ); + const result = isEtherscanV2Config(explorer) + ? await verifyWithEtherscanV2Direct({ + config: explorer, + apiKey, + address: record.address, + constructorArgs, + standardJsonInput, + compilerVersion: solcVersion, + }) + : isSourcifyConfig(explorer) + ? await verifyWithSourcifyV2Direct({ + chainId: record.chainId, + address: record.address, + standardJsonInput, + compilerVersion: solcVersion, + }) + : (() => { + const spawned = spawnSync( + 'forge', + [ + 'verify-contract', + ...verifierArgs(explorer, apiKey, record.network), + '--compiler-version', + '0.8.34', + '--num-of-optimizations', + '2000', + '--evm-version', + 'cancun', + '--constructor-args', + constructorArgs, + '--watch', + record.address, + CONTRACT_ID, + ], + { + cwd: process.cwd(), + encoding: 'utf8', + }, + ); + + return { + status: spawned.status ?? 1, + output: `${spawned.stdout ?? ''}${spawned.stderr ?? ''}`, + }; + })(); + + const output = result.output; + writeFileSync(join(verifyDir, `${record.network}.log`), output); + + let status = 'ok'; + if (result.status !== 0) { + status = + isAlreadyVerified(output) || isVerified(output) + ? 'already_verified' + : 'failed'; + } else if (isAlreadyVerified(output)) { + status = 'already_verified'; + } + + rows.push( + `${record.network}\t${record.chainId}\t${status}\t${explorer.verifier}\t${record.address}`, + ); + console.log(`${record.network}: ${status}`); + } + + writeFileSync(summaryPath, `${rows.join('\n')}\n`); + console.log(`Summary: ${summaryPath}`); + + if (rows.some((row) => row.includes('\tfailed\t'))) { + process.exit(1); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/src/executors/RFQVaultExecutor.sol b/src/executors/RFQVaultExecutor.sol index d710438..4a0186f 100644 --- a/src/executors/RFQVaultExecutor.sol +++ b/src/executors/RFQVaultExecutor.sol @@ -17,14 +17,17 @@ contract RFQVaultExecutor is Ownable { } error ActionFailed(uint256 index); - error InvalidQuoteId(); - error InvalidNonce(); - error InvalidSigner(); + error InvalidQuoteId(); // 0x140dcdb5 + error InvalidNonce(); // 0x756688fe + error InvalidSigner(); // 0x815e1d64 error SwapOutputInsufficient(); + error InvalidSolverSigner(); + error InvalidOwner(); uint256 internal constant FULFIL_DISCRIMINATOR = 1; uint256 internal constant REFUND_DISCRIMINATOR = 2; uint256 internal constant SWAP_AND_FULFIL_DISCRIMINATOR = 3; + uint256 internal constant MARK_FOR_REFUND_DISCRIMINATOR = 4; address internal SOLVER_SIGNER; @@ -48,6 +51,8 @@ contract RFQVaultExecutor is Ownable { ); constructor(address _owner, address _solverSigner) Ownable(_owner) { + if (_owner == address(0)) revert InvalidOwner(); + if (_solverSigner == address(0)) revert InvalidSolverSigner(); SOLVER_SIGNER = _solverSigner; } @@ -197,6 +202,7 @@ contract RFQVaultExecutor is Ownable { } function setSolverSigner(address _solverSigner) external onlyOwner { + if (_solverSigner == address(0)) revert InvalidSolverSigner(); SOLVER_SIGNER = _solverSigner; } @@ -205,13 +211,17 @@ contract RFQVaultExecutor is Ownable { } /// @notice Mark a quoteId as used to block any further fulfil for this quote. - /// @dev Permissionless — no financial incentive exists to grief a fulfil. - /// Called by the solver on the destination chain before initiating an - /// origin-chain refund, preventing race conditions where an in-flight - /// fulfil relay lands after the refund is already processed. + /// @dev Called with a solver signature on the destination chain before + /// initiating an origin-chain refund, preventing race conditions where + /// an in-flight fulfil relay lands after the refund is already processed. /// Reverts with InvalidQuoteId if the quoteId was already used. - function markForRefund(bytes32 quoteId) external { - _markQuoteId(quoteId); + function markForRefund( + bytes32 quoteId, + uint256 nonce, + bytes calldata signature + ) external { + bytes32 messageHash = _hashMarkForRefund(quoteId, nonce); + _verifyAndMarkQuoteId(messageHash, signature, quoteId); isMarkedForRefund[quoteId] = 1; } @@ -283,6 +293,22 @@ contract RFQVaultExecutor is Ownable { } } + /// @dev Fixed-size mark-for-refund hash without abi.encode overhead. + function _hashMarkForRefund( + bytes32 quoteId, + uint256 nonce + ) internal view returns (bytes32 hash) { + assembly { + let ptr := mload(0x40) + mstore(ptr, chainid()) + mstore(add(ptr, 0x20), address()) + mstore(add(ptr, 0x40), MARK_FOR_REFUND_DISCRIMINATOR) + mstore(add(ptr, 0x60), quoteId) + mstore(add(ptr, 0x80), nonce) + hash := keccak256(ptr, 0xa0) + } + } + function _verifyAndMarkQuoteId( bytes32 messageHash, bytes calldata signature, diff --git a/test/unit/RFQVaultExecutor.t.sol b/test/unit/RFQVaultExecutor.t.sol index 6984f96..696d62b 100644 --- a/test/unit/RFQVaultExecutor.t.sol +++ b/test/unit/RFQVaultExecutor.t.sol @@ -12,6 +12,7 @@ contract RFQVaultExecutorTest is Test { uint256 internal constant FULFIL_DISCRIMINATOR = 1; uint256 internal constant REFUND_DISCRIMINATOR = 2; uint256 internal constant SWAP_AND_FULFIL_DISCRIMINATOR = 3; + uint256 internal constant MARK_FOR_REFUND_DISCRIMINATOR = 4; address internal constant NATIVE_TOKEN = CurrencyLib.NATIVE_TOKEN_ADDRESS; address internal constant OWNER = address(0x2222); @@ -425,6 +426,80 @@ contract RFQVaultExecutorTest is Test { vault.refund(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER, signature); } + function test_markForRefund_marksQuoteId() public { + bytes memory signature = _signMarkForRefund(QUOTE_ID, NONCE); + + vault.markForRefund(QUOTE_ID, NONCE, signature); + + assertEq(vault.quoteIdUsed(QUOTE_ID), 1); + assertEq(vault.isMarkedForRefund(QUOTE_ID), 1); + } + + function test_markForRefund_blocksFulfilRefundAndSwapAndFulfil() public { + bytes memory markSignature = _signMarkForRefund(QUOTE_ID, NONCE); + vault.markForRefund(QUOTE_ID, NONCE, markSignature); + + token.mint(address(vault), AMOUNT * 2); + outputToken.mint(address(swapTarget), SWAP_OUTPUT); + + bytes memory fulfilSig = _signFulfil(QUOTE_ID, NONCE + 1, address(token), AMOUNT, RECEIVER); + vm.expectRevert(RFQVaultExecutor.InvalidQuoteId.selector); + vault.fulfil(QUOTE_ID, NONCE + 1, address(token), AMOUNT, RECEIVER, fulfilSig); + + bytes memory refundSig = _signRefund(QUOTE_ID, NONCE + 2, address(token), AMOUNT, RECEIVER); + vm.expectRevert(RFQVaultExecutor.InvalidQuoteId.selector); + vault.refund(QUOTE_ID, NONCE + 2, address(token), AMOUNT, RECEIVER, refundSig); + + RFQVaultExecutor.Action memory swapAction = RFQVaultExecutor.Action({ + target: address(swapTarget), + value: 0, + data: abi.encodeCall( + MockSwap.swapToVault, + (address(token), address(outputToken), AMOUNT, SWAP_OUTPUT, address(vault)) + ) + }); + + bytes memory swapSig = _signSwapAndFulfil( + QUOTE_ID, + NONCE + 3, + address(token), + address(swapTarget), + AMOUNT, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER + ); + + vm.expectRevert(RFQVaultExecutor.InvalidQuoteId.selector); + vault.swapAndFulfil( + QUOTE_ID, + NONCE + 3, + address(token), + address(swapTarget), + AMOUNT, + address(outputToken), + SWAP_OUTPUT, + swapAction, + RECEIVER, + swapSig + ); + } + + function test_markForRefund_revertsIfInvalidSigner() public { + bytes memory signature = _signMarkForRefundWithKey(0xBEEF, QUOTE_ID, NONCE); + + vm.expectRevert(RFQVaultExecutor.InvalidSigner.selector); + vault.markForRefund(QUOTE_ID, NONCE, signature); + } + + function test_markForRefund_revertsIfSignatureIsForRefund() public { + bytes memory signature = _signRefund(QUOTE_ID, NONCE, address(token), AMOUNT, RECEIVER); + + vm.expectRevert(RFQVaultExecutor.InvalidSigner.selector); + vault.markForRefund(QUOTE_ID, NONCE, signature); + } + function test_performActions_executesAction() public { RFQVaultExecutor.Action[] memory actions = new RFQVaultExecutor.Action[](1); actions[0] = RFQVaultExecutor.Action({ @@ -628,6 +703,19 @@ contract RFQVaultExecutorTest is Test { return _signMessage(privateKey, messageHash); } + function _signMarkForRefund(bytes32 quoteId, uint256 nonce) internal view returns (bytes memory) { + return _signMarkForRefundWithKey(SOLVER_PRIVATE_KEY, quoteId, nonce); + } + + function _signMarkForRefundWithKey( + uint256 privateKey, + bytes32 quoteId, + uint256 nonce + ) internal view returns (bytes memory) { + bytes32 messageHash = _hashMarkForRefund(quoteId, nonce); + return _signMessage(privateKey, messageHash); + } + function _signMessage(uint256 privateKey, bytes32 messageHash) internal pure returns (bytes memory) { bytes32 ethSigned = AuthenticationLib.getEthSignedMessageHash(messageHash); (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, ethSigned); @@ -717,6 +805,23 @@ contract RFQVaultExecutorTest is Test { mstore(0x40, add(ptr, 0x1c0)) } } + + function _hashMarkForRefund( + bytes32 quoteId, + uint256 nonce + ) internal view returns (bytes32 hash) { + address vaultAddress = address(vault); + assembly { + let ptr := mload(0x40) + mstore(ptr, chainid()) + mstore(add(ptr, 0x20), vaultAddress) + mstore(add(ptr, 0x40), MARK_FOR_REFUND_DISCRIMINATOR) + mstore(add(ptr, 0x60), quoteId) + mstore(add(ptr, 0x80), nonce) + hash := keccak256(ptr, 0xa0) + mstore(0x40, add(ptr, 0xa0)) + } + } } contract MockERC20 is ERC20 { From a0e6e997ab3152d53c07b7b896d3db56962f0f3f Mon Sep 17 00:00:00 2001 From: arthcp Date: Mon, 22 Jun 2026 13:18:29 +0400 Subject: [PATCH 09/11] feat: deployments --- deployments/prod/addresses/arbitrum.json | 4 + deployments/prod/addresses/arc.json | 3 + deployments/prod/addresses/avalanche.json | 4 + deployments/prod/addresses/base.json | 4 + deployments/prod/addresses/berachain.json | 3 + deployments/prod/addresses/blast.json | 3 + deployments/prod/addresses/bsc.json | 4 + deployments/prod/addresses/ethereum.json | 4 + deployments/prod/addresses/gnosis.json | 3 + deployments/prod/addresses/hyperEvm.json | 3 + deployments/prod/addresses/ink.json | 3 + deployments/prod/addresses/katana.json | 3 + deployments/prod/addresses/linea.json | 4 + deployments/prod/addresses/mantle.json | 3 + deployments/prod/addresses/megaeth.json | 3 + deployments/prod/addresses/mode.json | 3 + deployments/prod/addresses/monad.json | 3 + deployments/prod/addresses/optimism.json | 4 + deployments/prod/addresses/plasma.json | 3 + deployments/prod/addresses/plume.json | 3 + deployments/prod/addresses/polygon.json | 4 + deployments/prod/addresses/scroll.json | 3 + deployments/prod/addresses/sei.json | 3 + deployments/prod/addresses/soneium.json | 3 + deployments/prod/addresses/sonic.json | 3 + deployments/prod/addresses/unichain.json | 3 + deployments/prod/addresses/worldchain.json | 3 + package-lock.json | 41 - yarn.lock | 2779 +++++++++++++++++--- 29 files changed, 2458 insertions(+), 451 deletions(-) create mode 100644 deployments/prod/addresses/arbitrum.json create mode 100644 deployments/prod/addresses/arc.json create mode 100644 deployments/prod/addresses/avalanche.json create mode 100644 deployments/prod/addresses/base.json create mode 100644 deployments/prod/addresses/berachain.json create mode 100644 deployments/prod/addresses/blast.json create mode 100644 deployments/prod/addresses/bsc.json create mode 100644 deployments/prod/addresses/ethereum.json create mode 100644 deployments/prod/addresses/gnosis.json create mode 100644 deployments/prod/addresses/hyperEvm.json create mode 100644 deployments/prod/addresses/ink.json create mode 100644 deployments/prod/addresses/katana.json create mode 100644 deployments/prod/addresses/linea.json create mode 100644 deployments/prod/addresses/mantle.json create mode 100644 deployments/prod/addresses/megaeth.json create mode 100644 deployments/prod/addresses/mode.json create mode 100644 deployments/prod/addresses/monad.json create mode 100644 deployments/prod/addresses/optimism.json create mode 100644 deployments/prod/addresses/plasma.json create mode 100644 deployments/prod/addresses/plume.json create mode 100644 deployments/prod/addresses/polygon.json create mode 100644 deployments/prod/addresses/scroll.json create mode 100644 deployments/prod/addresses/sei.json create mode 100644 deployments/prod/addresses/soneium.json create mode 100644 deployments/prod/addresses/sonic.json create mode 100644 deployments/prod/addresses/unichain.json create mode 100644 deployments/prod/addresses/worldchain.json diff --git a/deployments/prod/addresses/arbitrum.json b/deployments/prod/addresses/arbitrum.json new file mode 100644 index 0000000..78ce567 --- /dev/null +++ b/deployments/prod/addresses/arbitrum.json @@ -0,0 +1,4 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" +} diff --git a/deployments/prod/addresses/arc.json b/deployments/prod/addresses/arc.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/arc.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/avalanche.json b/deployments/prod/addresses/avalanche.json new file mode 100644 index 0000000..78ce567 --- /dev/null +++ b/deployments/prod/addresses/avalanche.json @@ -0,0 +1,4 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" +} diff --git a/deployments/prod/addresses/base.json b/deployments/prod/addresses/base.json new file mode 100644 index 0000000..78ce567 --- /dev/null +++ b/deployments/prod/addresses/base.json @@ -0,0 +1,4 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" +} diff --git a/deployments/prod/addresses/berachain.json b/deployments/prod/addresses/berachain.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/berachain.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/blast.json b/deployments/prod/addresses/blast.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/blast.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/bsc.json b/deployments/prod/addresses/bsc.json new file mode 100644 index 0000000..78ce567 --- /dev/null +++ b/deployments/prod/addresses/bsc.json @@ -0,0 +1,4 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" +} diff --git a/deployments/prod/addresses/ethereum.json b/deployments/prod/addresses/ethereum.json new file mode 100644 index 0000000..78ce567 --- /dev/null +++ b/deployments/prod/addresses/ethereum.json @@ -0,0 +1,4 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" +} diff --git a/deployments/prod/addresses/gnosis.json b/deployments/prod/addresses/gnosis.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/gnosis.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/hyperEvm.json b/deployments/prod/addresses/hyperEvm.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/hyperEvm.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/ink.json b/deployments/prod/addresses/ink.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/ink.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/katana.json b/deployments/prod/addresses/katana.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/katana.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/linea.json b/deployments/prod/addresses/linea.json new file mode 100644 index 0000000..78ce567 --- /dev/null +++ b/deployments/prod/addresses/linea.json @@ -0,0 +1,4 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" +} diff --git a/deployments/prod/addresses/mantle.json b/deployments/prod/addresses/mantle.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/mantle.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/megaeth.json b/deployments/prod/addresses/megaeth.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/megaeth.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/mode.json b/deployments/prod/addresses/mode.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/mode.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/monad.json b/deployments/prod/addresses/monad.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/monad.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/optimism.json b/deployments/prod/addresses/optimism.json new file mode 100644 index 0000000..78ce567 --- /dev/null +++ b/deployments/prod/addresses/optimism.json @@ -0,0 +1,4 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" +} diff --git a/deployments/prod/addresses/plasma.json b/deployments/prod/addresses/plasma.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/plasma.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/plume.json b/deployments/prod/addresses/plume.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/plume.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/polygon.json b/deployments/prod/addresses/polygon.json new file mode 100644 index 0000000..78ce567 --- /dev/null +++ b/deployments/prod/addresses/polygon.json @@ -0,0 +1,4 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" +} diff --git a/deployments/prod/addresses/scroll.json b/deployments/prod/addresses/scroll.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/scroll.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/sei.json b/deployments/prod/addresses/sei.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/sei.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/soneium.json b/deployments/prod/addresses/soneium.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/soneium.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/sonic.json b/deployments/prod/addresses/sonic.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/sonic.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/unichain.json b/deployments/prod/addresses/unichain.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/unichain.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/deployments/prod/addresses/worldchain.json b/deployments/prod/addresses/worldchain.json new file mode 100644 index 0000000..21878b9 --- /dev/null +++ b/deployments/prod/addresses/worldchain.json @@ -0,0 +1,3 @@ +{ + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" +} diff --git a/package-lock.json b/package-lock.json index 53d4d7a..dc009a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2028,18 +2028,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "license": "BSD-3-Clause OR MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.4.2" - } - }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -7018,20 +7006,6 @@ "node": ">= 4.0.0" } }, - "node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -7754,21 +7728,6 @@ "node": ">=8" } }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/undici": { "version": "5.29.0", "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", diff --git a/yarn.lock b/yarn.lock index 7ffd61c..6cd86ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,12 +4,12 @@ "@adraffy/ens-normalize@1.10.1": version "1.10.1" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069" + resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz" integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== "@arbitrum/sdk@^4.0.5": version "4.0.5" - resolved "https://registry.yarnpkg.com/@arbitrum/sdk/-/sdk-4.0.5.tgz#c7abf6fcec72b36faee7af704245a7e14c49ad7f" + resolved "https://registry.npmjs.org/@arbitrum/sdk/-/sdk-4.0.5.tgz" integrity sha512-bADi4kVzSBUAV+GkxuKMx7zrkCVahIE4+fkBi0Ee18EPqGt1Wiub+yQCGTh+llApn1RpRtwwtYeZXhz9XelqGQ== dependencies: "@ethersproject/address" "^5.0.8" @@ -20,27 +20,41 @@ "@cspotcode/source-map-support@^0.8.0": version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + "@ethereumjs/rlp@^5.0.2": version "5.0.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-5.0.2.tgz#c89bd82f2f3bec248ab2d517ae25f5bbc4aac842" + resolved "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz" integrity sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA== +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + "@ethereumjs/util@^9.1.0": version "9.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-9.1.0.tgz#75e3898a3116d21c135fa9e29886565609129bce" + resolved "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz" integrity sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog== dependencies: "@ethereumjs/rlp" "^5.0.2" ethereum-cryptography "^2.2.1" -"@ethersproject/abi@5.8.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.8.0": +"@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.8.0", "@ethersproject/abi@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.8.0.tgz#e79bb51940ac35fe6f3262d7fe2cdb25ad5f07d9" + resolved "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz" integrity sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q== dependencies: "@ethersproject/address" "^5.8.0" @@ -53,9 +67,9 @@ "@ethersproject/properties" "^5.8.0" "@ethersproject/strings" "^5.8.0" -"@ethersproject/abstract-provider@5.8.0", "@ethersproject/abstract-provider@^5.8.0": +"@ethersproject/abstract-provider@^5.8.0", "@ethersproject/abstract-provider@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz#7581f9be601afa1d02b95d26b9d9840926a35b0c" + resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz" integrity sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg== dependencies: "@ethersproject/bignumber" "^5.8.0" @@ -66,9 +80,9 @@ "@ethersproject/transactions" "^5.8.0" "@ethersproject/web" "^5.8.0" -"@ethersproject/abstract-signer@5.8.0", "@ethersproject/abstract-signer@^5.8.0": +"@ethersproject/abstract-signer@^5.8.0", "@ethersproject/abstract-signer@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz#8d7417e95e4094c1797a9762e6789c7356db0754" + resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz" integrity sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA== dependencies: "@ethersproject/abstract-provider" "^5.8.0" @@ -77,9 +91,9 @@ "@ethersproject/logger" "^5.8.0" "@ethersproject/properties" "^5.8.0" -"@ethersproject/address@5.8.0", "@ethersproject/address@^5.0.8", "@ethersproject/address@^5.8.0": +"@ethersproject/address@^5.0.2", "@ethersproject/address@^5.0.8", "@ethersproject/address@^5.8.0", "@ethersproject/address@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.8.0.tgz#3007a2c352eee566ad745dca1dbbebdb50a6a983" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz" integrity sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA== dependencies: "@ethersproject/bignumber" "^5.8.0" @@ -88,47 +102,58 @@ "@ethersproject/logger" "^5.8.0" "@ethersproject/rlp" "^5.8.0" -"@ethersproject/base64@5.8.0", "@ethersproject/base64@^5.8.0": +"@ethersproject/address@5.6.1": + version "5.6.1" + resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz" + integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + +"@ethersproject/base64@^5.8.0", "@ethersproject/base64@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.8.0.tgz#61c669c648f6e6aad002c228465d52ac93ee83eb" + resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz" integrity sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ== dependencies: "@ethersproject/bytes" "^5.8.0" -"@ethersproject/basex@5.8.0", "@ethersproject/basex@^5.8.0": +"@ethersproject/basex@^5.8.0", "@ethersproject/basex@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.8.0.tgz#1d279a90c4be84d1c1139114a1f844869e57d03a" + resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz" integrity sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q== dependencies: "@ethersproject/bytes" "^5.8.0" "@ethersproject/properties" "^5.8.0" -"@ethersproject/bignumber@5.8.0", "@ethersproject/bignumber@^5.1.1", "@ethersproject/bignumber@^5.8.0": +"@ethersproject/bignumber@^5.1.1", "@ethersproject/bignumber@^5.6.2", "@ethersproject/bignumber@^5.8.0", "@ethersproject/bignumber@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.8.0.tgz#c381d178f9eeb370923d389284efa19f69efa5d7" + resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz" integrity sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA== dependencies: "@ethersproject/bytes" "^5.8.0" "@ethersproject/logger" "^5.8.0" bn.js "^5.2.1" -"@ethersproject/bytes@5.8.0", "@ethersproject/bytes@^5.0.8", "@ethersproject/bytes@^5.8.0": +"@ethersproject/bytes@^5.0.8", "@ethersproject/bytes@^5.6.1", "@ethersproject/bytes@^5.8.0", "@ethersproject/bytes@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.8.0.tgz#9074820e1cac7507a34372cadeb035461463be34" + resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz" integrity sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A== dependencies: "@ethersproject/logger" "^5.8.0" -"@ethersproject/constants@5.8.0", "@ethersproject/constants@^5.8.0": +"@ethersproject/constants@^5.8.0", "@ethersproject/constants@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.8.0.tgz#12f31c2f4317b113a4c19de94e50933648c90704" + resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz" integrity sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg== dependencies: "@ethersproject/bignumber" "^5.8.0" "@ethersproject/contracts@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.8.0.tgz#243a38a2e4aa3e757215ea64e276f8a8c9d8ed73" + resolved "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz" integrity sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ== dependencies: "@ethersproject/abi" "^5.8.0" @@ -142,9 +167,9 @@ "@ethersproject/properties" "^5.8.0" "@ethersproject/transactions" "^5.8.0" -"@ethersproject/hash@5.8.0", "@ethersproject/hash@^5.8.0": +"@ethersproject/hash@^5.8.0", "@ethersproject/hash@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.8.0.tgz#b8893d4629b7f8462a90102572f8cd65a0192b4c" + resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz" integrity sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA== dependencies: "@ethersproject/abstract-signer" "^5.8.0" @@ -157,9 +182,9 @@ "@ethersproject/properties" "^5.8.0" "@ethersproject/strings" "^5.8.0" -"@ethersproject/hdnode@5.8.0", "@ethersproject/hdnode@^5.8.0": +"@ethersproject/hdnode@^5.8.0", "@ethersproject/hdnode@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.8.0.tgz#a51ae2a50bcd48ef6fd108c64cbae5e6ff34a761" + resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz" integrity sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA== dependencies: "@ethersproject/abstract-signer" "^5.8.0" @@ -175,9 +200,9 @@ "@ethersproject/transactions" "^5.8.0" "@ethersproject/wordlists" "^5.8.0" -"@ethersproject/json-wallets@5.8.0", "@ethersproject/json-wallets@^5.8.0": +"@ethersproject/json-wallets@^5.8.0", "@ethersproject/json-wallets@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz#d18de0a4cf0f185f232eb3c17d5e0744d97eb8c9" + resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz" integrity sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w== dependencies: "@ethersproject/abstract-signer" "^5.8.0" @@ -194,44 +219,44 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.8.0", "@ethersproject/keccak256@^5.8.0": +"@ethersproject/keccak256@^5.6.1", "@ethersproject/keccak256@^5.8.0", "@ethersproject/keccak256@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.8.0.tgz#d2123a379567faf2d75d2aaea074ffd4df349e6a" + resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz" integrity sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng== dependencies: "@ethersproject/bytes" "^5.8.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.8.0", "@ethersproject/logger@^5.8.0": +"@ethersproject/logger@^5.6.0", "@ethersproject/logger@^5.8.0", "@ethersproject/logger@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.8.0.tgz#f0232968a4f87d29623a0481690a2732662713d6" + resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz" integrity sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA== -"@ethersproject/networks@5.8.0", "@ethersproject/networks@^5.8.0": +"@ethersproject/networks@^5.8.0", "@ethersproject/networks@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.8.0.tgz#8b4517a3139380cba9fb00b63ffad0a979671fde" + resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz" integrity sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg== dependencies: "@ethersproject/logger" "^5.8.0" -"@ethersproject/pbkdf2@5.8.0", "@ethersproject/pbkdf2@^5.8.0": +"@ethersproject/pbkdf2@^5.8.0", "@ethersproject/pbkdf2@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz#cd2621130e5dd51f6a0172e63a6e4a0c0a0ec37e" + resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz" integrity sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg== dependencies: "@ethersproject/bytes" "^5.8.0" "@ethersproject/sha2" "^5.8.0" -"@ethersproject/properties@5.8.0", "@ethersproject/properties@^5.8.0": +"@ethersproject/properties@^5.8.0", "@ethersproject/properties@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.8.0.tgz#405a8affb6311a49a91dabd96aeeae24f477020e" + resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz" integrity sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw== dependencies: "@ethersproject/logger" "^5.8.0" "@ethersproject/providers@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.8.0.tgz#6c2ae354f7f96ee150439f7de06236928bc04cb4" + resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz" integrity sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw== dependencies: "@ethersproject/abstract-provider" "^5.8.0" @@ -255,34 +280,34 @@ bech32 "1.1.4" ws "8.18.0" -"@ethersproject/random@5.8.0", "@ethersproject/random@^5.8.0": +"@ethersproject/random@^5.8.0", "@ethersproject/random@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.8.0.tgz#1bced04d49449f37c6437c701735a1a022f0057a" + resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz" integrity sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A== dependencies: "@ethersproject/bytes" "^5.8.0" "@ethersproject/logger" "^5.8.0" -"@ethersproject/rlp@5.8.0", "@ethersproject/rlp@^5.8.0": +"@ethersproject/rlp@^5.6.1", "@ethersproject/rlp@^5.8.0", "@ethersproject/rlp@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.8.0.tgz#5a0d49f61bc53e051532a5179472779141451de5" + resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz" integrity sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q== dependencies: "@ethersproject/bytes" "^5.8.0" "@ethersproject/logger" "^5.8.0" -"@ethersproject/sha2@5.8.0", "@ethersproject/sha2@^5.8.0": +"@ethersproject/sha2@^5.8.0", "@ethersproject/sha2@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.8.0.tgz#8954a613bb78dac9b46829c0a95de561ef74e5e1" + resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz" integrity sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A== dependencies: "@ethersproject/bytes" "^5.8.0" "@ethersproject/logger" "^5.8.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.8.0", "@ethersproject/signing-key@^5.8.0": +"@ethersproject/signing-key@^5.8.0", "@ethersproject/signing-key@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.8.0.tgz#9797e02c717b68239c6349394ea85febf8893119" + resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz" integrity sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -292,9 +317,9 @@ elliptic "6.6.1" hash.js "1.1.7" -"@ethersproject/solidity@5.8.0", "@ethersproject/solidity@^5.8.0": +"@ethersproject/solidity@^5.8.0", "@ethersproject/solidity@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.8.0.tgz#429bb9fcf5521307a9448d7358c26b93695379b9" + resolved "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz" integrity sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA== dependencies: "@ethersproject/bignumber" "^5.8.0" @@ -304,18 +329,18 @@ "@ethersproject/sha2" "^5.8.0" "@ethersproject/strings" "^5.8.0" -"@ethersproject/strings@5.8.0", "@ethersproject/strings@^5.8.0": +"@ethersproject/strings@^5.8.0", "@ethersproject/strings@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.8.0.tgz#ad79fafbf0bd272d9765603215ac74fd7953908f" + resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz" integrity sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg== dependencies: "@ethersproject/bytes" "^5.8.0" "@ethersproject/constants" "^5.8.0" "@ethersproject/logger" "^5.8.0" -"@ethersproject/transactions@5.8.0", "@ethersproject/transactions@^5.8.0": +"@ethersproject/transactions@^5.8.0", "@ethersproject/transactions@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.8.0.tgz#1e518822403abc99def5a043d1c6f6fe0007e46b" + resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz" integrity sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg== dependencies: "@ethersproject/address" "^5.8.0" @@ -330,7 +355,7 @@ "@ethersproject/units@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.8.0.tgz#c12f34ba7c3a2de0e9fa0ed0ee32f3e46c5c2c6a" + resolved "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz" integrity sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ== dependencies: "@ethersproject/bignumber" "^5.8.0" @@ -339,7 +364,7 @@ "@ethersproject/wallet@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.8.0.tgz#49c300d10872e6986d953e8310dc33d440da8127" + resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz" integrity sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA== dependencies: "@ethersproject/abstract-provider" "^5.8.0" @@ -358,9 +383,9 @@ "@ethersproject/transactions" "^5.8.0" "@ethersproject/wordlists" "^5.8.0" -"@ethersproject/web@5.8.0", "@ethersproject/web@^5.8.0": +"@ethersproject/web@^5.8.0", "@ethersproject/web@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.8.0.tgz#3e54badc0013b7a801463a7008a87988efce8a37" + resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz" integrity sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw== dependencies: "@ethersproject/base64" "^5.8.0" @@ -369,9 +394,9 @@ "@ethersproject/properties" "^5.8.0" "@ethersproject/strings" "^5.8.0" -"@ethersproject/wordlists@5.8.0", "@ethersproject/wordlists@^5.8.0": +"@ethersproject/wordlists@^5.8.0", "@ethersproject/wordlists@5.8.0": version "5.8.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.8.0.tgz#7a5654ee8d1bb1f4dbe43f91d217356d650ad821" + resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz" integrity sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg== dependencies: "@ethersproject/bytes" "^5.8.0" @@ -382,22 +407,22 @@ "@fastify/busboy@^2.0.0": version "2.1.1" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" + resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz" integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== "@jridgewell/resolve-uri@^3.0.3": version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/sourcemap-codec@^1.4.10": version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" @@ -405,7 +430,7 @@ "@layerzerolabs/lz-v2-utilities@^3.0.168": version "3.0.168" - resolved "https://registry.yarnpkg.com/@layerzerolabs/lz-v2-utilities/-/lz-v2-utilities-3.0.168.tgz#a7b62a1422f978151ca0f3fc77e3ab511f9e6eb3" + resolved "https://registry.npmjs.org/@layerzerolabs/lz-v2-utilities/-/lz-v2-utilities-3.0.168.tgz" integrity sha512-5gb5QH3q+JIOkwuJnmv3hWidwLE7ySC0G4IYCL9pwl80bkdkuY9TwfG3KqWri2F5mCzRYs6xx7vaYP5zFqY7yA== dependencies: "@ethersproject/abi" "^5.8.0" @@ -417,95 +442,123 @@ bs58 "^5.0.0" tiny-invariant "^1.3.1" +"@noble/curves@~1.4.0": + version "1.4.2" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz" + integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/curves@~1.8.1": + version "1.8.2" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz" + integrity sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g== + dependencies: + "@noble/hashes" "1.7.2" + "@noble/curves@1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz" integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== dependencies: "@noble/hashes" "1.3.2" -"@noble/curves@1.4.2", "@noble/curves@~1.4.0": +"@noble/curves@1.4.2": version "1.4.2" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz" integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== dependencies: "@noble/hashes" "1.4.0" -"@noble/curves@~1.8.1": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.8.2.tgz#8f24c037795e22b90ae29e222a856294c1d9ffc7" - integrity sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g== - dependencies: - "@noble/hashes" "1.7.2" +"@noble/hashes@^1.4.0": + version "1.8.0" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz" + integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== -"@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": +"@noble/hashes@~1.2.0", "@noble/hashes@1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== -"@noble/hashes@1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" - integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== - -"@noble/hashes@1.4.0", "@noble/hashes@~1.4.0": +"@noble/hashes@~1.4.0", "@noble/hashes@1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== -"@noble/hashes@1.7.2", "@noble/hashes@~1.7.1": +"@noble/hashes@~1.7.1", "@noble/hashes@1.7.2": version "1.7.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.7.2.tgz#d53c65a21658fb02f3303e7ee3ba89d6754c64b4" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz" integrity sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ== -"@noble/secp256k1@1.7.1": +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@noble/secp256k1@~1.7.0", "@noble/secp256k1@1.7.1": version "1.7.1" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" + resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz" integrity sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== -"@noble/secp256k1@~1.7.0": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.2.tgz#c2c3343e2dce80e15a914d7442147507f8a98e7f" - integrity sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" "@nomicfoundation/edr-darwin-arm64@0.12.0-next.23": version "0.12.0-next.23" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.23.tgz#b1587edd46476d271b3dd54c024054a964fa9f66" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.12.0-next.23.tgz" integrity sha512-Amh7mRoDzZyJJ4efqoePqdoZOzharmSOttZuJDlVE5yy07BoE8hL6ZRpa5fNYn0LCqn/KoWs8OHANWxhKDGhvQ== "@nomicfoundation/edr-darwin-x64@0.12.0-next.23": version "0.12.0-next.23" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.23.tgz#6b61903e93eb40716ea3ed7c4f24f793e6566591" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.12.0-next.23.tgz" integrity sha512-9wn489FIQm7m0UCD+HhktjWx6vskZzeZD9oDc2k9ZvbBzdXwPp5tiDqUBJ+eQpByAzCDfteAJwRn2lQCE0U+Iw== "@nomicfoundation/edr-linux-arm64-gnu@0.12.0-next.23": version "0.12.0-next.23" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.23.tgz#0c141a621c9dbe6b0dc414da5913b1f94833676e" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.12.0-next.23.tgz" integrity sha512-nlk5EejSzEUfEngv0Jkhqq3/wINIfF2ED9wAofc22w/V1DV99ASh9l3/e/MIHOQFecIZ9MDqt0Em9/oDyB1Uew== "@nomicfoundation/edr-linux-arm64-musl@0.12.0-next.23": version "0.12.0-next.23" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.23.tgz#bd996171aa0f90eb722984436449fd2ddb4de065" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.12.0-next.23.tgz" integrity sha512-SJuPBp3Rc6vM92UtVTUxZQ/QlLhLfwTftt2XUiYohmGKB3RjGzpgduEFMCA0LEnucUckU6UHrJNFHiDm77C4PQ== "@nomicfoundation/edr-linux-x64-gnu@0.12.0-next.23": version "0.12.0-next.23" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.23.tgz#fb411c5b5efeb96d0d859bb34ff0f466201c3f5d" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.12.0-next.23.tgz" integrity sha512-NU+Qs3u7Qt6t3bJFdmmjd5CsvgI2bPPzO31KifM2Ez96/jsXYho5debtTQnimlb5NAqiHTSlxjh/F8ROcptmeQ== "@nomicfoundation/edr-linux-x64-musl@0.12.0-next.23": version "0.12.0-next.23" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.23.tgz#18685a6489167d1386db8d31823ce7d92fd789b5" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.12.0-next.23.tgz" integrity sha512-F78fZA2h6/ssiCSZOovlgIu0dUeI7ItKPsDDF3UUlIibef052GCXmliMinC90jVPbrjUADMd1BUwjfI0Z8OllQ== "@nomicfoundation/edr-win32-x64-msvc@0.12.0-next.23": version "0.12.0-next.23" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.23.tgz#20cc6fcdb22500df1e48fab0a397bc30a22ec37f" + resolved "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.12.0-next.23.tgz" integrity sha512-IfJZQJn7d/YyqhmguBIGoCKjE9dKjbu6V6iNEPApfwf5JyyjHYyyfkLU4rf7hygj57bfH4sl1jtQ6r8HnT62lw== "@nomicfoundation/edr@0.12.0-next.23": version "0.12.0-next.23" - resolved "https://registry.yarnpkg.com/@nomicfoundation/edr/-/edr-0.12.0-next.23.tgz#483b29bed5165bf6f97b9be01f1536d0f1e1845a" + resolved "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.12.0-next.23.tgz" integrity sha512-F2/6HZh8Q9RsgkOIkRrckldbhPjIZY7d4mT9LYuW68miwGQ5l7CkAgcz9fRRiurA0+YJhtsbx/EyrD9DmX9BOw== dependencies: "@nomicfoundation/edr-darwin-arm64" "0.12.0-next.23" @@ -516,56 +569,134 @@ "@nomicfoundation/edr-linux-x64-musl" "0.12.0-next.23" "@nomicfoundation/edr-win32-x64-msvc" "0.12.0-next.23" +"@nomicfoundation/hardhat-chai-matchers@^2.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.1.2.tgz" + integrity sha512-NlUlde/ycXw2bLzA2gWjjbxQaD9xIRbAF30nsoEprAWzH8dXEI1ILZUKZMyux9n9iygEXTzN0SDVjE6zWDZi9g== + dependencies: + "@types/chai-as-promised" "^7.1.3" + chai-as-promised "^7.1.1" + deep-eql "^4.0.1" + ordinal "^1.0.3" + +"@nomicfoundation/hardhat-ethers@^3.0.0", "@nomicfoundation/hardhat-ethers@^3.1.0": + version "3.1.3" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.1.3.tgz" + integrity sha512-208JcDeVIl+7Wu3MhFUUtiA8TJ7r2Rn3Wr+lSx9PfsDTKkbsAsWPY6N6wQ4mtzDv0/pB9nIbJhkjoHe1EsgNsA== + dependencies: + debug "^4.1.1" + lodash.isequal "^4.5.0" + "@nomicfoundation/hardhat-foundry@^1.1.2": version "1.2.1" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-foundry/-/hardhat-foundry-1.2.1.tgz#2d0b8bd8d2815a4217d05381520520a6b74c2d3c" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-foundry/-/hardhat-foundry-1.2.1.tgz" integrity sha512-pH1KeyI0sysgi7I7uQKPLXWl895EkuS6V41rSi820Ipqp/FScIwDh27RbevgC9zJ4ufSsSz34njm9cvRMGMNVA== dependencies: picocolors "^1.1.0" +"@nomicfoundation/hardhat-ignition-ethers@^0.15.0": + version "0.15.17" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition-ethers/-/hardhat-ignition-ethers-0.15.17.tgz" + integrity sha512-io6Wrp1dUsJ94xEI3pw6qkPfhc9TFA+e6/+o16yQ8pvBTFMjgK5x8wIHKrrIHr9L3bkuTMtmDjyN4doqO2IqFQ== + +"@nomicfoundation/hardhat-ignition@^0.15.16": + version "0.15.16" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-ignition/-/hardhat-ignition-0.15.16.tgz" + integrity sha512-T0JTnuib7QcpsWkHCPLT7Z6F483EjTdcdjb1e00jqS9zTGCPqinPB66LLtR/duDLdvgoiCVS6K8WxTQkA/xR1Q== + dependencies: + "@nomicfoundation/ignition-core" "^0.15.15" + "@nomicfoundation/ignition-ui" "^0.15.13" + chalk "^4.0.0" + debug "^4.3.2" + fs-extra "^10.0.0" + json5 "^2.2.3" + prompts "^2.4.2" + +"@nomicfoundation/hardhat-network-helpers@^1.0.0": + version "1.1.2" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.1.2.tgz" + integrity sha512-p7HaUVDbLj7ikFivQVNhnfMHUBgiHYMwQWvGn9AriieuopGOELIrwj2KjyM2a6z70zai5YKO264Vwz+3UFJZPQ== + dependencies: + ethereumjs-util "^7.1.4" + "@nomicfoundation/hardhat-toolbox@^5.0.0": version "5.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-5.0.0.tgz#165b47f8a3d2bf668cc5d453ce7f496a1156948d" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-5.0.0.tgz" integrity sha512-FnUtUC5PsakCbwiVNsqlXVIWG5JIb5CEZoSXbJUsEBun22Bivx2jhF1/q9iQbzuaGpJKFQyOhemPB2+XlEE6pQ== +"@nomicfoundation/hardhat-verify@^2.0.0", "@nomicfoundation/hardhat-verify@^2.1.0": + version "2.1.3" + resolved "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.1.3.tgz" + integrity sha512-danbGjPp2WBhLkJdQy9/ARM3WQIK+7vwzE0urNem1qZJjh9f54Kf5f1xuQv8DvqewUAkuPxVt/7q4Grz5WjqSg== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@ethersproject/address" "^5.0.2" + cbor "^8.1.0" + debug "^4.1.1" + lodash.clonedeep "^4.5.0" + picocolors "^1.1.0" + semver "^6.3.0" + table "^6.8.0" + undici "^5.14.0" + +"@nomicfoundation/ignition-core@^0.15.15": + version "0.15.15" + resolved "https://registry.npmjs.org/@nomicfoundation/ignition-core/-/ignition-core-0.15.15.tgz" + integrity sha512-JdKFxYknTfOYtFXMN6iFJ1vALJPednuB+9p9OwGIRdoI6HYSh4ZBzyRURgyXtHFyaJ/SF9lBpsYV9/1zEpcYwg== + dependencies: + "@ethersproject/address" "5.6.1" + "@nomicfoundation/solidity-analyzer" "^0.1.1" + cbor "^9.0.0" + debug "^4.3.2" + ethers "^6.14.0" + fs-extra "^10.0.0" + immer "10.0.2" + lodash "4.17.21" + ndjson "2.0.0" + +"@nomicfoundation/ignition-ui@^0.15.13": + version "0.15.13" + resolved "https://registry.npmjs.org/@nomicfoundation/ignition-ui/-/ignition-ui-0.15.13.tgz" + integrity sha512-HbTszdN1iDHCkUS9hLeooqnLEW2U45FaqFwFEYT8nIno2prFZhG+n68JEERjmfFCB5u0WgbuJwk3CgLoqtSL7Q== + "@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz#3a9c3b20d51360b20affb8f753e756d553d49557" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz" integrity sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw== "@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz#74dcfabeb4ca373d95bd0d13692f44fcef133c28" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz" integrity sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw== "@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz#4af5849a89e5a8f511acc04f28eb5d4460ba2b6a" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz" integrity sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA== "@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz#54036808a9a327b2ff84446c130a6687ee702a8e" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz" integrity sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA== "@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz#466cda0d6e43691986c944b909fc6dbb8cfc594e" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz" integrity sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g== "@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz#2b35826987a6e94444140ac92310baa088ee7f94" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz" integrity sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg== "@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz#e6363d13b8709ca66f330562337dbc01ce8bbbd9" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz" integrity sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA== -"@nomicfoundation/solidity-analyzer@^0.1.0": +"@nomicfoundation/solidity-analyzer@^0.1.0", "@nomicfoundation/solidity-analyzer@^0.1.1": version "0.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz#8bcea7d300157bf3a770a851d9f5c5e2db34ac55" + resolved "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz" integrity sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA== optionalDependencies: "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.2" @@ -576,19 +707,24 @@ "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.2" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.2" -"@scure/base@~1.1.0", "@scure/base@~1.1.6": +"@scure/base@~1.1.0": version "1.1.9" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz" + integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== + +"@scure/base@~1.1.6": + version "1.1.9" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz" integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg== "@scure/base@~1.2.5": version "1.2.6" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6" + resolved "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz" integrity sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg== "@scure/bip32@1.1.5": version "1.1.5" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.5.tgz#d2ccae16dcc2e75bc1d75f5ef3c66a338d1ba300" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz" integrity sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw== dependencies: "@noble/hashes" "~1.2.0" @@ -597,7 +733,7 @@ "@scure/bip32@1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.4.0.tgz#4e1f1e196abedcef395b33b9674a042524e20d67" + resolved "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz" integrity sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== dependencies: "@noble/curves" "~1.4.0" @@ -606,7 +742,7 @@ "@scure/bip39@1.1.1": version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz" integrity sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg== dependencies: "@noble/hashes" "~1.2.0" @@ -614,7 +750,7 @@ "@scure/bip39@1.3.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.3.0.tgz#0f258c16823ddd00739461ac31398b4e7d6a18c3" + resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz" integrity sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== dependencies: "@noble/hashes" "~1.4.0" @@ -622,7 +758,7 @@ "@sentry/core@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz" integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== dependencies: "@sentry/hub" "5.30.0" @@ -633,7 +769,7 @@ "@sentry/hub@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + resolved "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz" integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== dependencies: "@sentry/types" "5.30.0" @@ -642,7 +778,7 @@ "@sentry/minimal@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + resolved "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz" integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== dependencies: "@sentry/hub" "5.30.0" @@ -651,7 +787,7 @@ "@sentry/node@^5.18.1": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + resolved "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz" integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== dependencies: "@sentry/core" "5.30.0" @@ -666,7 +802,7 @@ "@sentry/tracing@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + resolved "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz" integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== dependencies: "@sentry/hub" "5.30.0" @@ -677,120 +813,271 @@ "@sentry/types@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + resolved "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz" integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== "@sentry/utils@5.30.0": version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + resolved "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz" integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== dependencies: "@sentry/types" "5.30.0" tslib "^1.9.3" +"@solidity-parser/parser@^0.14.0": + version "0.14.5" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz" + integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== + dependencies: + antlr4ts "^0.5.0-alpha.4" + +"@solidity-parser/parser@^0.20.1": + version "0.20.2" + resolved "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.20.2.tgz" + integrity sha512-rbu0bzwNvMcwAjH86hiEAcOeRI2EeK8zCkHDrFykh/Al8mvJeFmjy3UrE7GYQjNwOgbGUUtCn5/k8CB8zIu7QA== + "@tsconfig/node10@^1.0.7": version "1.0.12" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.12.tgz#be57ceac1e4692b41be9de6be8c32a106636dba4" + resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz" integrity sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ== "@tsconfig/node12@^1.0.7": version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@typechain/ethers-v6@^0.5.0", "@typechain/ethers-v6@^0.5.1": + version "0.5.1" + resolved "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz" + integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@typechain/hardhat@^9.0.0": + version "9.1.0" + resolved "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-9.1.0.tgz" + integrity sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA== + dependencies: + fs-extra "^9.1.0" + +"@types/bn.js@^5.1.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.2.0.tgz" + integrity sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q== + dependencies: + "@types/node" "*" + +"@types/chai-as-promised@^7.1.3": + version "7.1.8" + resolved "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz" + integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.2.0": + version "4.3.20" + resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz" + integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ== + +"@types/concat-stream@^1.6.0": + version "1.6.1" + resolved "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz" + integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== + dependencies: + "@types/node" "*" + +"@types/form-data@0.0.33": + version "0.0.33" + resolved "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz" + integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== + dependencies: + "@types/node" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/mocha@>=9.1.0": + version "10.0.10" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== + +"@types/node@*", "@types/node@>=18.0.0": + version "25.6.2" + resolved "https://registry.npmjs.org/@types/node/-/node-25.6.2.tgz" + integrity sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw== + dependencies: + undici-types "~7.19.0" + +"@types/node@^10.0.3": + version "10.17.60" + resolved "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== + +"@types/node@^8.0.0": + version "8.10.66" + resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" + integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== + "@types/node@22.7.5": version "22.7.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b" + resolved "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz" integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ== dependencies: undici-types "~6.19.2" +"@types/pbkdf2@^3.0.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz" + integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew== + dependencies: + "@types/node" "*" + +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/qs@^6.2.31": + version "6.15.1" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz" + integrity sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw== + +"@types/secp256k1@^4.0.1": + version "4.0.7" + resolved "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.7.tgz" + integrity sha512-Rcvjl6vARGAKRO6jHeKMatGrvOMGrR/AR11N1x2LqintPCyDZ7NBhrh238Z2VZc7aM7KIwnFpFQ7fnfK4H/9Qw== + dependencies: + "@types/node" "*" + +abbrev@1, abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== + acorn-walk@^8.1.1: version "8.3.5" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz" integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== dependencies: acorn "^8.11.0" acorn@^8.11.0, acorn@^8.4.1: version "8.16.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz" integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== adm-zip@^0.4.16: version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== aes-js@3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz" integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== aes-js@4.0.0-beta.5: version "4.0.0-beta.5" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + resolved "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz" integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== agent-base@6: version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" aggregate-error@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: clean-stack "^2.0.0" indent-string "^4.0.0" +ajv@^8.0.1: + version "8.20.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz" + integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + ansi-align@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== dependencies: string-width "^4.1.0" ansi-colors@^4.1.1, ansi-colors@^4.1.3: version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^4.3.0: version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" +antlr4ts@^0.5.0-alpha.4: + version "0.5.0-alpha.4" + resolved "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== + anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -798,69 +1085,149 @@ anymatch@~3.1.2: arg@^4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-uniq@1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + async-mutex@^0.4.0: version "0.4.1" - resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c" + resolved "https://registry.npmjs.org/async-mutex/-/async-mutex-0.4.1.tgz" integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA== dependencies: tslib "^2.4.0" +async@1.x: + version "1.5.2" + resolved "https://registry.npmjs.org/async/-/async-1.5.2.tgz" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -axios@^1.16.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.16.1.tgz#517e29291d19d6e8cf919ff264f4fe157261ba12" - integrity sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +axios@^1.16.0, axios@^1.5.1: + version "1.16.0" + resolved "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz" + integrity sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w== dependencies: follow-redirects "^1.16.0" form-data "^4.0.5" - https-proxy-agent "^5.0.1" proxy-from-env "^2.1.0" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base-x@^3.0.2: + version "3.0.11" + resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz" + integrity sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA== + dependencies: + safe-buffer "^5.0.1" + base-x@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.1.tgz#817fb7b57143c501f649805cb247617ad016a885" + resolved "https://registry.npmjs.org/base-x/-/base-x-4.0.1.tgz" integrity sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw== bech32@1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== +blakejs@^1.1.0: + version "1.2.1" + resolved "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + bn.js@^4.11.9: version "4.12.3" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.3.tgz#2cc2c679188eb35b006f2d0d4710bed8437a769e" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz" integrity sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g== -bn.js@^5.2.1: +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.3" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.3.tgz#16a9e409616b23fef3ccbedb8d42f13bff80295e" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.3.tgz" integrity sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w== +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + boxen@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" + resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== dependencies: ansi-align "^3.0.0" @@ -872,71 +1239,190 @@ boxen@^5.1.2: widest-line "^3.1.0" wrap-ansi "^7.0.0" +brace-expansion@^1.1.7: + version "1.1.14" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz" + integrity sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + brace-expansion@^2.0.1: version "2.1.0" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.0.tgz#4f41a41190216ee36067ec381526fe9539c4f0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz" integrity sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w== dependencies: balanced-match "^1.0.0" -braces@~3.0.2: +braces@^3.0.3, braces@~3.0.2: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" brorand@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-stdout@^1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== + dependencies: + base-x "^3.0.2" + bs58@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + resolved "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz" integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== dependencies: base-x "^4.0.0" +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== + bytes@~3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== dependencies: es-errors "^1.3.0" function-bind "^1.1.2" +call-bind@^1.0.8: + version "1.0.9" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz" + integrity sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + get-intrinsic "^1.3.0" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" + camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -chalk@^4.1.0: +caseless@^0.12.0, caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +cbor@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz" + integrity sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg== + dependencies: + nofilter "^3.1.0" + +cbor@^9.0.0: + version "9.0.2" + resolved "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz" + integrity sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ== + dependencies: + nofilter "^3.1.0" + +chai-as-promised@^7.1.1: + version "7.1.2" + resolved "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz" + integrity sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw== + dependencies: + check-error "^1.0.2" + +chai@^4.2.0, "chai@>= 2.1.2 < 6": + version "4.5.0" + resolved "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.1.0" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" +"charenc@>= 0.0.1": + version "0.0.2" + resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + +check-error@^1.0.2, check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + chokidar@^3.5.3: version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -951,123 +1437,272 @@ chokidar@^3.5.3: chokidar@^4.0.0: version "4.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== dependencies: readdirp "^4.0.1" ci-info@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.7" + resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz" + integrity sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.2" + clean-stack@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== cli-boxes@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== +cli-table3@^0.5.0: + version "0.5.1" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + cliui@^7.0.2: version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colors@^1.1.2, colors@1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" command-exists@^1.2.8: version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + resolved "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + commander@^8.1.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.6.0, concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + cookie@^0.4.1: version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + create-require@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== -debug@4, debug@^4.1.1, debug@^4.3.5: +"crypt@>= 0.0.1": + version "0.0.2" + resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + +death@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/death/-/death-1.1.0.tgz" + integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== + +debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.5, debug@4: version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== dependencies: ms "^2.1.3" decamelize@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +deep-eql@^4.0.1, deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== + dependencies: + type-detect "^4.0.0" + +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== depd@~2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== diff@^4.0.1: version "4.0.4" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.4.tgz#7a6dbfda325f25f07517e9b518f897c08332e07d" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz" integrity sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ== diff@^5.2.0: version "5.2.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.2.tgz#0a4742797281d09cfa699b79ea32d27723623bad" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz" integrity sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A== +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.0" + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + dotenv@^16.0.0: version "16.6.1" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.6.1.tgz#773f0e69527a8315c7285d5ee73c4459d20a8020" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz" integrity sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow== dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: call-bind-apply-helpers "^1.0.1" es-errors "^1.3.0" gopd "^1.2.0" -elliptic@6.6.1: +elliptic@^6.5.7, elliptic@6.6.1: version "6.6.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" + resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz" integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== dependencies: bn.js "^4.11.9" @@ -1080,12 +1715,12 @@ elliptic@6.6.1: emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== enquirer@^2.3.0: version "2.4.1" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz" integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" @@ -1093,29 +1728,29 @@ enquirer@^2.3.0: env-paths@^2.2.0: version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -es-define-property@^1.0.1: +es-define-property@^1.0.0, es-define-property@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== es-errors@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== dependencies: es-errors "^1.3.0" es-set-tostringtag@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: es-errors "^1.3.0" @@ -1125,17 +1760,101 @@ es-set-tostringtag@^2.1.0: escalade@^3.1.1: version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz" + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + +esprima@^2.7.1, esprima@2.7.x: + version "2.7.3" + resolved "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz" + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eth-gas-reporter@^0.2.25: + version "0.2.27" + resolved "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz" + integrity sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw== + dependencies: + "@solidity-parser/parser" "^0.14.0" + axios "^1.5.1" + cli-table3 "^0.5.0" + colors "1.4.0" + ethereum-cryptography "^1.0.3" + ethers "^5.7.2" + fs-readdir-recursive "^1.1.0" + lodash "^4.17.14" + markdown-table "^1.1.3" + mocha "^10.2.0" + req-cwd "^2.0.0" + sha1 "^1.1.1" + sync-request "^6.0.0" + +ethereum-bloom-filters@^1.0.6: + version "1.2.0" + resolved "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz" + integrity sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA== + dependencies: + "@noble/hashes" "^1.4.0" + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + ethereum-cryptography@^1.0.3: version "1.2.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz#5ccfa183e85fdaf9f9b299a79430c044268c9b3a" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz" integrity sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw== dependencies: "@noble/hashes" "1.2.0" @@ -1143,9 +1862,19 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.2.1" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz" + integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== + dependencies: + "@noble/curves" "1.4.2" + "@noble/hashes" "1.4.0" + "@scure/bip32" "1.4.0" + "@scure/bip39" "1.3.0" + ethereum-cryptography@^2.2.1: version "2.2.1" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz#58f2810f8e020aecb97de8c8c76147600b0b8ccf" + resolved "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz" integrity sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== dependencies: "@noble/curves" "1.4.2" @@ -1153,9 +1882,20 @@ ethereum-cryptography@^2.2.1: "@scure/bip32" "1.4.0" "@scure/bip39" "1.3.0" +ethereumjs-util@^7.1.4: + version "7.1.5" + resolved "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + ethers@^5.1.0: version "5.8.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.8.0.tgz#97858dc4d4c74afce83ea7562fe9493cedb4d377" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz" integrity sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg== dependencies: "@ethersproject/abi" "5.8.0" @@ -1189,34 +1929,126 @@ ethers@^5.1.0: "@ethersproject/web" "5.8.0" "@ethersproject/wordlists" "5.8.0" -ethers@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.16.0.tgz#fff9b4f05d7a359c774ad6e91085a800f7fccf65" - integrity sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A== +ethers@^5.7.2: + version "5.8.0" + resolved "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz" + integrity sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg== dependencies: - "@adraffy/ens-normalize" "1.10.1" - "@noble/curves" "1.2.0" - "@noble/hashes" "1.3.2" - "@types/node" "22.7.5" - aes-js "4.0.0-beta.5" - tslib "2.7.0" - ws "8.17.1" - -fdir@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" - integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + "@ethersproject/abi" "5.8.0" + "@ethersproject/abstract-provider" "5.8.0" + "@ethersproject/abstract-signer" "5.8.0" + "@ethersproject/address" "5.8.0" + "@ethersproject/base64" "5.8.0" + "@ethersproject/basex" "5.8.0" + "@ethersproject/bignumber" "5.8.0" + "@ethersproject/bytes" "5.8.0" + "@ethersproject/constants" "5.8.0" + "@ethersproject/contracts" "5.8.0" + "@ethersproject/hash" "5.8.0" + "@ethersproject/hdnode" "5.8.0" + "@ethersproject/json-wallets" "5.8.0" + "@ethersproject/keccak256" "5.8.0" + "@ethersproject/logger" "5.8.0" + "@ethersproject/networks" "5.8.0" + "@ethersproject/pbkdf2" "5.8.0" + "@ethersproject/properties" "5.8.0" + "@ethersproject/providers" "5.8.0" + "@ethersproject/random" "5.8.0" + "@ethersproject/rlp" "5.8.0" + "@ethersproject/sha2" "5.8.0" + "@ethersproject/signing-key" "5.8.0" + "@ethersproject/solidity" "5.8.0" + "@ethersproject/strings" "5.8.0" + "@ethersproject/transactions" "5.8.0" + "@ethersproject/units" "5.8.0" + "@ethersproject/wallet" "5.8.0" + "@ethersproject/web" "5.8.0" + "@ethersproject/wordlists" "5.8.0" + +ethers@^6.1.0, ethers@^6.14.0, ethers@^6.16.0, ethers@^6.4.0, ethers@6.x: + version "6.16.0" + resolved "https://registry.npmjs.org/ethers/-/ethers-6.16.0.tgz" + integrity sha512-U1wulmetNymijEhpSEQ7Ct/P/Jw9/e7R1j5XIbPRydgV2DjLVMsULDlNksq3RQnFgKoLlZf88ijYtWEXcPa07A== + dependencies: + "@adraffy/ens-normalize" "1.10.1" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "22.7.5" + aes-js "4.0.0-beta.5" + tslib "2.7.0" + ws "8.17.1" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.0.3: + version "3.3.3" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-uri@^3.0.1: + version "3.1.2" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz" + integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ== + +fastq@^1.6.0: + version "1.20.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz" + integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== + dependencies: + reusify "^1.0.4" + +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -1224,17 +2056,36 @@ find-up@^5.0.0: flat@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.12.1, follow-redirects@^1.16.0: version "1.16.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz" integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== +for-each@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" + integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== + dependencies: + is-callable "^1.2.7" + +form-data@^2.2.0: + version "2.5.5" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz" + integrity sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.35" + safe-buffer "^5.2.1" + form-data@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz" integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== dependencies: asynckit "^0.4.0" @@ -1243,48 +2094,90 @@ form-data@^4.0.5: hasown "^2.0.2" mime-types "^2.1.12" -fp-ts@1.19.3: +fp-ts@^1.0.0, fp-ts@1.19.3: version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + resolved "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz" integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" fs-extra@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== get-caller-file@^2.0.5: version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.2.6: +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== dependencies: call-bind-apply-helpers "^1.0.2" @@ -1298,24 +2191,72 @@ get-intrinsic@^1.2.6: hasown "^2.0.2" math-intrinsics "^1.1.0" +get-port@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz" + integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== + get-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: dunder-proto "^1.0.1" es-object-atoms "^1.0.0" -glob-parent@~5.1.2: +ghost-testrpc@^0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz" + integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== + dependencies: + chalk "^2.4.2" + node-emoji "^1.10.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" @@ -1324,19 +2265,82 @@ glob@^8.1.0: minimatch "^5.0.1" once "^1.3.0" -gopd@^1.2.0: +glob@7.1.7: + version "7.1.7" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + +gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -hardhat@^2.22.7: +handlebars@^4.0.1: + version "4.7.9" + resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz" + integrity sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + +hardhat-gas-reporter@^1.0.8: + version "1.0.10" + resolved "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz" + integrity sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA== + dependencies: + array-uniq "1.0.3" + eth-gas-reporter "^0.2.25" + sha1 "^1.1.1" + +hardhat@^2.0.2, hardhat@^2.11.0, hardhat@^2.22.7, hardhat@^2.26.0, hardhat@^2.28.0, hardhat@^2.9.9: version "2.28.6" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.28.6.tgz#1346f90796492097ee6a802e762a2f4883817db6" + resolved "https://registry.npmjs.org/hardhat/-/hardhat-2.28.6.tgz" integrity sha512-zQze7qe+8ltwHvhX5NQ8sN1N37WWZGw8L63y+2XcPxGwAjc/SMF829z3NS6o1krX0sryhAsVBK/xrwUqlsot4Q== dependencies: "@ethereumjs/util" "^9.1.0" @@ -1379,26 +2383,53 @@ hardhat@^2.22.7: uuid "^8.3.2" ws "^7.4.6" +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + has-symbols@^1.0.3, has-symbols@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: has-symbols "^1.0.3" -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: +hash-base@^3.0.0, hash-base@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz" + integrity sha512-Bb33KbowVTIj5s7Ked1OsqHUeCpz//tPwR+E2zJgJKo9Z5XolZ9b6bdUgjmYlwnWhoOQKoTd1TYToZGn5mAYOg== + dependencies: + inherits "^2.0.4" + readable-stream "^2.3.8" + safe-buffer "^5.2.1" + to-buffer "^1.2.1" + +hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7, hash.js@1.1.7: version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" @@ -1406,28 +2437,43 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: hasown@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.3.tgz#5e5c2b15b60370a4c7930c383dfb76bf17bc403c" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz" integrity sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg== dependencies: function-bind "^1.1.2" he@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + hmac-drbg@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +http-basic@^8.1.1: + version "8.1.3" + resolved "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz" + integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== + dependencies: + caseless "^0.12.0" + concat-stream "^1.6.2" + http-response-object "^3.0.1" + parse-cache-control "^1.0.1" + http-errors@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz" integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== dependencies: depd "~2.0.0" @@ -1436,9 +2482,16 @@ http-errors@~2.0.1: statuses "~2.0.2" toidentifier "~1.0.1" -https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: +http-response-object@^3.0.1: + version "3.0.2" + resolved "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz" + integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== + dependencies: + "@types/node" "^10.0.3" + +https-proxy-agent@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -1446,208 +2499,424 @@ https-proxy-agent@^5.0.0, https-proxy-agent@^5.0.1: iconv-lite@~0.4.24: version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +ignore@^5.1.1: + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +immer@10.0.2: + version "10.0.2" + resolved "https://registry.npmjs.org/immer/-/immer-10.0.2.tgz" + integrity sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA== + immutable@^4.0.0-rc.12: version "4.3.8" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.8.tgz#02d183c7727fb2bb1d5d0380da0d779dce9296a7" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.8.tgz" integrity sha512-d/Ld9aLbKpNwyl0KiM2CT1WYvkitQ1TSvmRtkcV8FKStiDoA7Slzgjmb/1G2yhKM1p0XeNOieaTbFZmU1d3Xuw== indent-string@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.4: +inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4, inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + io-ts@1.10.4: version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + resolved "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz" integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== dependencies: fp-ts "^1.0.0" is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" +is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-typed-array@^1.1.14: + version "1.1.15" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + is-unicode-supported@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -js-sha3@0.8.0: +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +js-sha3@^0.8.0, js-sha3@0.8.0: version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== js-yaml@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz" integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== dependencies: argparse "^2.0.1" +js-yaml@3.x: + version "3.14.2" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz" + integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + json-stream-stringify@^3.1.4: version "3.1.6" - resolved "https://registry.yarnpkg.com/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz#ebe32193876fb99d4ec9f612389a8d8e2b5d54d4" + resolved "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz" integrity sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog== +json-stringify-safe@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + jsonfile@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" -keccak@^3.0.2: +jsonfile@^6.0.1: + version "6.2.1" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz" + integrity sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonschema@^1.2.4: + version "1.5.0" + resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz" + integrity sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw== + +keccak@^3.0.0, keccak@^3.0.2: version "3.0.4" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz" integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" readable-stream "^3.6.0" +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" -lodash@^4.17.11: - version "4.18.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" - integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" + integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== + +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" + integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-symbols@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== dependencies: chalk "^4.1.0" is-unicode-supported "^0.1.0" +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + lru_map@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + resolved "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz" integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== make-error@^1.1.1: version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +markdown-table@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz" + integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== + math-intrinsics@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + memorystream@^0.3.1: version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== +merge2@^1.2.3, merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + micro-eth-signer@^0.14.0: version "0.14.0" - resolved "https://registry.yarnpkg.com/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz#8aa1fe997d98d6bdf42f2071cef7eb01a66ecb22" + resolved "https://registry.npmjs.org/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz" integrity sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw== dependencies: "@noble/curves" "~1.8.1" "@noble/hashes" "~1.7.1" micro-packed "~0.7.2" +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + micro-packed@~0.7.2: version "0.7.3" - resolved "https://registry.yarnpkg.com/micro-packed/-/micro-packed-0.7.3.tgz#59e96b139dffeda22705c7a041476f24cabb12b6" + resolved "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.3.tgz" integrity sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg== dependencies: "@scure/base" "~1.2.5" +micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + mime-db@1.52.0: version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12: +mime-types@^2.1.12, mime-types@^2.1.35: version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +minimatch@^3.0.4: + version "3.1.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.0.5: + version "3.1.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^3.1.1: + version "3.1.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + minimatch@^5.0.1, minimatch@^5.1.6: version "5.1.9" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.9.tgz#1293ef15db0098b394540e8f9f744f9fda8dee4b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz" integrity sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw== dependencies: brace-expansion "^2.0.1" +"minimatch@2 || 3": + version "3.1.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@0.5.x: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + mnemonist@^0.38.0: version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz" integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== dependencies: obliterator "^2.0.0" -mocha@^10.0.0: +mocha@^10.0.0, mocha@^10.2.0: version "10.8.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.8.2.tgz#8d8342d016ed411b12a429eb731b825f961afb96" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz" integrity sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg== dependencies: ansi-colors "^4.1.3" @@ -1673,102 +2942,261 @@ mocha@^10.0.0: ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +ndjson@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz" + integrity sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ== + dependencies: + json-stringify-safe "^5.0.1" + minimist "^1.2.5" + readable-stream "^3.6.0" + split2 "^3.0.0" + through2 "^4.0.0" + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + node-addon-api@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-addon-api@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz" + integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA== + +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + node-gyp-build@^4.2.0: version "4.8.4" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz" integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== +nofilter@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz" + integrity sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g== + +nopt@3.x: + version "3.0.6" + resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== + dependencies: + abbrev "1" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + +object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3, object-inspect@^1.13.4: + version "1.13.4" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" + integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== + obliterator@^2.0.0: version "2.0.5" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.5.tgz#031e0145354b0c18840336ae51d41e7d6d2c76aa" + resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz" integrity sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw== -once@^1.3.0: +once@^1.3.0, once@1.x: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +ordinal@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz" + integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== + os-tmpdir@~1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-map@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== dependencies: aggregate-error "^3.0.0" +parse-cache-control@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz" + integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== + path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + path-parse@^1.0.6: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pbkdf2@^3.0.17: + version "3.1.5" + resolved "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz" + integrity sha512-Q3CG/cYvCO1ye4QKkuH7EXxs3VC/rI1/trd+qX2+PolbaKG0H+bgcZzrTt96mMyRtejk+JMCiLUn3y29W8qmFQ== + dependencies: + create-hash "^1.2.0" + create-hmac "^1.1.7" + ripemd160 "^2.0.3" + safe-buffer "^5.2.1" + sha.js "^2.4.12" + to-buffer "^1.2.1" + picocolors@^1.1.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -picomatch@^2.0.4, picomatch@^2.2.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz" integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== -picomatch@^4.0.4: +"picomatch@^3 || ^4", picomatch@^4.0.4: version "4.0.4" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +possible-typed-array-names@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" + integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^8.0.0: + version "8.3.0" + resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + proxy-from-env@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-2.1.0.tgz#a7487568adad577cfaaa7e88c49cab3ab3081aba" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz" integrity sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA== +qs@^6.4.0: + version "6.15.1" + resolved "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz" + integrity sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg== + dependencies: + side-channel "^1.1.0" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" raw-body@^2.4.1: version "2.5.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz" integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== dependencies: bytes "~3.1.2" @@ -1776,9 +3204,35 @@ raw-body@^2.4.1: iconv-lite "~0.4.24" unpipe "~1.0.0" -readable-stream@^3.6.0: +readable-stream@^2.2.2: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^2.3.8: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.0, readable-stream@^3.6.0, readable-stream@3: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -1787,68 +3241,284 @@ readable-stream@^3.6.0: readdirp@^4.0.1: version "4.1.2" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz" integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + +req-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz" + integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== + dependencies: + req-from "^2.0.0" + +req-from@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz" + integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== + dependencies: + resolve-from "^3.0.0" + require-directory@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -resolve@1.17.0: +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + +resolve@^1.1.6, resolve@1.17.0: version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" -safe-buffer@^5.1.0, safe-buffer@~5.2.0: +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== + +ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz" + integrity sha512-5Di9UC0+8h1L6ZD2d7awM7E/T4uA1fJRlx6zk/NvdCCVEoAnFqvHmCuNeIKoCeIixBX/q8uM+6ycDvF8woqosA== + dependencies: + hash-base "^3.1.2" + inherits "^2.0.4" + +rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== + dependencies: + bn.js "^5.2.0" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scrypt-js@3.0.1: +sc-istanbul@^0.4.5: + version "0.4.6" + resolved "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz" + integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + +scrypt-js@^3.0.0, scrypt-js@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== +secp256k1@^4.0.1: + version "4.0.4" + resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz" + integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw== + dependencies: + elliptic "^6.5.7" + node-addon-api "^5.0.0" + node-gyp-build "^4.2.0" + semver@^5.5.0: version "5.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.3.0: version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@^7.3.4: + version "7.8.0" + resolved "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz" + integrity sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA== + serialize-javascript@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + setprototypeof@~1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== +sha.js@^2.4.0, sha.js@^2.4.12, sha.js@^2.4.8: + version "2.4.12" + resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz" + integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w== + dependencies: + inherits "^2.0.4" + safe-buffer "^5.2.1" + to-buffer "^1.2.0" + +sha1@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz" + integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== + dependencies: + charenc ">= 0.0.1" + crypt ">= 0.0.1" + +shelljs@^0.8.3: + version "0.8.5" + resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +side-channel-list@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz" + integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.4" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + solc@0.8.26: version "0.8.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.8.26.tgz#afc78078953f6ab3e727c338a2fefcd80dd5b01a" + resolved "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz" integrity sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g== dependencies: command-exists "^1.2.8" @@ -1859,9 +3529,34 @@ solc@0.8.26: semver "^5.5.0" tmp "0.0.33" +solidity-coverage@^0.8.1: + version "0.8.17" + resolved "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.17.tgz" + integrity sha512-5P8vnB6qVX9tt1MfuONtCTEaEGO/O4WuEidPHIAJjx4sktHHKhO3rFvnE0q8L30nWJPTrcqGQMT7jpE29B2qow== + dependencies: + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.20.1" + chalk "^2.4.2" + death "^1.1.0" + difflib "^0.2.4" + fs-extra "^8.1.0" + ghost-testrpc "^0.0.2" + global-modules "^2.0.0" + globby "^10.0.1" + jsonschema "^1.2.4" + lodash "^4.17.21" + mocha "^10.2.0" + node-emoji "^1.10.0" + pify "^4.0.1" + recursive-readdir "^2.2.2" + sc-istanbul "^0.4.5" + semver "^7.3.4" + shelljs "^0.8.3" + web3-utils "^1.3.6" + source-map-support@^0.5.13: version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" @@ -1869,71 +3564,197 @@ source-map-support@^0.5.13: source-map@^0.6.0: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + stacktrace-parser@^0.1.10: version "0.1.11" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz#c7c08f9b29ef566b9a6f7b255d7db572f66fabc4" + resolved "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz" integrity sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg== dependencies: type-fest "^0.7.1" statuses@~2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz" integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + +string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== dependencies: - safe-buffer "~5.2.0" + ansi-regex "^3.0.0" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.1.1: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" +sync-request@^6.0.0: + version "6.1.0" + resolved "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz" + integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== + dependencies: + http-response-object "^3.0.1" + sync-rpc "^1.2.1" + then-request "^6.0.0" + +sync-rpc@^1.2.1: + version "1.3.6" + resolved "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz" + integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== + dependencies: + get-port "^3.1.0" + +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + +table@^6.8.0: + version "6.9.0" + resolved "https://registry.npmjs.org/table/-/table-6.9.0.tgz" + integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + +then-request@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz" + integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== + dependencies: + "@types/concat-stream" "^1.6.0" + "@types/form-data" "0.0.33" + "@types/node" "^8.0.0" + "@types/qs" "^6.2.31" + caseless "~0.12.0" + concat-stream "^1.6.0" + form-data "^2.2.0" + http-basic "^8.1.1" + http-response-object "^3.0.1" + promise "^8.0.0" + qs "^6.4.0" + +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + tiny-invariant@^1.3.1: version "1.3.3" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" + resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz" integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== tinyglobby@^0.2.6: version "0.2.16" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.16.tgz#1c3b7eb953fce42b226bc5a1ee06428281aff3d6" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz" integrity sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg== dependencies: fdir "^6.5.0" @@ -1941,26 +3762,50 @@ tinyglobby@^0.2.6: tmp@0.0.33: version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" +to-buffer@^1.2.0, to-buffer@^1.2.1, to-buffer@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz" + integrity sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw== + dependencies: + isarray "^2.0.5" + safe-buffer "^5.2.1" + typed-array-buffer "^1.0.3" + to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" toidentifier@~1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -ts-node@^10.9.0: +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + +ts-node@*, ts-node@^10.9.0, ts-node@>=8.0.0: version "10.9.2" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" @@ -1977,98 +3822,212 @@ ts-node@^10.9.0: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -tslib@2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01" - integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== - tslib@^1.9.3: version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.4.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== +tslib@^2.4.0, tslib@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz" + integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA== tsort@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + resolved "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz" integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== type-fest@^0.21.3: version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -typescript@^5.0.0: +typechain@^8.3.0, typechain@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== + dependencies: + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + +typed-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== + dependencies: + call-bound "^1.0.3" + es-errors "^1.3.0" + is-typed-array "^1.1.14" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typescript@*, typescript@^5.0.0, typescript@>=2.7, typescript@>=3.7.0, typescript@>=4.3.0, typescript@>=4.5.0, typescript@>=4.7.0: version "5.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + undici-types@~6.19.2: version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz" integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~7.19.0: + version "7.19.2" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz" + integrity sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg== + undici@^5.14.0: version "5.29.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.29.0.tgz#419595449ae3f2cdcba3580a2e8903399bd1f5a3" + resolved "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz" integrity sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg== dependencies: "@fastify/busboy" "^2.0.0" universalify@^0.1.0: version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + unpipe@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -util-deprecate@^1.0.1: +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== uuid@^8.3.2: version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache-lib@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +web3-utils@^1.3.6: + version "1.10.4" + resolved "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz" + integrity sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A== + dependencies: + "@ethereumjs/util" "^8.1.0" + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereum-cryptography "^2.1.2" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +which-typed-array@^1.1.16: + version "1.1.20" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz" + integrity sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.4" + for-each "^0.3.5" + get-proto "^1.0.1" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@^1.1.1, which@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + widest-line@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== dependencies: string-width "^4.0.0" +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + workerpool@^6.5.1: version "6.5.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz" integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== wrap-ansi@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -2077,37 +4036,37 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +ws@^7.4.6: + version "7.5.10" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + ws@8.17.1: version "8.17.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== ws@8.18.0: version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz" integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== -ws@^7.4.6: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - y18n@^5.0.5: version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-unparser@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== dependencies: camelcase "^6.0.0" @@ -2117,7 +4076,7 @@ yargs-unparser@^2.0.0: yargs@^16.2.0: version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" @@ -2130,10 +4089,10 @@ yargs@^16.2.0: yn@3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From fc8d4f91e11e67c232f43ff83dff98afdfdbe176 Mon Sep 17 00:00:00 2001 From: reddyismav Date: Tue, 23 Jun 2026 16:11:24 +0400 Subject: [PATCH 10/11] feat: cctp claim executor address --- .vscode/settings.json | 12 + OPENROUTER_CONTEXT.md | 16 + deployments/prod/addresses/arbitrum.json | 3 +- deployments/prod/addresses/avalanche.json | 3 +- deployments/prod/addresses/base.json | 3 +- deployments/prod/addresses/ethereum.json | 3 +- deployments/prod/addresses/hyperEvm.json | 3 +- deployments/prod/addresses/ink.json | 3 +- deployments/prod/addresses/linea.json | 3 +- deployments/prod/addresses/monad.json | 3 +- deployments/prod/addresses/optimism.json | 3 +- deployments/prod/addresses/plume.json | 3 +- deployments/prod/addresses/polygon.json | 3 +- deployments/prod/addresses/sei.json | 3 +- deployments/prod/addresses/sonic.json | 3 +- deployments/prod/addresses/unichain.json | 3 +- deployments/prod/addresses/worldchain.json | 3 +- package.json | 2 + scripts/deploy/cctpClaimExecutorAddresses.ts | 76 +++ scripts/deploy/cctpClaimExecutorConfig.ts | 95 +++ scripts/deploy/create3.ts | 8 + scripts/deploy/deployCctpClaimExecutor.ts | 256 ++++++++ .../deployCctpClaimExecutorAllChains.ts | 409 ++++++++++++ .../deploy/verifyCctpClaimExecutorBatch.ts | 599 ++++++++++++++++++ src/executors/CctpClaimExecutor.sol | 154 +++++ src/interfaces/IMessageTransmitter.sol | 9 + test/unit/CctpClaimExecutor.t.sol | 234 +++++++ 27 files changed, 1900 insertions(+), 15 deletions(-) create mode 100644 scripts/deploy/cctpClaimExecutorAddresses.ts create mode 100644 scripts/deploy/cctpClaimExecutorConfig.ts create mode 100644 scripts/deploy/deployCctpClaimExecutor.ts create mode 100644 scripts/deploy/deployCctpClaimExecutorAllChains.ts create mode 100644 scripts/deploy/verifyCctpClaimExecutorBatch.ts create mode 100644 src/executors/CctpClaimExecutor.sol create mode 100644 src/interfaces/IMessageTransmitter.sol create mode 100644 test/unit/CctpClaimExecutor.t.sol diff --git a/.vscode/settings.json b/.vscode/settings.json index fabc63e..1f1c3d2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,17 @@ "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit", "source.organizeImports": "explicit" + }, + "solidity.compileUsingRemoteVersion": "v0.8.34+commit.983a4840b335a15d1418326d7fa830a1252c0848", + "solidity.packageDefaultDependenciesContractsDirectory": "src", + "solidity.packageDefaultDependenciesDirectory": "lib", + "solidity.monoRepoSupport": false, + "solidity.remappings": [ + "forge-std/=lib/forge-std/src/", + "solady/=lib/solady/" + ], + "[solidity]": { + "editor.tabSize": 4, + "editor.defaultFormatter": "JuanBlanco.solidity" } } diff --git a/OPENROUTER_CONTEXT.md b/OPENROUTER_CONTEXT.md index 3860a3c..3bd535c 100644 --- a/OPENROUTER_CONTEXT.md +++ b/OPENROUTER_CONTEXT.md @@ -131,6 +131,22 @@ Deployment helpers: - `scripts/deploy/deployOpenRouterByBuildProfile.ts` batches router deploys by `(EVM version, AllowanceHolder address)`, compiles once per profile, then deploys matching networks in parallel with `--no-compile`. - OpenRouter currently uses Cancun `mcopy` in `src/OpenRouter.sol` and `src/common/lib/BytesSpliceLib.sol`; the patched deploy wrapper refuses Shanghai/no-Cancun OpenRouter builds until those copies are made fork-compatible. +## CctpClaimExecutor (destination CCTP v2 claim) + +Contract: [`src/executors/CctpClaimExecutor.sol`](src/executors/CctpClaimExecutor.sol) + +- CREATE3 salt: `CctpClaimExecutor` (see [`scripts/deploy/create3.ts`](scripts/deploy/create3.ts)) +- Expected address (canonical CreateX): `0x49845419e8146d9b6f5461DAD7f57BaB34b70168` on all deployed chains +- Deploy: `scripts/deploy/deployCctpClaimExecutor.ts` (single chain) or `deployCctpClaimExecutorAllChains.ts` +- Required env: `DEPLOYER_PRIVATE_KEY`, `SOLVER_SIGNER_ADDRESS` (must match transmitter `SignerService` / `BungeeReceiver.SOLVER_SIGNER`) +- Source `depositForBurn` must set `mintRecipient` and `destinationCaller` to the claim executor +- Transmitter signs and calls `claim(message, attestation, recipient, feeTaker, quotedRelayFee, signature)`; relay fee is collected in USDC on destination + +Sync deployed address into: + +- `bungee-backend/src/modules/router/routers/cctp-v2/cctp-v2.config.ts` → `CCTP_CLAIM_EXECUTOR_ADDRESSES` +- `new-bungee-transmitter/src/shared/cctp-v2/constants.ts` → `CCTP_CLAIM_EXECUTOR_ADDRESSES` + ## Gotchas - ERC-20 inputs must be submitted through 0x AllowanceHolder, not directly to the router, or `_msgSender() == user` fails. diff --git a/deployments/prod/addresses/arbitrum.json b/deployments/prod/addresses/arbitrum.json index 78ce567..e7b302a 100644 --- a/deployments/prod/addresses/arbitrum.json +++ b/deployments/prod/addresses/arbitrum.json @@ -1,4 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/avalanche.json b/deployments/prod/addresses/avalanche.json index 78ce567..e7b302a 100644 --- a/deployments/prod/addresses/avalanche.json +++ b/deployments/prod/addresses/avalanche.json @@ -1,4 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/base.json b/deployments/prod/addresses/base.json index 78ce567..46dd98e 100644 --- a/deployments/prod/addresses/base.json +++ b/deployments/prod/addresses/base.json @@ -1,4 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461DAD7f57BaB34b70168" } diff --git a/deployments/prod/addresses/ethereum.json b/deployments/prod/addresses/ethereum.json index 78ce567..e7b302a 100644 --- a/deployments/prod/addresses/ethereum.json +++ b/deployments/prod/addresses/ethereum.json @@ -1,4 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/hyperEvm.json b/deployments/prod/addresses/hyperEvm.json index 21878b9..522e6ea 100644 --- a/deployments/prod/addresses/hyperEvm.json +++ b/deployments/prod/addresses/hyperEvm.json @@ -1,3 +1,4 @@ { - "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/ink.json b/deployments/prod/addresses/ink.json index 21878b9..522e6ea 100644 --- a/deployments/prod/addresses/ink.json +++ b/deployments/prod/addresses/ink.json @@ -1,3 +1,4 @@ { - "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/linea.json b/deployments/prod/addresses/linea.json index 78ce567..e7b302a 100644 --- a/deployments/prod/addresses/linea.json +++ b/deployments/prod/addresses/linea.json @@ -1,4 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/monad.json b/deployments/prod/addresses/monad.json index 21878b9..522e6ea 100644 --- a/deployments/prod/addresses/monad.json +++ b/deployments/prod/addresses/monad.json @@ -1,3 +1,4 @@ { - "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/optimism.json b/deployments/prod/addresses/optimism.json index 78ce567..e7b302a 100644 --- a/deployments/prod/addresses/optimism.json +++ b/deployments/prod/addresses/optimism.json @@ -1,4 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/plume.json b/deployments/prod/addresses/plume.json index 21878b9..522e6ea 100644 --- a/deployments/prod/addresses/plume.json +++ b/deployments/prod/addresses/plume.json @@ -1,3 +1,4 @@ { - "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/polygon.json b/deployments/prod/addresses/polygon.json index 78ce567..e7b302a 100644 --- a/deployments/prod/addresses/polygon.json +++ b/deployments/prod/addresses/polygon.json @@ -1,4 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d" + "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/sei.json b/deployments/prod/addresses/sei.json index 21878b9..522e6ea 100644 --- a/deployments/prod/addresses/sei.json +++ b/deployments/prod/addresses/sei.json @@ -1,3 +1,4 @@ { - "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/sonic.json b/deployments/prod/addresses/sonic.json index 21878b9..522e6ea 100644 --- a/deployments/prod/addresses/sonic.json +++ b/deployments/prod/addresses/sonic.json @@ -1,3 +1,4 @@ { - "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/deployments/prod/addresses/unichain.json b/deployments/prod/addresses/unichain.json index 21878b9..170aedc 100644 --- a/deployments/prod/addresses/unichain.json +++ b/deployments/prod/addresses/unichain.json @@ -1,3 +1,4 @@ { - "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461DAD7f57BaB34b70168" } diff --git a/deployments/prod/addresses/worldchain.json b/deployments/prod/addresses/worldchain.json index 21878b9..522e6ea 100644 --- a/deployments/prod/addresses/worldchain.json +++ b/deployments/prod/addresses/worldchain.json @@ -1,3 +1,4 @@ { - "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5" + "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", + "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" } diff --git a/package.json b/package.json index 8e339d8..b5b69ff 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "deploy:allowance-holder": "hardhat run scripts/deploy/deployAllowanceHolder.ts --network", "deploy:receiver-executor": "hardhat run scripts/deploy/deployReceiverAllChains.ts", "deploy:across-manipulator": "hardhat run scripts/deploy/deployAcrossERC20AmountManipulator.ts --network", + "deploy:cctp-claim-executor:all": "ts-node scripts/deploy/deployCctpClaimExecutorAllChains.ts", "deploy:rfq-vault-executor:all": "ts-node scripts/deploy/deployRFQVaultExecutorAllChains.ts", "deploy:rfq-vault-executor": "hardhat run scripts/deploy/deployRFQVaultExecutor.ts --network", "check:openrouter": "hardhat run scripts/deploy/checkOpenRouterDeployment.ts", @@ -18,6 +19,7 @@ "check:allowance-holder": "hardhat run scripts/deploy/checkAllowanceHolderDeployment.ts", "verify:allowance-holder": "ts-node scripts/deploy/verifyAllowanceHolderBatch.ts", "verify:rfq-vault-executor": "ts-node scripts/deploy/verifyRFQVaultExecutorBatch.ts", + "verify:cctp-claim-executor": "ts-node scripts/deploy/verifyCctpClaimExecutorBatch.ts", "check:receiver": "hardhat run scripts/deploy/checkReceiverAllChains.ts", "check:deployer-balances": "hardhat run scripts/deploy/checkDeployerBalances.ts", "check:across-manipulator": "hardhat run scripts/deploy/checkAcrossManipulatorDeployment.ts", diff --git a/scripts/deploy/cctpClaimExecutorAddresses.ts b/scripts/deploy/cctpClaimExecutorAddresses.ts new file mode 100644 index 0000000..00c0f79 --- /dev/null +++ b/scripts/deploy/cctpClaimExecutorAddresses.ts @@ -0,0 +1,76 @@ +import { mkdir, readFile, writeFile } from 'fs/promises'; +import { dirname, resolve } from 'path'; + +export type CctpClaimExecutorDeployments = { + CctpClaimExecutor: string; +}; + +export function cctpClaimExecutorAddressesPath( + network: string, + stage = 'prod', +): string { + return resolve( + process.cwd(), + 'deployments', + stage, + 'addresses', + `${network}.json`, + ); +} + +export async function readCctpClaimExecutorAddress( + network: string, + stage = 'prod', +): Promise { + const filePath = cctpClaimExecutorAddressesPath(network, stage); + + try { + const raw = await readFile(filePath, 'utf8'); + const deployments = JSON.parse(raw) as Partial; + const address = deployments.CctpClaimExecutor?.trim(); + + if (!address) { + return undefined; + } + + return address; + } catch (err) { + if ((err as NodeJS.ErrnoException).code === 'ENOENT') { + return undefined; + } + + throw err; + } +} + +/** + * Persists CctpClaimExecutor address for a network. + */ +export async function writeCctpClaimExecutorAddress( + network: string, + address: string, + stage = 'prod', +): Promise { + const filePath = cctpClaimExecutorAddressesPath(network, stage); + let deployments: Partial = {}; + + try { + const raw = await readFile(filePath, 'utf8'); + deployments = JSON.parse(raw) as Partial; + } catch (err) { + if ((err as NodeJS.ErrnoException).code !== 'ENOENT') { + throw err; + } + } + + deployments.CctpClaimExecutor = address; + + await mkdir(dirname(filePath), { recursive: true }); + await writeFile( + filePath, + `${JSON.stringify(deployments, null, 2)}\n`, + 'utf8', + ); + + return filePath; +} diff --git a/scripts/deploy/cctpClaimExecutorConfig.ts b/scripts/deploy/cctpClaimExecutorConfig.ts new file mode 100644 index 0000000..b649fab --- /dev/null +++ b/scripts/deploy/cctpClaimExecutorConfig.ts @@ -0,0 +1,95 @@ +/** + * Per-chain Circle CCTP v2 config for CctpClaimExecutor deployment. + */ +import { CHAIN_IDS } from '../e2e/config'; + +export const CCTP_MESSAGE_TRANSMITTER = + '0x81D40F21F12A8F0E3252Bccb954D722d4c464B64'; + +export type CctpClaimExecutorChainConfig = { + chainId: number; + usdcAddress: string; + messageTransmitter: string; +}; + +export const CCTP_CLAIM_EXECUTOR_CHAIN_CONFIG: Record = { + [CHAIN_IDS.ETHEREUM]: { + chainId: CHAIN_IDS.ETHEREUM, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', + }, + [CHAIN_IDS.AVALANCHE]: { + chainId: CHAIN_IDS.AVALANCHE, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E', + }, + [CHAIN_IDS.BASE]: { + chainId: CHAIN_IDS.BASE, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', + }, + [CHAIN_IDS.LINEA]: { + chainId: CHAIN_IDS.LINEA, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0x176211869ca2b568f2a7d4ee941e073a821ee1ff', + }, + [CHAIN_IDS.ARBITRUM]: { + chainId: CHAIN_IDS.ARBITRUM, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0xaf88d065e77c8cc2239327c5edb3a432268e5831', + }, + [CHAIN_IDS.SONIC]: { + chainId: CHAIN_IDS.SONIC, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0x29219dd400f2Bf60E5a23d13Be72B486D4038894', + }, + [CHAIN_IDS.WORLDCHAIN]: { + chainId: CHAIN_IDS.WORLDCHAIN, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0x79A02482A880bCE3F13e09Da970dC34db4CD24d1', + }, + [CHAIN_IDS.OPTIMISM]: { + chainId: CHAIN_IDS.OPTIMISM, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0x0b2c639c533813f4aa9d7837caf62653d097ff85', + }, + [CHAIN_IDS.UNICHAIN]: { + chainId: CHAIN_IDS.UNICHAIN, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0x078D782b760474a361dDA0AF3839290b0EF57AD6', + }, + [CHAIN_IDS.POLYGON]: { + chainId: CHAIN_IDS.POLYGON, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0x3c499c542cef5e3811e1192ce70d8cc03d5c3359', + }, + [CHAIN_IDS.SEI]: { + chainId: CHAIN_IDS.SEI, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392', + }, + [CHAIN_IDS.HYPEREVM]: { + chainId: CHAIN_IDS.HYPEREVM, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0xb88339CB7199b77E23DB6E890353E22632Ba630f', + }, + [CHAIN_IDS.PLUME]: { + chainId: CHAIN_IDS.PLUME, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0x222365EF19F7947e5484218551B56bb3965Aa7aF', + }, + [CHAIN_IDS.INK]: { + chainId: CHAIN_IDS.INK, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0x2D270e6886d130D724215A266106e6832161EAEd', + }, + [CHAIN_IDS.MONAD]: { + chainId: CHAIN_IDS.MONAD, + messageTransmitter: CCTP_MESSAGE_TRANSMITTER, + usdcAddress: '0x754704Bc059F8C67012fEd69BC8A327a5aafb603', + }, +}; + +export const CCTP_CLAIM_EXECUTOR_CHAIN_IDS = Object.keys(CCTP_CLAIM_EXECUTOR_CHAIN_CONFIG).map( + (id) => Number(id), +); diff --git a/scripts/deploy/create3.ts b/scripts/deploy/create3.ts index d3d5071..e37dd67 100644 --- a/scripts/deploy/create3.ts +++ b/scripts/deploy/create3.ts @@ -71,6 +71,14 @@ export const RFQ_VAULT_EXECUTOR_CREATE3_SALT = keccak256( toUtf8Bytes(RFQ_VAULT_EXECUTOR_CREATE3_SALT_TEXT), ); +/** CREATE3 salt label used by `deployCctpClaimExecutor.ts`. */ +export const CCTP_CLAIM_EXECUTOR_CREATE3_SALT_TEXT = 'CctpClaimExecutor'; + +/** Keccak256 salt for deterministic CctpClaimExecutor CREATE3 deployments. */ +export const CCTP_CLAIM_EXECUTOR_CREATE3_SALT = keccak256( + toUtf8Bytes(CCTP_CLAIM_EXECUTOR_CREATE3_SALT_TEXT), +); + const ADDR_HEX_RE = /^0x[a-fA-F0-9]{40}$/; const CREATE3_PROXY_INIT_CODE_HASH = keccak256( '0x67363d3d37363d34f03d5260086018f3', diff --git a/scripts/deploy/deployCctpClaimExecutor.ts b/scripts/deploy/deployCctpClaimExecutor.ts new file mode 100644 index 0000000..d869a33 --- /dev/null +++ b/scripts/deploy/deployCctpClaimExecutor.ts @@ -0,0 +1,256 @@ +/** + * Deployment script for CctpClaimExecutor via CreateX CREATE3. + * + * Usage: + * npx hardhat run scripts/deploy/deployCctpClaimExecutor.ts --network + * + * Required env vars: + * DEPLOYER_PRIVATE_KEY + * SOLVER_SIGNER_ADDRESS + * + * Optional env vars: + * OWNER_ADDRESS — defaults to DEFAULT_OWNER_ADDRESS or deployer + */ + +import hre, { ethers } from 'hardhat'; +import { + CREATE_X_FACTORY, + Create3ABI, + CCTP_CLAIM_EXECUTOR_CREATE3_SALT, + CCTP_CLAIM_EXECUTOR_CREATE3_SALT_TEXT, + decodeCreate3DeploymentFromTxReceipt, + hasContractBytecode, +} from './create3'; +import { writeCctpClaimExecutorAddress } from './cctpClaimExecutorAddresses'; +import { CCTP_CLAIM_EXECUTOR_CHAIN_CONFIG } from './cctpClaimExecutorConfig'; + +const DEFAULT_OWNER_ADDRESS = '0x0E1B5AB67aF1c99F8c7Ebc71f41f75D4D6211e53'; + +const ADDR_HEX_RE = /^0x[a-fA-F0-9]{40}$/; +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000'; + +function resolveOwnerAddress(deployerAddress: string): string { + const envOwner = process.env.OWNER_ADDRESS?.trim(); + if (envOwner && ADDR_HEX_RE.test(envOwner)) { + return envOwner; + } + + if (DEFAULT_OWNER_ADDRESS && ADDR_HEX_RE.test(DEFAULT_OWNER_ADDRESS)) { + return DEFAULT_OWNER_ADDRESS; + } + + return deployerAddress; +} + +function resolveSolverSignerAddress(): string { + const envSolverSigner = process.env.SOLVER_SIGNER_ADDRESS?.trim(); + if (!envSolverSigner) { + throw new Error('SOLVER_SIGNER_ADDRESS is required'); + } + + if (!ADDR_HEX_RE.test(envSolverSigner)) { + throw new Error(`Invalid SOLVER_SIGNER_ADDRESS: ${envSolverSigner}`); + } + + if (envSolverSigner.toLowerCase() === ZERO_ADDRESS) { + throw new Error('SOLVER_SIGNER_ADDRESS cannot be zero'); + } + + return envSolverSigner; +} + +async function getCctpClaimExecutorInitcode(params: { + owner: string; + messageTransmitter: string; + solverSigner: string; + usdcAddress: string; +}): Promise { + const factory = await ethers.getContractFactory('CctpClaimExecutor'); + const deployTransaction = await factory.getDeployTransaction( + params.owner, + params.messageTransmitter, + params.solverSigner, + params.usdcAddress, + ); + + if (!deployTransaction.data) { + throw new Error('CctpClaimExecutor deploy transaction data is empty'); + } + + return deployTransaction.data; +} + +async function assertCctpClaimExecutorDeployment(params: { + address: string; + owner: string; + messageTransmitter: string; + solverSigner: string; + usdcAddress: string; +}): Promise { + const contract = new ethers.Contract( + params.address, + [ + 'function owner() view returns (address)', + 'function SOLVER_SIGNER() view returns (address)', + 'function MESSAGE_TRANSMITTER() view returns (address)', + 'function USDC() view returns (address)', + ], + ethers.provider, + ); + + const [owner, solverSigner, messageTransmitter, usdc] = await Promise.all([ + contract.owner() as Promise, + contract.SOLVER_SIGNER() as Promise, + contract.MESSAGE_TRANSMITTER() as Promise, + contract.USDC() as Promise, + ]); + + if (owner.toLowerCase() !== params.owner.toLowerCase()) { + throw new Error(`CctpClaimExecutor owner mismatch: expected ${params.owner}, got ${owner}`); + } + + if (solverSigner.toLowerCase() !== params.solverSigner.toLowerCase()) { + throw new Error( + `CctpClaimExecutor SOLVER_SIGNER mismatch: expected ${params.solverSigner}, got ${solverSigner}`, + ); + } + + if (messageTransmitter.toLowerCase() !== params.messageTransmitter.toLowerCase()) { + throw new Error( + `CctpClaimExecutor MESSAGE_TRANSMITTER mismatch: expected ${params.messageTransmitter}, got ${messageTransmitter}`, + ); + } + + if (usdc.toLowerCase() !== params.usdcAddress.toLowerCase()) { + throw new Error(`CctpClaimExecutor USDC mismatch: expected ${params.usdcAddress}, got ${usdc}`); + } +} + +function printBackendConfigSnippet(chainId: number, address: string): void { + console.log('\n=== bungee-backend / transmitter config snippet ==='); + console.log(` [${chainId}]: '${address}',`); +} + +async function persistCctpClaimExecutorAddress(params: { + network: string; + chainId: number; + address: string; +}): Promise { + const filePath = await writeCctpClaimExecutorAddress(params.network, params.address); + console.log('Deployment JSON:', filePath); + printBackendConfigSnippet(params.chainId, params.address); +} + +async function main() { + const [deployer] = await ethers.getSigners(); + const networkName = hre.network.name; + const chainId = Number((await ethers.provider.getNetwork()).chainId); + + const chainConfig = CCTP_CLAIM_EXECUTOR_CHAIN_CONFIG[chainId]; + if (!chainConfig) { + throw new Error(`Chain ${chainId} is not configured for CctpClaimExecutor deployment`); + } + + console.log('Deployer: ', deployer.address); + console.log('Network: ', networkName); + console.log('Chain ID: ', chainId); + console.log('CREATE3 salt: ', CCTP_CLAIM_EXECUTOR_CREATE3_SALT_TEXT); + console.log(''); + + const owner = resolveOwnerAddress(deployer.address); + const solverSigner = resolveSolverSignerAddress(); + + console.log('Owner: ', owner); + console.log('SolverSigner: ', solverSigner); + console.log('MessageTransmitter: ', chainConfig.messageTransmitter); + console.log('USDC: ', chainConfig.usdcAddress); + console.log(''); + + const initcode = await getCctpClaimExecutorInitcode({ + owner, + messageTransmitter: chainConfig.messageTransmitter, + solverSigner, + usdcAddress: chainConfig.usdcAddress, + }); + + const create3Factory = new ethers.Contract(CREATE_X_FACTORY, Create3ABI, deployer); + + const expectedAddress = (await create3Factory.deployCreate3.staticCall( + CCTP_CLAIM_EXECUTOR_CREATE3_SALT, + initcode, + )) as string; + + console.log('Expected address:', expectedAddress); + + const existingBytecode = await ethers.provider.getCode(expectedAddress); + if (hasContractBytecode(existingBytecode)) { + console.log(`CctpClaimExecutor already deployed at ${expectedAddress}`); + await assertCctpClaimExecutorDeployment({ + address: expectedAddress, + owner, + messageTransmitter: chainConfig.messageTransmitter, + solverSigner, + usdcAddress: chainConfig.usdcAddress, + }); + await persistCctpClaimExecutorAddress({ + network: networkName, + chainId, + address: expectedAddress, + }); + return; + } + + console.log('Deploying CctpClaimExecutor via CREATE3...'); + const create3Deployment = await create3Factory.deployCreate3( + CCTP_CLAIM_EXECUTOR_CREATE3_SALT, + initcode, + ); + console.log('CREATE3 deployment tx:', create3Deployment.hash); + + const receipt = await create3Deployment.wait(); + const executorAddress = decodeCreate3DeploymentFromTxReceipt({ receipt }); + if (!executorAddress) { + throw new Error('CctpClaimExecutor address not found in CREATE3 deployment receipt'); + } + + if (executorAddress.toLowerCase() !== expectedAddress.toLowerCase()) { + throw new Error( + `Deployed address ${executorAddress} does not match staticCall ${expectedAddress}`, + ); + } + + await assertCctpClaimExecutorDeployment({ + address: executorAddress, + owner, + messageTransmitter: chainConfig.messageTransmitter, + solverSigner, + usdcAddress: chainConfig.usdcAddress, + }); + + console.log('\n=== Deployment Summary ==='); + console.log(`CctpClaimExecutor (${networkName}): ${executorAddress}`); + await persistCctpClaimExecutorAddress({ + network: networkName, + chainId, + address: executorAddress, + }); + + if (chainId !== 31337) { + await new Promise((resolve) => setTimeout(resolve, 5000)); + + await hre.run('verify:verify', { + address: executorAddress, + constructorArguments: [ + owner, + chainConfig.messageTransmitter, + solverSigner, + chainConfig.usdcAddress, + ], + }); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/scripts/deploy/deployCctpClaimExecutorAllChains.ts b/scripts/deploy/deployCctpClaimExecutorAllChains.ts new file mode 100644 index 0000000..5c9358a --- /dev/null +++ b/scripts/deploy/deployCctpClaimExecutorAllChains.ts @@ -0,0 +1,409 @@ +/** + * Deploys CctpClaimExecutor on all CCTP destination chains via CreateX CREATE3. + * + * Usage: + * OWNER_ADDRESS=0x... SOLVER_SIGNER_ADDRESS=0x... npx ts-node scripts/deploy/deployCctpClaimExecutorAllChains.ts + * + * Required env: + * DEPLOYER_PRIVATE_KEY + * OWNER_ADDRESS + * SOLVER_SIGNER_ADDRESS + * + * Optional env: + * DRY_RUN=true + * CHAINS=base,arbitrum + * PARALLELISM=6 + */ + +import { readFile } from 'fs/promises'; +import { resolve } from 'path'; +import { + AbiCoder, + Contract, + JsonRpcProvider, + Wallet, + ZeroAddress, + formatEther, + isAddress, + keccak256, +} from 'ethers'; +import { + CREATE_X_FACTORY, + Create3ABI, + CCTP_CLAIM_EXECUTOR_CREATE3_SALT, + CCTP_CLAIM_EXECUTOR_CREATE3_SALT_TEXT, + computeFinalAddress, + decodeCreate3DeploymentFromTxReceipt, + hasContractBytecode, +} from './create3'; +import { + RECEIVER_DEPLOY_NETWORKS, + ReceiverDeployNetwork, + resolveRpcUrl, +} from './networks'; +import { getDeploymentTransactionOverrides } from './transactionOverrides'; +import { writeCctpClaimExecutorAddress } from './cctpClaimExecutorAddresses'; +import { + CCTP_CLAIM_EXECUTOR_CHAIN_CONFIG, + CCTP_CLAIM_EXECUTOR_CHAIN_IDS, +} from './cctpClaimExecutorConfig'; + +type NetworkRunResult = { + deployed: number; + alreadyDeployed: number; + dryRun: number; + failed: number; +}; + +type CctpClaimExecutorArtifact = { + abi: unknown[]; + bytecode: { + object?: string; + }; +}; + +const EMPTY_RESULT: NetworkRunResult = { + deployed: 0, + alreadyDeployed: 0, + dryRun: 0, + failed: 0, +}; + +const TX_WAIT_TIMEOUT_MS = Number(process.env.TX_WAIT_TIMEOUT_MS?.trim() || '10000'); + +const DEFAULT_OWNER_ADDRESS = '0x0E1B5AB67aF1c99F8c7Ebc71f41f75D4D6211e53'; + +function resolvePrivateKey(): string { + const key = process.env.DEPLOYER_PRIVATE_KEY?.trim(); + if (!key) { + throw new Error('DEPLOYER_PRIVATE_KEY is required'); + } + + return key.startsWith('0x') ? key : `0x${key}`; +} + +function resolveAddressEnv(name: string, fallback?: string): string { + const address = process.env[name]?.trim() ?? fallback?.trim(); + if (!address) { + throw new Error(`${name} is required`); + } + if (!isAddress(address)) { + throw new Error(`Invalid ${name}: ${address}`); + } + if (address.toLowerCase() === ZeroAddress.toLowerCase()) { + throw new Error(`${name} cannot be zero`); + } + + return address; +} + +function parseChainFilter(): Set | null { + const raw = process.env.CHAINS?.trim(); + if (!raw) { + return null; + } + + return new Set( + raw + .split(',') + .map((name) => name.trim().toLowerCase()) + .filter(Boolean), + ); +} + +function resolveParallelism(networkCount: number): number { + const raw = process.env.PARALLELISM?.trim(); + if (!raw) { + return Math.min(6, networkCount); + } + + const parsed = Number(raw); + if (!Number.isInteger(parsed) || parsed <= 0) { + throw new Error(`PARALLELISM must be a positive integer, got ${raw}`); + } + + return Math.min(parsed, networkCount); +} + +function createNetworkProvider(network: ReceiverDeployNetwork): JsonRpcProvider { + return new JsonRpcProvider(resolveRpcUrl(network), network.chainId, { + staticNetwork: true, + }); +} + +async function loadCctpClaimExecutorInitcode(params: { + owner: string; + messageTransmitter: string; + solverSigner: string; + usdcAddress: string; +}): Promise { + const artifactPath = resolve( + process.cwd(), + 'out', + 'CctpClaimExecutor.sol', + 'CctpClaimExecutor.json', + ); + const artifact = JSON.parse(await readFile(artifactPath, 'utf8')) as CctpClaimExecutorArtifact; + const bytecode = artifact.bytecode.object; + if (!bytecode || !bytecode.startsWith('0x')) { + throw new Error(`Invalid CctpClaimExecutor bytecode in ${artifactPath}`); + } + + const constructorArgs = AbiCoder.defaultAbiCoder() + .encode( + ['address', 'address', 'address', 'address'], + [params.owner, params.messageTransmitter, params.solverSigner, params.usdcAddress], + ) + .slice(2); + + return `${bytecode}${constructorArgs}`; +} + +async function waitForReceiptWithTimeout Promise; hash: string }>( + transaction: T, + label: string, +): Promise { + let timeout: NodeJS.Timeout | undefined; + try { + return await Promise.race([ + transaction.wait(), + new Promise((_, reject) => { + timeout = setTimeout( + () => + reject( + new Error( + `${label} transaction ${transaction.hash} was not mined within ${TX_WAIT_TIMEOUT_MS}ms`, + ), + ), + TX_WAIT_TIMEOUT_MS, + ); + }), + ]); + } finally { + if (timeout) { + clearTimeout(timeout); + } + } +} + +async function runWithConcurrency( + items: readonly T[], + concurrency: number, + worker: (item: T) => Promise, +): Promise { + let nextIndex = 0; + const results = new Array(items.length); + + const workers = Array.from({ length: concurrency }, async () => { + while (true) { + const index = nextIndex; + nextIndex += 1; + if (index >= items.length) { + return; + } + + results[index] = await worker(items[index]); + } + }); + + await Promise.all(workers); + return results.map((result) => result ?? EMPTY_RESULT); +} + +async function assertCctpClaimExecutorDeployment(params: { + provider: JsonRpcProvider; + address: string; + owner: string; + messageTransmitter: string; + solverSigner: string; + usdcAddress: string; +}): Promise { + const contract = new Contract( + params.address, + [ + 'function owner() view returns (address)', + 'function SOLVER_SIGNER() view returns (address)', + 'function MESSAGE_TRANSMITTER() view returns (address)', + 'function USDC() view returns (address)', + ], + params.provider, + ); + + const [owner, solverSigner, messageTransmitter, usdc] = (await Promise.all([ + contract.owner(), + contract.SOLVER_SIGNER(), + contract.MESSAGE_TRANSMITTER(), + contract.USDC(), + ])) as [string, string, string, string]; + + if (owner.toLowerCase() !== params.owner.toLowerCase()) { + throw new Error(`CctpClaimExecutor owner mismatch: expected ${params.owner}, got ${owner}`); + } + + if (solverSigner.toLowerCase() !== params.solverSigner.toLowerCase()) { + throw new Error( + `CctpClaimExecutor SOLVER_SIGNER mismatch: expected ${params.solverSigner}, got ${solverSigner}`, + ); + } + + if (messageTransmitter.toLowerCase() !== params.messageTransmitter.toLowerCase()) { + throw new Error( + `CctpClaimExecutor MESSAGE_TRANSMITTER mismatch: expected ${params.messageTransmitter}, got ${messageTransmitter}`, + ); + } + + if (usdc.toLowerCase() !== params.usdcAddress.toLowerCase()) { + throw new Error(`CctpClaimExecutor USDC mismatch: expected ${params.usdcAddress}, got ${usdc}`); + } +} + +async function deployNetwork(params: { + network: ReceiverDeployNetwork; + deployerPrivateKey: string; + owner: string; + solverSigner: string; + dryRun: boolean; +}): Promise { + const { network, deployerPrivateKey, owner, solverSigner, dryRun } = params; + console.log(`--- ${network.name} (chainId=${network.chainId}) ---`); + + const chainConfig = CCTP_CLAIM_EXECUTOR_CHAIN_CONFIG[network.chainId]; + if (!chainConfig) { + console.log(` [${network.name}] Skipped — not a CCTP destination chain`); + return EMPTY_RESULT; + } + + try { + const initcode = await loadCctpClaimExecutorInitcode({ + owner, + messageTransmitter: chainConfig.messageTransmitter, + solverSigner, + usdcAddress: chainConfig.usdcAddress, + }); + + const provider = createNetworkProvider(network); + const wallet = new Wallet(deployerPrivateKey, provider); + const create3Factory = new Contract(CREATE_X_FACTORY, Create3ABI, wallet); + const expectedAddress = await computeFinalAddress(CCTP_CLAIM_EXECUTOR_CREATE3_SALT, create3Factory); + const existingBytecode = await provider.getCode(expectedAddress); + + if (hasContractBytecode(existingBytecode)) { + await assertCctpClaimExecutorDeployment({ + provider, + address: expectedAddress, + owner, + messageTransmitter: chainConfig.messageTransmitter, + solverSigner, + usdcAddress: chainConfig.usdcAddress, + }); + await writeCctpClaimExecutorAddress(network.name, expectedAddress); + console.log(` [${network.name}] Already deployed: ${expectedAddress}`); + return { ...EMPTY_RESULT, alreadyDeployed: 1 }; + } + + if (dryRun) { + console.log(` [${network.name}] Would deploy to ${expectedAddress}`); + return { ...EMPTY_RESULT, dryRun: 1 }; + } + + const balance = await provider.getBalance(wallet.address); + console.log(` [${network.name}] Deployer balance: ${formatEther(balance)} ETH`); + + const txOverrides = await getDeploymentTransactionOverrides({ + network, + provider, + }); + const create3Deployment = await create3Factory.deployCreate3( + CCTP_CLAIM_EXECUTOR_CREATE3_SALT, + initcode, + txOverrides, + ); + console.log(` [${network.name}] CREATE3 tx: ${create3Deployment.hash}`); + + const receipt = await waitForReceiptWithTimeout( + create3Deployment, + network.name, + ); + + const executorAddress = decodeCreate3DeploymentFromTxReceipt({ + receipt: receipt as Awaited>, + }); + if (!executorAddress) { + throw new Error('CctpClaimExecutor address not found in CREATE3 receipt'); + } + + await assertCctpClaimExecutorDeployment({ + provider, + address: executorAddress, + owner, + messageTransmitter: chainConfig.messageTransmitter, + solverSigner, + usdcAddress: chainConfig.usdcAddress, + }); + + await writeCctpClaimExecutorAddress(network.name, executorAddress); + console.log(` [${network.name}] Deployed: ${executorAddress}`); + return { ...EMPTY_RESULT, deployed: 1 }; + } catch (err) { + console.error(` [${network.name}] FAILED:`, (err as Error).message); + return { ...EMPTY_RESULT, failed: 1 }; + } +} + +async function main() { + const dryRun = process.env.DRY_RUN?.trim().toLowerCase() === 'true'; + const chainFilter = parseChainFilter(); + const deployerPrivateKey = resolvePrivateKey(); + const owner = resolveAddressEnv('OWNER_ADDRESS', DEFAULT_OWNER_ADDRESS); + const solverSigner = resolveAddressEnv('SOLVER_SIGNER_ADDRESS'); + + const networks = RECEIVER_DEPLOY_NETWORKS.filter( + (network) => + CCTP_CLAIM_EXECUTOR_CHAIN_IDS.includes(network.chainId) && + (!chainFilter || chainFilter.has(network.name.toLowerCase())), + ); + + if (networks.length === 0) { + throw new Error('No CCTP networks matched CHAINS filter'); + } + + const parallelism = resolveParallelism(networks.length); + + console.log('CctpClaimExecutor CREATE3 batch deploy'); + console.log('Salt: ', CCTP_CLAIM_EXECUTOR_CREATE3_SALT_TEXT); + console.log('Owner: ', owner); + console.log('SolverSigner: ', solverSigner); + console.log('Networks: ', networks.map((n) => n.name).join(', ')); + console.log('Parallelism: ', parallelism); + console.log('Dry run: ', dryRun); + console.log(''); + + const results = await runWithConcurrency(networks, parallelism, (network) => + deployNetwork({ network, deployerPrivateKey, owner, solverSigner, dryRun }), + ); + + const totals = results.reduce( + (acc, result) => ({ + deployed: acc.deployed + result.deployed, + alreadyDeployed: acc.alreadyDeployed + result.alreadyDeployed, + dryRun: acc.dryRun + result.dryRun, + failed: acc.failed + result.failed, + }), + { deployed: 0, alreadyDeployed: 0, dryRun: 0, failed: 0 }, + ); + + console.log('\n=== Batch summary ==='); + console.log(`Deployed: ${totals.deployed}`); + console.log(`Already deployed: ${totals.alreadyDeployed}`); + console.log(`Dry run: ${totals.dryRun}`); + console.log(`Failed: ${totals.failed}`); + + if (totals.failed > 0) { + process.exit(1); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/scripts/deploy/verifyCctpClaimExecutorBatch.ts b/scripts/deploy/verifyCctpClaimExecutorBatch.ts new file mode 100644 index 0000000..def8ef7 --- /dev/null +++ b/scripts/deploy/verifyCctpClaimExecutorBatch.ts @@ -0,0 +1,599 @@ +/** + * Verifies deployed CctpClaimExecutor source code on block explorers. + * + * Usage: + * SOLVER_SIGNER_ADDRESS=0x... npm run verify:cctp-claim-executor + * SOLVER_SIGNER_ADDRESS=0x... npm run verify:cctp-claim-executor -- polygon base + */ + +import { mkdirSync, readFileSync, writeFileSync } from 'fs'; +import { join, resolve } from 'path'; +import { spawnSync } from 'child_process'; +import { request } from 'https'; +import { URL } from 'url'; +import { AbiCoder, ZeroAddress, isAddress } from 'ethers'; +import { RECEIVER_DEPLOY_NETWORKS } from './networks'; +import { readCctpClaimExecutorAddress } from './cctpClaimExecutorAddresses'; +import { + CCTP_CLAIM_EXECUTOR_CHAIN_CONFIG, + CCTP_CLAIM_EXECUTOR_CHAIN_IDS, + CCTP_MESSAGE_TRANSMITTER, +} from './cctpClaimExecutorConfig'; + +type ExplorerConfig = + | { verifier: 'etherscan'; chainArg: string } + | { verifier: 'custom'; chainArg: string; verifierUrl: string } + | { verifier: 'sourcify'; chainArg: string }; + +interface CctpClaimExecutorDeploymentRecord { + chainId: number; + network: string; + address: string; + constructorArgs: string; +} + +const ADDR_HEX_RE = /^0x[a-fA-F0-9]{40}$/; +const CONTRACT_ID = 'src/executors/CctpClaimExecutor.sol:CctpClaimExecutor'; +const DEFAULT_OWNER_ADDRESS = '0x0E1B5AB67aF1c99F8c7Ebc71f41f75D4D6211e53'; +const ETHERSCAN_V2_HOST = 'api.etherscan.io'; +const ETHERSCAN_V2_IPS = [ + '23.92.68.154', + '23.111.175.138', + '162.252.84.9', + '217.79.240.58', + '217.79.243.34', +]; + +const EXPLORERS_BY_CHAIN_ID = new Map([ + [1, { verifier: 'etherscan', chainArg: '1' }], + [10, { verifier: 'etherscan', chainArg: '10' }], + [130, { verifier: 'etherscan', chainArg: '130' }], + [137, { verifier: 'etherscan', chainArg: '137' }], + [143, { verifier: 'custom', chainArg: '1', verifierUrl: 'https://api.etherscan.io/v2/api?chainid=143' }], + [146, { verifier: 'etherscan', chainArg: '146' }], + [480, { verifier: 'etherscan', chainArg: '480' }], + [999, { verifier: 'etherscan', chainArg: '999' }], + [1329, { verifier: 'custom', chainArg: '1', verifierUrl: 'https://api.etherscan.io/v2/api?chainid=1329' }], + [8453, { verifier: 'etherscan', chainArg: '8453' }], + [98866, { verifier: 'sourcify', chainArg: '98866' }], + [42161, { verifier: 'etherscan', chainArg: '42161' }], + [43114, { verifier: 'etherscan', chainArg: '43114' }], + [57073, { verifier: 'custom', chainArg: '57073', verifierUrl: 'https://explorer.inkonchain.com/api' }], + [59144, { verifier: 'etherscan', chainArg: '59144' }], +]); + +function isAlreadyVerified(output: string): boolean { + return /already verified|already been verified|source code already verified|exact match already verified|similar match source code/i.test( + output, + ); +} + +function isVerified(output: string): boolean { + return /Contract successfully verified|Pass - Verified|Submitted contract for verification|partially matches the deployed version/i.test( + output, + ); +} + +function rpcEnvName(network: string): string { + return `${network.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase()}_RPC`; +} + +function resolveAddressEnv(name: string, fallback?: string): string { + const address = process.env[name]?.trim() ?? fallback?.trim(); + if (!address) { + throw new Error(`${name} is required`); + } + if (!isAddress(address)) { + throw new Error(`Invalid ${name}: ${address}`); + } + if (address.toLowerCase() === ZeroAddress.toLowerCase()) { + throw new Error(`${name} cannot be zero`); + } + + return address; +} + +function resolveEtherscanApiKey(): string { + return ( + process.env.ETHERSCAN_API_KEY?.trim() || + process.env.MAINNET_ETHERSCAN_KEY?.trim() || + '' + ); +} + +function encodeConstructorArgs(params: { + owner: string; + messageTransmitter: string; + solverSigner: string; + usdcAddress: string; +}): string { + return AbiCoder.defaultAbiCoder().encode( + ['address', 'address', 'address', 'address'], + [ + params.owner, + params.messageTransmitter, + params.solverSigner, + params.usdcAddress, + ], + ); +} + +function verifierArgs( + config: ExplorerConfig, + apiKey: string, + network: string, +): string[] { + const args = ['--chain', config.chainArg, '--verifier', config.verifier]; + + if (config.verifier === 'sourcify') { + args.push( + '--verifier-url', + process.env.SOURCIFY_SERVER_URL ?? 'https://sourcify.dev/server', + '--skip-is-verified-check', + ); + const rpcUrl = process.env[rpcEnvName(network)] ?? process.env.ETH_RPC_URL; + if (rpcUrl) { + args.push('--rpc-url', rpcUrl); + } + } + + if (config.verifier === 'custom') { + args.push('--verifier-url', config.verifierUrl, '--verifier-api-key', apiKey); + } else if (config.verifier === 'etherscan') { + args.push('--etherscan-api-key', apiKey); + } + + if (config.verifier === 'custom' && config.chainArg === '1') { + args.push('--skip-is-verified-check'); + } + if (config.verifier === 'etherscan') { + args.push('--skip-is-verified-check'); + } + + return args; +} + +function isEtherscanV2Config(config: ExplorerConfig): boolean { + return ( + config.verifier === 'etherscan' || + (config.verifier === 'custom' && + config.verifierUrl.startsWith('https://api.etherscan.io/v2/api')) + ); +} + +function isSourcifyConfig(config: ExplorerConfig): boolean { + return config.verifier === 'sourcify'; +} + +function etherscanV2Url(config: ExplorerConfig): string { + if (config.verifier === 'etherscan') { + return `https://${ETHERSCAN_V2_HOST}/v2/api?chainid=${config.chainArg}`; + } + + if (config.verifier === 'custom') { + return config.verifierUrl; + } + + throw new Error('Sourcify does not use Etherscan v2'); +} + +function loadStandardJsonInput(): string { + const artifact = JSON.parse( + readFileSync( + resolve( + process.cwd(), + 'out', + 'CctpClaimExecutor.sol', + 'CctpClaimExecutor.json', + ), + 'utf8', + ), + ) as { rawMetadata: string }; + const metadata = JSON.parse(artifact.rawMetadata) as { + settings: Record; + sources: Record; + }; + + const sources: Record = {}; + for (const sourcePath of Object.keys(metadata.sources)) { + sources[sourcePath] = { + content: readFileSync(resolve(process.cwd(), sourcePath), 'utf8'), + }; + } + + const settings = { ...metadata.settings } as Record; + delete settings.compilationTarget; + + return JSON.stringify({ + language: 'Solidity', + sources, + settings, + }); +} + +function compilerVersion(): string { + const artifact = JSON.parse( + readFileSync( + resolve( + process.cwd(), + 'out', + 'CctpClaimExecutor.sol', + 'CctpClaimExecutor.json', + ), + 'utf8', + ), + ) as { rawMetadata: string }; + const metadata = JSON.parse(artifact.rawMetadata) as { + compiler: { version: string }; + }; + + return `v${metadata.compiler.version}`; +} + +function postForm(params: { + url: string; + form: URLSearchParams; +}): Promise { + const parsed = new URL(params.url); + const body = params.form.toString(); + let ipIndex = 0; + + return new Promise((resolvePost, rejectPost) => { + const req = request( + { + protocol: parsed.protocol, + hostname: parsed.hostname, + path: `${parsed.pathname}${parsed.search}`, + method: 'POST', + headers: { + 'content-type': 'application/x-www-form-urlencoded', + 'content-length': Buffer.byteLength(body), + }, + lookup: (hostname, options, callback) => { + if (hostname === ETHERSCAN_V2_HOST) { + const ip = ETHERSCAN_V2_IPS[ipIndex % ETHERSCAN_V2_IPS.length]; + ipIndex += 1; + if (typeof options === 'object' && options.all) { + callback( + null, + ETHERSCAN_V2_IPS.map((address) => ({ address, family: 4 })), + ); + return; + } + callback(null, ip, 4); + return; + } + + callback(new Error(`No custom lookup for ${hostname}`), '', 4); + }, + }, + (res) => { + const chunks: Buffer[] = []; + res.on('data', (chunk) => chunks.push(Buffer.from(chunk))); + res.on('end', () => { + resolvePost(Buffer.concat(chunks).toString('utf8')); + }); + }, + ); + + req.on('error', rejectPost); + req.write(body); + req.end(); + }); +} + +function sleep(ms: number): Promise { + return new Promise((resolveSleep) => setTimeout(resolveSleep, ms)); +} + +async function verifyWithEtherscanV2Direct(params: { + config: ExplorerConfig; + apiKey: string; + address: string; + constructorArgs: string; + standardJsonInput: string; + compilerVersion: string; +}): Promise<{ status: number; output: string }> { + const url = etherscanV2Url(params.config); + const constructorArgs = params.constructorArgs.startsWith('0x') + ? params.constructorArgs.slice(2) + : params.constructorArgs; + const submission = new URLSearchParams({ + apikey: params.apiKey, + module: 'contract', + action: 'verifysourcecode', + contractaddress: params.address, + sourceCode: params.standardJsonInput, + codeformat: 'solidity-standard-json-input', + contractname: CONTRACT_ID, + compilerversion: params.compilerVersion, + optimizationUsed: '1', + runs: '2000', + constructorArguements: constructorArgs, + constructorArguments: constructorArgs, + evmversion: 'cancun', + licenseType: '13', + }); + + const submitRaw = await postForm({ url, form: submission }); + let output = `submit: ${submitRaw}\n`; + const submit = JSON.parse(submitRaw) as { + status?: string; + message?: string; + result?: string; + }; + + if (submit.status !== '1') { + return { + status: + isAlreadyVerified(`${submit.message ?? ''} ${submit.result ?? ''}`) + ? 0 + : 1, + output, + }; + } + + const guid = submit.result ?? ''; + for (let attempt = 0; attempt < 30; attempt += 1) { + await sleep(5_000); + const check = new URLSearchParams({ + apikey: params.apiKey, + module: 'contract', + action: 'checkverifystatus', + guid, + }); + const checkRaw = await postForm({ url, form: check }); + output += `check ${attempt + 1}: ${checkRaw}\n`; + const status = JSON.parse(checkRaw) as { + status?: string; + message?: string; + result?: string; + }; + const result = status.result ?? ''; + if (status.status === '1' || isVerified(result) || isAlreadyVerified(result)) { + return { status: 0, output }; + } + if (!/pending|in queue|already verified/i.test(result)) { + return { status: 1, output }; + } + } + + return { status: 1, output: `${output}timed out waiting for verification\n` }; +} + +async function verifyWithSourcifyV2Direct(params: { + chainId: number; + address: string; + standardJsonInput: string; + compilerVersion: string; +}): Promise<{ status: number; output: string }> { + const baseUrl = process.env.SOURCIFY_SERVER_URL ?? 'https://sourcify.dev/server'; + const submitUrl = `${baseUrl.replace(/\/$/, '')}/v2/verify/${params.chainId}/${params.address}`; + const submitResponse = await fetch(submitUrl, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ + stdJsonInput: JSON.parse(params.standardJsonInput), + compilerVersion: params.compilerVersion.replace(/^v/, ''), + contractIdentifier: CONTRACT_ID, + }), + }); + const submitRaw = await submitResponse.text(); + let output = `submit ${submitResponse.status}: ${submitRaw}\n`; + + if (!submitResponse.ok) { + return { status: 1, output }; + } + + const submit = JSON.parse(submitRaw) as { verificationId?: string }; + const verificationId = submit.verificationId; + if (!verificationId) { + return { status: 1, output: `${output}missing verificationId\n` }; + } + + for (let attempt = 0; attempt < 30; attempt += 1) { + await sleep(5_000); + const checkResponse = await fetch( + `${baseUrl.replace(/\/$/, '')}/v2/verify/${verificationId}`, + ); + const checkRaw = await checkResponse.text(); + output += `check ${attempt + 1} ${checkResponse.status}: ${checkRaw}\n`; + if (!checkResponse.ok) { + return { status: 1, output }; + } + + const check = JSON.parse(checkRaw) as { + isJobCompleted?: boolean; + contract?: { + match?: string | null; + creationMatch?: string | null; + runtimeMatch?: string | null; + }; + error?: { message?: string }; + }; + if (!check.isJobCompleted) { + continue; + } + + if ( + check.contract?.match || + check.contract?.creationMatch || + check.contract?.runtimeMatch + ) { + return { status: 0, output }; + } + + return { status: 1, output }; + } + + return { status: 1, output: `${output}timed out waiting for verification\n` }; +} + +async function readDeploymentRecords(params: { + owner: string; + solverSigner: string; +}): Promise { + const records: CctpClaimExecutorDeploymentRecord[] = []; + const requestedNetworks = new Set(process.argv.slice(2)); + + for (const network of RECEIVER_DEPLOY_NETWORKS) { + if (!CCTP_CLAIM_EXECUTOR_CHAIN_IDS.includes(network.chainId)) { + continue; + } + + if ( + requestedNetworks.size > 0 && + !requestedNetworks.has(network.name) + ) { + continue; + } + + const chainConfig = CCTP_CLAIM_EXECUTOR_CHAIN_CONFIG[network.chainId]; + if (!chainConfig) { + continue; + } + + const address = await readCctpClaimExecutorAddress(network.name); + if (!address) { + throw new Error(`Missing CctpClaimExecutor address for ${network.name}`); + } + if (!ADDR_HEX_RE.test(address)) { + throw new Error( + `Invalid CctpClaimExecutor address for ${network.name}: ${address}`, + ); + } + + records.push({ + chainId: network.chainId, + network: network.name, + address, + constructorArgs: encodeConstructorArgs({ + owner: params.owner, + messageTransmitter: chainConfig.messageTransmitter ?? CCTP_MESSAGE_TRANSMITTER, + solverSigner: params.solverSigner, + usdcAddress: chainConfig.usdcAddress, + }), + }); + } + + return records.sort((a, b) => a.network.localeCompare(b.network)); +} + +async function main() { + const owner = resolveAddressEnv('OWNER_ADDRESS', DEFAULT_OWNER_ADDRESS); + const solverSigner = resolveAddressEnv('SOLVER_SIGNER_ADDRESS'); + const standardJsonInput = loadStandardJsonInput(); + const solcVersion = compilerVersion(); + const apiKey = resolveEtherscanApiKey(); + const records = await readDeploymentRecords({ owner, solverSigner }); + + if (records.length === 0) { + throw new Error('No CctpClaimExecutor deployment records selected'); + } + + const verifyDir = resolve( + process.cwd(), + 'deployments', + 'verify', + 'cctp-claim-executor', + ); + mkdirSync(verifyDir, { recursive: true }); + + const summaryPath = join( + verifyDir, + `summary-${new Date().toISOString().replace(/[-:]/g, '').replace(/\.\d{3}Z$/, 'Z')}.tsv`, + ); + const rows = ['network\tchainId\tstatus\tverifier\taddress']; + + for (const record of records) { + const explorer = EXPLORERS_BY_CHAIN_ID.get(record.chainId); + if (!explorer) { + rows.push( + `${record.network}\t${record.chainId}\tunsupported\t\t${record.address}`, + ); + continue; + } + if (explorer.verifier !== 'sourcify' && !apiKey) { + throw new Error('ETHERSCAN_API_KEY or MAINNET_ETHERSCAN_KEY is required'); + } + + console.log( + `Verifying ${record.network} (${record.chainId}) via ${explorer.verifier}`, + ); + const result = isEtherscanV2Config(explorer) + ? await verifyWithEtherscanV2Direct({ + config: explorer, + apiKey, + address: record.address, + constructorArgs: record.constructorArgs, + standardJsonInput, + compilerVersion: solcVersion, + }) + : isSourcifyConfig(explorer) + ? await verifyWithSourcifyV2Direct({ + chainId: record.chainId, + address: record.address, + standardJsonInput, + compilerVersion: solcVersion, + }) + : (() => { + const spawned = spawnSync( + 'forge', + [ + 'verify-contract', + ...verifierArgs(explorer, apiKey, record.network), + '--compiler-version', + '0.8.34', + '--num-of-optimizations', + '2000', + '--evm-version', + 'cancun', + '--constructor-args', + record.constructorArgs, + '--watch', + record.address, + CONTRACT_ID, + ], + { + cwd: process.cwd(), + encoding: 'utf8', + }, + ); + + return { + status: spawned.status ?? 1, + output: `${spawned.stdout ?? ''}${spawned.stderr ?? ''}`, + }; + })(); + + const output = result.output; + writeFileSync(join(verifyDir, `${record.network}.log`), output); + + let status = 'ok'; + if (result.status !== 0) { + status = + isAlreadyVerified(output) || isVerified(output) + ? 'already_verified' + : 'failed'; + } else if (isAlreadyVerified(output)) { + status = 'already_verified'; + } + + rows.push( + `${record.network}\t${record.chainId}\t${status}\t${explorer.verifier}\t${record.address}`, + ); + console.log(`${record.network}: ${status}`); + } + + writeFileSync(summaryPath, `${rows.join('\n')}\n`); + console.log(`Summary: ${summaryPath}`); + + if (rows.some((row) => row.includes('\tfailed\t'))) { + process.exit(1); + } +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/src/executors/CctpClaimExecutor.sol b/src/executors/CctpClaimExecutor.sol new file mode 100644 index 0000000..5a1bf2d --- /dev/null +++ b/src/executors/CctpClaimExecutor.sol @@ -0,0 +1,154 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity 0.8.34; + +import {AccessControl} from "../common/utils/AccessControl.sol"; +import {AuthenticationLib} from "../common/lib/AuthenticationLib.sol"; +import {CurrencyLib} from "../common/lib/CurrencyLib.sol"; +import {RescueFundsLib} from "../common/lib/RescueFundsLib.sol"; +import {RESCUE_ROLE} from "../common/AccessRoles.sol"; +import {IMessageTransmitter} from "../interfaces/IMessageTransmitter.sol"; + +/// @title CctpClaimExecutor +/// @notice Destination-side CCTP v2 claim executor that receives attested messages, +/// mints USDC via Circle MessageTransmitter, deducts a relay fee, and forwards net USDC. +/// @dev Source burns must set `mintRecipient` and `destinationCaller` to this contract. +/// Claim execution is gated by a SOLVER_SIGNER ECDSA signature over all claim parameters. +contract CctpClaimExecutor is AccessControl { + error InvalidSigner(); + error ZeroAddress(); + error MessageAlreadyClaimed(); + error InsufficientMintedAmount(); + error ReceiveMessageFailed(); + + /// @dev Byte offset of the bytes32 nonce in a CCTP v2 message header. + uint256 internal constant MESSAGE_NONCE_BYTE_OFFSET = 12; + + event CctpClaimExecuted( + bytes32 indexed messageNonce, + address indexed recipient, + address indexed feeTaker, + uint256 relayFee, + uint256 netAmount + ); + + event SolverSignerUpdated(address indexed newSigner); + + IMessageTransmitter public immutable MESSAGE_TRANSMITTER; + address public immutable USDC; + address public SOLVER_SIGNER; + + mapping(bytes32 => bool) public messageNonceClaimed; + + /** + * @param _owner Admin; also granted RESCUE_ROLE. + * @param _messageTransmitter Circle CCTP v2 MessageTransmitter on this chain. + * @param _solverSigner Transmitter/backend signer that authorises claim calls. + * @param _usdc Native Circle USDC on this chain (minted by receiveMessage). + */ + constructor(address _owner, address _messageTransmitter, address _solverSigner, address _usdc) AccessControl(_owner) { + if (_messageTransmitter == address(0) || _solverSigner == address(0) || _usdc == address(0)) { + revert ZeroAddress(); + } + + _grantRole(RESCUE_ROLE, _owner); + MESSAGE_TRANSMITTER = IMessageTransmitter(_messageTransmitter); + SOLVER_SIGNER = _solverSigner; + USDC = _usdc; + } + + /** + * @notice Update the signer address used to authorise claim calls. + * @param _solverSigner New signer address. + */ + function setSolverSigner(address _solverSigner) external onlyOwner { + if (_solverSigner == address(0)) { + revert ZeroAddress(); + } + + SOLVER_SIGNER = _solverSigner; + emit SolverSignerUpdated(_solverSigner); + } + + /** + * @notice Claim a CCTP v2 attested message, take relay fee in USDC, and forward net to recipient. + * @param message Circle attestation message bytes. + * @param attestation Circle attestation signature bytes. + * @param recipient End-user USDC recipient. + * @param feeTaker Relay fee recipient (e.g. protocol treasury). + * @param quotedRelayFee USDC amount (6 decimals) to deduct as relay fee. + * @param signature SOLVER_SIGNER personal-sign signature over all parameters. + */ + function claim( + bytes calldata message, + bytes calldata attestation, + address recipient, + address feeTaker, + uint256 quotedRelayFee, + bytes calldata signature + ) external { + if (recipient == address(0) || feeTaker == address(0)) { + revert ZeroAddress(); + } + + _verifySignature( + keccak256( + abi.encode( + block.chainid, + address(this), + message, + attestation, + recipient, + feeTaker, + quotedRelayFee + ) + ), + signature + ); + + bytes32 messageNonce = _extractMessageNonce(message); + if (messageNonceClaimed[messageNonce]) { + revert MessageAlreadyClaimed(); + } + messageNonceClaimed[messageNonce] = true; + + uint256 balanceBefore = CurrencyLib.balanceOf(USDC, address(this)); + + bool success = MESSAGE_TRANSMITTER.receiveMessage(message, attestation); + if (!success) { + revert ReceiveMessageFailed(); + } + + uint256 mintedAmount = CurrencyLib.balanceOf(USDC, address(this)) - balanceBefore; + if (mintedAmount < quotedRelayFee) { + revert InsufficientMintedAmount(); + } + + uint256 netAmount = mintedAmount - quotedRelayFee; + + CurrencyLib.transfer(USDC, feeTaker, quotedRelayFee); + CurrencyLib.transfer(USDC, recipient, netAmount); + + emit CctpClaimExecuted(messageNonce, recipient, feeTaker, quotedRelayFee, netAmount); + } + + /** + * @notice Rescue funds locked in the contract by mistake. + */ + function rescueFunds(address token, address rescueTo, uint256 amount) external onlyRole(RESCUE_ROLE) { + RescueFundsLib.rescueFunds(token, rescueTo, amount); + } + + function _verifySignature(bytes32 messageHash, bytes calldata signature) internal view { + if (SOLVER_SIGNER != AuthenticationLib.authenticate(messageHash, signature)) { + revert InvalidSigner(); + } + } + + function _extractMessageNonce(bytes calldata message) internal pure returns (bytes32 messageNonce) { + require(message.length >= MESSAGE_NONCE_BYTE_OFFSET + 32, "invalid message length"); + + assembly { + messageNonce := calldataload(add(message.offset, MESSAGE_NONCE_BYTE_OFFSET)) + } + } +} diff --git a/src/interfaces/IMessageTransmitter.sol b/src/interfaces/IMessageTransmitter.sol new file mode 100644 index 0000000..42b3e36 --- /dev/null +++ b/src/interfaces/IMessageTransmitter.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0-only +pragma solidity 0.8.34; + +/// @notice Minimal Circle CCTP v2 MessageTransmitter surface used by CctpClaimExecutor. +interface IMessageTransmitter { + function receiveMessage(bytes calldata message, bytes calldata attestation) external returns (bool success); + + function usedNonces(bytes32 nonce) external view returns (uint256); +} diff --git a/test/unit/CctpClaimExecutor.t.sol b/test/unit/CctpClaimExecutor.t.sol new file mode 100644 index 0000000..d4cb884 --- /dev/null +++ b/test/unit/CctpClaimExecutor.t.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.34; + +import {Test} from "forge-std/Test.sol"; +import {ERC20} from "solady/src/tokens/ERC20.sol"; + +import {CctpClaimExecutor} from "../../src/executors/CctpClaimExecutor.sol"; +import {AuthenticationLib} from "../../src/common/lib/AuthenticationLib.sol"; +import {IMessageTransmitter} from "../../src/interfaces/IMessageTransmitter.sol"; + +contract CctpClaimExecutorTest is Test { + uint256 internal constant SOLVER_PRIVATE_KEY = 0xA11CE; + uint256 internal constant MINT_AMOUNT = 1_000_000; // 1 USDC (6 decimals) + uint256 internal constant RELAY_FEE = 50_000; // 0.05 USDC + + address internal constant OWNER = address(0x2222); + address internal constant RECIPIENT = address(0xB0B); + address internal constant FEE_TAKER = address(0xFEE); + address internal constant OTHER = address(0xCAFE); + + address internal solverSigner; + CctpClaimExecutor internal executor; + MockMessageTransmitter internal transmitter; + MockERC20 internal usdc; + + bytes internal message; + bytes internal attestation; + + function setUp() public { + solverSigner = vm.addr(SOLVER_PRIVATE_KEY); + + usdc = new MockERC20("USD Coin", "USDC"); + transmitter = new MockMessageTransmitter(address(usdc)); + executor = new CctpClaimExecutor(OWNER, address(transmitter), solverSigner, address(usdc)); + + message = _buildMessage(bytes32(uint256(42))); + attestation = hex"abcd"; + + vm.label(address(executor), "executor"); + vm.label(address(transmitter), "transmitter"); + vm.label(address(usdc), "usdc"); + vm.label(RECIPIENT, "recipient"); + vm.label(FEE_TAKER, "feeTaker"); + vm.label(solverSigner, "solverSigner"); + } + + function test_claim_transfersFeeAndNet() public { + transmitter.setMintAmount(MINT_AMOUNT); + + bytes memory signature = _signClaim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE); + + vm.expectEmit(true, true, true, true, address(executor)); + emit CctpClaimExecutor.CctpClaimExecuted( + bytes32(uint256(42)), + RECIPIENT, + FEE_TAKER, + RELAY_FEE, + MINT_AMOUNT - RELAY_FEE + ); + + executor.claim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE, signature); + + assertEq(usdc.balanceOf(FEE_TAKER), RELAY_FEE); + assertEq(usdc.balanceOf(RECIPIENT), MINT_AMOUNT - RELAY_FEE); + assertTrue(executor.messageNonceClaimed(bytes32(uint256(42)))); + } + + function test_claim_revertsIfInvalidSigner() public { + transmitter.setMintAmount(MINT_AMOUNT); + + bytes memory signature = _signClaimWithKey( + 0xBEEF, + message, + attestation, + RECIPIENT, + FEE_TAKER, + RELAY_FEE + ); + + vm.expectRevert(CctpClaimExecutor.InvalidSigner.selector); + executor.claim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE, signature); + } + + function test_claim_revertsIfWrongRecipientInSignature() public { + transmitter.setMintAmount(MINT_AMOUNT); + + bytes memory signature = _signClaim(message, attestation, OTHER, FEE_TAKER, RELAY_FEE); + + vm.expectRevert(CctpClaimExecutor.InvalidSigner.selector); + executor.claim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE, signature); + } + + function test_claim_revertsOnReplay() public { + transmitter.setMintAmount(MINT_AMOUNT); + + bytes memory signature = _signClaim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE); + executor.claim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE, signature); + + vm.expectRevert(CctpClaimExecutor.MessageAlreadyClaimed.selector); + executor.claim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE, signature); + } + + function test_claim_revertsIfInsufficientMint() public { + transmitter.setMintAmount(RELAY_FEE - 1); + + bytes memory signature = _signClaim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE); + + vm.expectRevert(CctpClaimExecutor.InsufficientMintedAmount.selector); + executor.claim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE, signature); + } + + function test_claim_revertsIfZeroRecipient() public { + bytes memory signature = _signClaim(message, attestation, address(0), FEE_TAKER, RELAY_FEE); + + vm.expectRevert(CctpClaimExecutor.ZeroAddress.selector); + executor.claim(message, attestation, address(0), FEE_TAKER, RELAY_FEE, signature); + } + + function test_rescueFunds_onlyOwner() public { + usdc.mint(address(executor), MINT_AMOUNT); + + vm.prank(OTHER); + vm.expectRevert(); + executor.rescueFunds(address(usdc), OWNER, MINT_AMOUNT); + + vm.prank(OWNER); + executor.rescueFunds(address(usdc), OWNER, MINT_AMOUNT); + + assertEq(usdc.balanceOf(OWNER), MINT_AMOUNT); + } + + function _signClaim( + bytes memory message_, + bytes memory attestation_, + address recipient, + address feeTaker, + uint256 quotedRelayFee + ) internal view returns (bytes memory) { + return _signClaimWithKey( + SOLVER_PRIVATE_KEY, + message_, + attestation_, + recipient, + feeTaker, + quotedRelayFee + ); + } + + function _signClaimWithKey( + uint256 privateKey, + bytes memory message_, + bytes memory attestation_, + address recipient, + address feeTaker, + uint256 quotedRelayFee + ) internal view returns (bytes memory) { + bytes32 messageHash = keccak256( + abi.encode( + block.chainid, + address(executor), + message_, + attestation_, + recipient, + feeTaker, + quotedRelayFee + ) + ); + return _signMessage(privateKey, messageHash); + } + + function _signMessage(uint256 privateKey, bytes32 messageHash) internal pure returns (bytes memory) { + bytes32 ethSigned = AuthenticationLib.getEthSignedMessageHash(messageHash); + (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, ethSigned); + return abi.encodePacked(r, s, v); + } + + function _buildMessage(bytes32 nonce) internal pure returns (bytes memory) { + bytes memory header = new bytes(44); + assembly { + mstore(add(add(header, 0x20), 12), nonce) + } + return header; + } +} + +contract MockERC20 is ERC20 { + string private _name; + string private _symbol; + + constructor(string memory name_, string memory symbol_) { + _name = name_; + _symbol = symbol_; + } + + function name() public view override returns (string memory) { + return _name; + } + + function symbol() public view override returns (string memory) { + return _symbol; + } + + function mint(address to, uint256 amount) external { + _mint(to, amount); + } +} + +contract MockMessageTransmitter is IMessageTransmitter { + IERC20Mintable internal immutable usdc; + uint256 internal mintAmount; + + constructor(address usdc_) { + usdc = IERC20Mintable(usdc_); + } + + function setMintAmount(uint256 amount) external { + mintAmount = amount; + } + + function receiveMessage(bytes calldata, bytes calldata) external returns (bool) { + if (mintAmount > 0) { + usdc.mint(msg.sender, mintAmount); + } + return true; + } + + function usedNonces(bytes32) external pure returns (uint256) { + return 0; + } +} + +interface IERC20Mintable { + function mint(address to, uint256 amount) external; +} From eb2b591f4b3cd98dd4de3f245b3e341a6055dbf7 Mon Sep 17 00:00:00 2001 From: reddyismav Date: Tue, 23 Jun 2026 16:34:42 +0400 Subject: [PATCH 11/11] feat: cctp executor --- OPENROUTER_CONTEXT.md | 5 +- deployments/prod/addresses/arbitrum.json | 2 +- deployments/prod/addresses/avalanche.json | 2 +- deployments/prod/addresses/base.json | 2 +- deployments/prod/addresses/ethereum.json | 2 +- deployments/prod/addresses/hyperEvm.json | 2 +- deployments/prod/addresses/ink.json | 2 +- deployments/prod/addresses/linea.json | 2 +- deployments/prod/addresses/monad.json | 2 +- deployments/prod/addresses/optimism.json | 2 +- deployments/prod/addresses/plume.json | 2 +- deployments/prod/addresses/polygon.json | 2 +- deployments/prod/addresses/sei.json | 2 +- deployments/prod/addresses/sonic.json | 2 +- deployments/prod/addresses/unichain.json | 2 +- deployments/prod/addresses/worldchain.json | 2 +- scripts/deploy/create3.ts | 6 +- src/executors/CctpClaimExecutor.sol | 119 +++++++++------------ test/unit/CctpClaimExecutor.t.sol | 46 +------- 19 files changed, 72 insertions(+), 134 deletions(-) diff --git a/OPENROUTER_CONTEXT.md b/OPENROUTER_CONTEXT.md index 3bd535c..bd89a92 100644 --- a/OPENROUTER_CONTEXT.md +++ b/OPENROUTER_CONTEXT.md @@ -135,12 +135,13 @@ Deployment helpers: Contract: [`src/executors/CctpClaimExecutor.sol`](src/executors/CctpClaimExecutor.sol) -- CREATE3 salt: `CctpClaimExecutor` (see [`scripts/deploy/create3.ts`](scripts/deploy/create3.ts)) -- Expected address (canonical CreateX): `0x49845419e8146d9b6f5461DAD7f57BaB34b70168` on all deployed chains +- CREATE3 salt: `CctpClaimExecutorV2` (see [`scripts/deploy/create3.ts`](scripts/deploy/create3.ts)) +- Expected address (canonical CreateX): `0x424a31A57F7C63918eCaA2Fac38016A8af5A6eC2` on all deployed chains - Deploy: `scripts/deploy/deployCctpClaimExecutor.ts` (single chain) or `deployCctpClaimExecutorAllChains.ts` - Required env: `DEPLOYER_PRIVATE_KEY`, `SOLVER_SIGNER_ADDRESS` (must match transmitter `SignerService` / `BungeeReceiver.SOLVER_SIGNER`) - Source `depositForBurn` must set `mintRecipient` and `destinationCaller` to the claim executor - Transmitter signs and calls `claim(message, attestation, recipient, feeTaker, quotedRelayFee, signature)`; relay fee is collected in USDC on destination +- Replay protection is on Circle `MessageTransmitter.usedNonces` (no local nonce map); fee split uses minted balance delta minus `quotedRelayFee` Sync deployed address into: diff --git a/deployments/prod/addresses/arbitrum.json b/deployments/prod/addresses/arbitrum.json index e7b302a..831cf36 100644 --- a/deployments/prod/addresses/arbitrum.json +++ b/deployments/prod/addresses/arbitrum.json @@ -1,5 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/avalanche.json b/deployments/prod/addresses/avalanche.json index e7b302a..831cf36 100644 --- a/deployments/prod/addresses/avalanche.json +++ b/deployments/prod/addresses/avalanche.json @@ -1,5 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/base.json b/deployments/prod/addresses/base.json index 46dd98e..3771bfa 100644 --- a/deployments/prod/addresses/base.json +++ b/deployments/prod/addresses/base.json @@ -1,5 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461DAD7f57BaB34b70168" + "CctpClaimExecutor": "0x424a31A57F7C63918eCaA2Fac38016A8af5A6eC2" } diff --git a/deployments/prod/addresses/ethereum.json b/deployments/prod/addresses/ethereum.json index e7b302a..831cf36 100644 --- a/deployments/prod/addresses/ethereum.json +++ b/deployments/prod/addresses/ethereum.json @@ -1,5 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/hyperEvm.json b/deployments/prod/addresses/hyperEvm.json index 522e6ea..cb669b8 100644 --- a/deployments/prod/addresses/hyperEvm.json +++ b/deployments/prod/addresses/hyperEvm.json @@ -1,4 +1,4 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/ink.json b/deployments/prod/addresses/ink.json index 522e6ea..cb669b8 100644 --- a/deployments/prod/addresses/ink.json +++ b/deployments/prod/addresses/ink.json @@ -1,4 +1,4 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/linea.json b/deployments/prod/addresses/linea.json index e7b302a..831cf36 100644 --- a/deployments/prod/addresses/linea.json +++ b/deployments/prod/addresses/linea.json @@ -1,5 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/monad.json b/deployments/prod/addresses/monad.json index 522e6ea..cb669b8 100644 --- a/deployments/prod/addresses/monad.json +++ b/deployments/prod/addresses/monad.json @@ -1,4 +1,4 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/optimism.json b/deployments/prod/addresses/optimism.json index e7b302a..831cf36 100644 --- a/deployments/prod/addresses/optimism.json +++ b/deployments/prod/addresses/optimism.json @@ -1,5 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/plume.json b/deployments/prod/addresses/plume.json index 522e6ea..cb669b8 100644 --- a/deployments/prod/addresses/plume.json +++ b/deployments/prod/addresses/plume.json @@ -1,4 +1,4 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/polygon.json b/deployments/prod/addresses/polygon.json index e7b302a..831cf36 100644 --- a/deployments/prod/addresses/polygon.json +++ b/deployments/prod/addresses/polygon.json @@ -1,5 +1,5 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", "CelerExecutor": "0x61d2608694f786162d835e5773f019aeab64977d", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/sei.json b/deployments/prod/addresses/sei.json index 522e6ea..cb669b8 100644 --- a/deployments/prod/addresses/sei.json +++ b/deployments/prod/addresses/sei.json @@ -1,4 +1,4 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/sonic.json b/deployments/prod/addresses/sonic.json index 522e6ea..cb669b8 100644 --- a/deployments/prod/addresses/sonic.json +++ b/deployments/prod/addresses/sonic.json @@ -1,4 +1,4 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/deployments/prod/addresses/unichain.json b/deployments/prod/addresses/unichain.json index 170aedc..2004128 100644 --- a/deployments/prod/addresses/unichain.json +++ b/deployments/prod/addresses/unichain.json @@ -1,4 +1,4 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461DAD7f57BaB34b70168" + "CctpClaimExecutor": "0x424a31A57F7C63918eCaA2Fac38016A8af5A6eC2" } diff --git a/deployments/prod/addresses/worldchain.json b/deployments/prod/addresses/worldchain.json index 522e6ea..cb669b8 100644 --- a/deployments/prod/addresses/worldchain.json +++ b/deployments/prod/addresses/worldchain.json @@ -1,4 +1,4 @@ { "RFQVaultExecutor": "0x97caCa78AC2a94c67643d07843F85AFAa44a3ea5", - "CctpClaimExecutor": "0x49845419e8146d9b6f5461dad7f57bab34b70168" + "CctpClaimExecutor": "0x424a31a57f7c63918ecaa2fac38016a8af5a6ec2" } diff --git a/scripts/deploy/create3.ts b/scripts/deploy/create3.ts index e37dd67..1b2231f 100644 --- a/scripts/deploy/create3.ts +++ b/scripts/deploy/create3.ts @@ -72,13 +72,17 @@ export const RFQ_VAULT_EXECUTOR_CREATE3_SALT = keccak256( ); /** CREATE3 salt label used by `deployCctpClaimExecutor.ts`. */ -export const CCTP_CLAIM_EXECUTOR_CREATE3_SALT_TEXT = 'CctpClaimExecutor'; +export const CCTP_CLAIM_EXECUTOR_CREATE3_SALT_TEXT = 'CctpClaimExecutorV2'; /** Keccak256 salt for deterministic CctpClaimExecutor CREATE3 deployments. */ export const CCTP_CLAIM_EXECUTOR_CREATE3_SALT = keccak256( toUtf8Bytes(CCTP_CLAIM_EXECUTOR_CREATE3_SALT_TEXT), ); +/** CctpClaimExecutor V2 CREATE3 address for salt `CctpClaimExecutorV2` via canonical CreateX. */ +export const CCTP_CLAIM_EXECUTOR_V2_EXPECTED_ADDRESS = + '0x424a31A57F7C63918eCaA2Fac38016A8af5A6eC2'; + const ADDR_HEX_RE = /^0x[a-fA-F0-9]{40}$/; const CREATE3_PROXY_INIT_CODE_HASH = keccak256( '0x67363d3d37363d34f03d5260086018f3', diff --git a/src/executors/CctpClaimExecutor.sol b/src/executors/CctpClaimExecutor.sol index 5a1bf2d..7010b11 100644 --- a/src/executors/CctpClaimExecutor.sol +++ b/src/executors/CctpClaimExecutor.sol @@ -1,9 +1,10 @@ // SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.34; +import {SafeTransferLib} from "solady/src/utils/SafeTransferLib.sol"; + import {AccessControl} from "../common/utils/AccessControl.sol"; import {AuthenticationLib} from "../common/lib/AuthenticationLib.sol"; -import {CurrencyLib} from "../common/lib/CurrencyLib.sol"; import {RescueFundsLib} from "../common/lib/RescueFundsLib.sol"; import {RESCUE_ROLE} from "../common/AccessRoles.sol"; import {IMessageTransmitter} from "../interfaces/IMessageTransmitter.sol"; @@ -13,23 +14,10 @@ import {IMessageTransmitter} from "../interfaces/IMessageTransmitter.sol"; /// mints USDC via Circle MessageTransmitter, deducts a relay fee, and forwards net USDC. /// @dev Source burns must set `mintRecipient` and `destinationCaller` to this contract. /// Claim execution is gated by a SOLVER_SIGNER ECDSA signature over all claim parameters. +/// Replay protection is delegated to Circle MessageTransmitter `usedNonces`. contract CctpClaimExecutor is AccessControl { error InvalidSigner(); error ZeroAddress(); - error MessageAlreadyClaimed(); - error InsufficientMintedAmount(); - error ReceiveMessageFailed(); - - /// @dev Byte offset of the bytes32 nonce in a CCTP v2 message header. - uint256 internal constant MESSAGE_NONCE_BYTE_OFFSET = 12; - - event CctpClaimExecuted( - bytes32 indexed messageNonce, - address indexed recipient, - address indexed feeTaker, - uint256 relayFee, - uint256 netAmount - ); event SolverSignerUpdated(address indexed newSigner); @@ -37,16 +25,23 @@ contract CctpClaimExecutor is AccessControl { address public immutable USDC; address public SOLVER_SIGNER; - mapping(bytes32 => bool) public messageNonceClaimed; - /** * @param _owner Admin; also granted RESCUE_ROLE. * @param _messageTransmitter Circle CCTP v2 MessageTransmitter on this chain. * @param _solverSigner Transmitter/backend signer that authorises claim calls. * @param _usdc Native Circle USDC on this chain (minted by receiveMessage). */ - constructor(address _owner, address _messageTransmitter, address _solverSigner, address _usdc) AccessControl(_owner) { - if (_messageTransmitter == address(0) || _solverSigner == address(0) || _usdc == address(0)) { + constructor( + address _owner, + address _messageTransmitter, + address _solverSigner, + address _usdc + ) AccessControl(_owner) { + if ( + _messageTransmitter == address(0) || + _solverSigner == address(0) || + _usdc == address(0) + ) { revert ZeroAddress(); } @@ -86,69 +81,51 @@ contract CctpClaimExecutor is AccessControl { uint256 quotedRelayFee, bytes calldata signature ) external { - if (recipient == address(0) || feeTaker == address(0)) { - revert ZeroAddress(); + if ( + SOLVER_SIGNER != + AuthenticationLib.authenticate( + keccak256( + abi.encode( + block.chainid, + address(this), + message, + attestation, + recipient, + feeTaker, + quotedRelayFee + ) + ), + signature + ) + ) { + revert InvalidSigner(); } - _verifySignature( - keccak256( - abi.encode( - block.chainid, - address(this), - message, - attestation, - recipient, - feeTaker, - quotedRelayFee - ) - ), - signature - ); + uint256 balanceBefore = SafeTransferLib.balanceOf(USDC, address(this)); - bytes32 messageNonce = _extractMessageNonce(message); - if (messageNonceClaimed[messageNonce]) { - revert MessageAlreadyClaimed(); - } - messageNonceClaimed[messageNonce] = true; + MESSAGE_TRANSMITTER.receiveMessage(message, attestation); - uint256 balanceBefore = CurrencyLib.balanceOf(USDC, address(this)); + uint256 mintedAmount = SafeTransferLib.balanceOf(USDC, address(this)) - + balanceBefore; - bool success = MESSAGE_TRANSMITTER.receiveMessage(message, attestation); - if (!success) { - revert ReceiveMessageFailed(); + unchecked { + SafeTransferLib.safeTransfer(USDC, feeTaker, quotedRelayFee); + SafeTransferLib.safeTransfer( + USDC, + recipient, + mintedAmount - quotedRelayFee + ); } - - uint256 mintedAmount = CurrencyLib.balanceOf(USDC, address(this)) - balanceBefore; - if (mintedAmount < quotedRelayFee) { - revert InsufficientMintedAmount(); - } - - uint256 netAmount = mintedAmount - quotedRelayFee; - - CurrencyLib.transfer(USDC, feeTaker, quotedRelayFee); - CurrencyLib.transfer(USDC, recipient, netAmount); - - emit CctpClaimExecuted(messageNonce, recipient, feeTaker, quotedRelayFee, netAmount); } /** * @notice Rescue funds locked in the contract by mistake. */ - function rescueFunds(address token, address rescueTo, uint256 amount) external onlyRole(RESCUE_ROLE) { + function rescueFunds( + address token, + address rescueTo, + uint256 amount + ) external onlyRole(RESCUE_ROLE) { RescueFundsLib.rescueFunds(token, rescueTo, amount); } - - function _verifySignature(bytes32 messageHash, bytes calldata signature) internal view { - if (SOLVER_SIGNER != AuthenticationLib.authenticate(messageHash, signature)) { - revert InvalidSigner(); - } - } - - function _extractMessageNonce(bytes calldata message) internal pure returns (bytes32 messageNonce) { - require(message.length >= MESSAGE_NONCE_BYTE_OFFSET + 32, "invalid message length"); - - assembly { - messageNonce := calldataload(add(message.offset, MESSAGE_NONCE_BYTE_OFFSET)) - } - } } diff --git a/test/unit/CctpClaimExecutor.t.sol b/test/unit/CctpClaimExecutor.t.sol index d4cb884..9897093 100644 --- a/test/unit/CctpClaimExecutor.t.sol +++ b/test/unit/CctpClaimExecutor.t.sol @@ -33,7 +33,7 @@ contract CctpClaimExecutorTest is Test { transmitter = new MockMessageTransmitter(address(usdc)); executor = new CctpClaimExecutor(OWNER, address(transmitter), solverSigner, address(usdc)); - message = _buildMessage(bytes32(uint256(42))); + message = hex"abcd"; attestation = hex"abcd"; vm.label(address(executor), "executor"); @@ -49,20 +49,10 @@ contract CctpClaimExecutorTest is Test { bytes memory signature = _signClaim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE); - vm.expectEmit(true, true, true, true, address(executor)); - emit CctpClaimExecutor.CctpClaimExecuted( - bytes32(uint256(42)), - RECIPIENT, - FEE_TAKER, - RELAY_FEE, - MINT_AMOUNT - RELAY_FEE - ); - executor.claim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE, signature); assertEq(usdc.balanceOf(FEE_TAKER), RELAY_FEE); assertEq(usdc.balanceOf(RECIPIENT), MINT_AMOUNT - RELAY_FEE); - assertTrue(executor.messageNonceClaimed(bytes32(uint256(42)))); } function test_claim_revertsIfInvalidSigner() public { @@ -90,32 +80,6 @@ contract CctpClaimExecutorTest is Test { executor.claim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE, signature); } - function test_claim_revertsOnReplay() public { - transmitter.setMintAmount(MINT_AMOUNT); - - bytes memory signature = _signClaim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE); - executor.claim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE, signature); - - vm.expectRevert(CctpClaimExecutor.MessageAlreadyClaimed.selector); - executor.claim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE, signature); - } - - function test_claim_revertsIfInsufficientMint() public { - transmitter.setMintAmount(RELAY_FEE - 1); - - bytes memory signature = _signClaim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE); - - vm.expectRevert(CctpClaimExecutor.InsufficientMintedAmount.selector); - executor.claim(message, attestation, RECIPIENT, FEE_TAKER, RELAY_FEE, signature); - } - - function test_claim_revertsIfZeroRecipient() public { - bytes memory signature = _signClaim(message, attestation, address(0), FEE_TAKER, RELAY_FEE); - - vm.expectRevert(CctpClaimExecutor.ZeroAddress.selector); - executor.claim(message, attestation, address(0), FEE_TAKER, RELAY_FEE, signature); - } - function test_rescueFunds_onlyOwner() public { usdc.mint(address(executor), MINT_AMOUNT); @@ -173,14 +137,6 @@ contract CctpClaimExecutorTest is Test { (uint8 v, bytes32 r, bytes32 s) = vm.sign(privateKey, ethSigned); return abi.encodePacked(r, s, v); } - - function _buildMessage(bytes32 nonce) internal pure returns (bytes memory) { - bytes memory header = new bytes(44); - assembly { - mstore(add(add(header, 0x20), 12), nonce) - } - return header; - } } contract MockERC20 is ERC20 {