From 88d15d03583e7d82bc0b680191854cf18b1e5e0b Mon Sep 17 00:00:00 2001 From: Oleh Komendant Date: Tue, 26 Aug 2025 18:43:19 +0300 Subject: [PATCH 1/3] Rename contract to SPVGateway & update README --- README.md | 145 +++++----- contracts/{SPVContract.sol => SPVGateway.sol} | 82 +++--- .../{ISPVContract.sol => ISPVGateway.sol} | 2 +- ...SPVContractMock.sol => SPVGatewayMock.sol} | 6 +- ...migration.ts => 1_SPVGateway.migration.ts} | 8 +- hardhat.config.ts | 2 +- package.json | 4 +- test/SPVContract.test.ts | 271 +++++++++--------- test/helpers/block-helpers.ts | 4 +- 9 files changed, 258 insertions(+), 266 deletions(-) rename contracts/{SPVContract.sol => SPVGateway.sol} (85%) rename contracts/interfaces/{ISPVContract.sol => ISPVGateway.sol} (99%) rename contracts/mock/{SPVContractMock.sol => SPVGatewayMock.sol} (89%) rename deploy/{1_SPVContract.migration.ts => 1_SPVGateway.migration.ts} (51%) diff --git a/README.md b/README.md index 67af14c..e21f55b 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# 🛡️ SPV Contract: Bitcoin Light Client on EVM -Welcome to the **SPV Contract**, a robust and efficient Solidity implementation for verifying Bitcoin block headers directly on an EVM-compatible blockchain. This contract empowers dApps to act as a **Simplified Payment Verification (SPV)** client, allowing them to validate the existence and inclusion of Bitcoin transactions without needing to run a full Bitcoin node. +# 🛡️ SPV Gateway: Bitcoin Light Client on EVM +Welcome to the **SPV Gateway**, a robust and efficient Solidity implementation for verifying Bitcoin block headers directly on an EVM-compatible blockchain. This contract empowers dApps to act as a **Simplified Payment Verification (SPV)** client, allowing them to validate the existence and inclusion of Bitcoin transactions without needing to run a full Bitcoin node. -# ✨ Why this SPV Contract? -In the decentralized world, connecting different blockchain ecosystems securely is paramount. This SPV contract provides a trust-minimized bridge, enabling smart contracts on EVM chains to cryptographically verify the state of the Bitcoin blockchain. This opens doors for exciting use cases like: +# ✨ Why this SPV Gateway? +In the decentralized world, connecting different blockchain ecosystems securely is paramount. This SPV Gateway provides a trust-minimized bridge, enabling smart contracts on EVM chains to cryptographically verify the state of the Bitcoin blockchain. This opens doors for exciting use cases like: - **Cross-chain bridges** for Bitcoin-backed assets - **Light clients** for dApps that need to confirm Bitcoin transaction finality - **Decentralized custodianship** solutions @@ -26,98 +26,98 @@ In the decentralized world, connecting different blockchain ecosystems securely # ⚙️ How it Works (Under the Hood) The contract operates by receiving raw Bitcoin block headers, which are then parsed and validated against Bitcoin's strict consensus rules. -1. **Header Parsing:** Raw 80-byte Bitcoin block headers are parsed into a structured *BlockHeaderData* format. This involves handling Bitcoin's unique little-endian byte ordering. +1. **Header Parsing:** Raw 80-byte Bitcoin block headers are parsed into a structured *BlockHeader.HeaderData* format. This involves handling Bitcoin's unique little-endian byte ordering. 2. **Double SHA256 Hashing:** Each block header is double SHA256 hashed to derive its unique block hash, which is then byte-reversed for standard representation. 3. **Proof-of-Work Verification:** The calculated block hash is checked against the current network difficulty target (derived from the *bits* field in the header). 4. **Chain Extension & Reorganization:** New blocks are added to a data structure that allows for tracking multiple chains. When a new block extends a chain with higher cumulative work, the *mainchainHead* is updated, reflecting potential chain reorganizations. 5. **Difficulty Adjustment:** Every 2016 blocks, the contract calculates a new difficulty target based on the time taken to mine the preceding epoch. This ensures the 10-minute average block time is maintained. # 📊 Flow Diagrams -These diagrams outline the step-by-step process for adding block headers to the SPV Contract. +These diagrams outline the step-by-step process for adding block headers to the SPV Gateway. ### `addBlockHeader(bytes calldata blockHeaderRaw_)` Sequence Diagram ```mermaid sequenceDiagram participant Caller - participant SPVContract + participant SPVGateway participant BlockHeaderLib participant TargetsHelperLib - Caller->>SPVContract: addBlockHeader(blockHeaderRaw) - activate SPVContract + Caller->>SPVGateway: addBlockHeader(blockHeaderRaw) + activate SPVGateway - SPVContract->>BlockHeaderLib: 1. Parse blockHeaderRaw_ (parseBlockHeaderData) + SPVGateway->>BlockHeaderLib: 1. Parse blockHeaderRaw_ (parseBlockHeaderData) activate BlockHeaderLib - BlockHeaderLib-->>SPVContract: 1.1. Check length (80 bytes) & LE to BE + BlockHeaderLib-->>SPVGateway: 1.1. Check length (80 bytes) & LE to BE alt Length Invalid - BlockHeaderLib--xSPVContract: Error: InvalidBlockHeaderDataLength - SPVContract--xCaller: Revert + BlockHeaderLib--xSPVGateway: Error: InvalidBlockHeaderDataLength + SPVGateway--xCaller: Revert end - BlockHeaderLib-->>SPVContract: 1.2. Return BlockHeaderData & blockHash + BlockHeaderLib-->>SPVGateway: 1.2. Return BlockHeaderData & blockHash deactivate BlockHeaderLib - SPVContract->>SPVContract: 1.3. Check blockHash existence + SPVGateway->>SPVGateway: 1.3. Check blockHash existence alt BlockHash Exists - SPVContract--xCaller: Error: BlockAlreadyExists + SPVGateway--xCaller: Error: BlockAlreadyExists end - SPVContract->>SPVContract: 2. Check prevBlockHash existence + SPVGateway->>SPVGateway: 2. Check prevBlockHash existence alt Prev Block Missing - SPVContract--xCaller: Error: PrevBlockDoesNotExist + SPVGateway--xCaller: Error: PrevBlockDoesNotExist end - SPVContract->>SPVContract: 3. Calculate newBlockHeight = prevBlockHeight + 1 + SPVGateway->>SPVGateway: 3. Calculate newBlockHeight = prevBlockHeight + 1 - SPVContract->>SPVContract: 4. Get Current Target - SPVContract->>SPVContract: 4.1. Get target from prevBlockBits - SPVContract->>TargetsHelperLib: Check if newBlockHeight is Recalculation Block (isTargetAdjustmentBlock) + SPVGateway->>SPVGateway: 4. Get Current Target + SPVGateway->>SPVGateway: 4.1. Get target from prevBlockBits + SPVGateway->>TargetsHelperLib: Check if newBlockHeight is Recalculation Block (isTargetAdjustmentBlock) activate TargetsHelperLib alt Recalculation Block - SPVContract->>SPVContract: Recalculate target & Save lastEpochCumulativeWork - TargetsHelperLib-->>SPVContract: Return newNetworkTarget + SPVGateway->>SPVGateway: Recalculate target & Save lastEpochCumulativeWork + TargetsHelperLib-->>SPVGateway: Return newNetworkTarget else Not Recalculation Block - TargetsHelperLib-->>SPVContract: Use prevBlockTarget as networkTarget + TargetsHelperLib-->>SPVGateway: Use prevBlockTarget as networkTarget end deactivate TargetsHelperLib - SPVContract->>SPVContract: 5. Check Block Rules - SPVContract->>TargetsHelperLib: 5.1. Check Header Target == Contract Target + SPVGateway->>SPVGateway: 5. Check Block Rules + SPVGateway->>TargetsHelperLib: 5.1. Check Header Target == Contract Target activate TargetsHelperLib - TargetsHelperLib-->>SPVContract: Result + TargetsHelperLib-->>SPVGateway: Result deactivate TargetsHelperLib alt Invalid Target - SPVContract--xCaller: Error: InvalidTarget + SPVGateway--xCaller: Error: InvalidTarget end - SPVContract->>SPVContract: 5.2. Check newBlockHash <= networkTarget (PoW) + SPVGateway->>SPVGateway: 5.2. Check newBlockHash <= networkTarget (PoW) alt Invalid Block Hash - SPVContract--xCaller: Error: InvalidBlockHash + SPVGateway--xCaller: Error: InvalidBlockHash end - SPVContract->>SPVContract: 5.3. Check newBlockTime >= medianTime + SPVGateway->>SPVGateway: 5.3. Check newBlockTime >= medianTime alt Invalid Block Time - SPVContract--xCaller: Error: InvalidBlockTime + SPVGateway--xCaller: Error: InvalidBlockTime end - SPVContract->>SPVContract: 6. Add Block To Chain - SPVContract->>SPVContract: 6.1. Save newBlockHeader & newBlockHash to Storage + SPVGateway->>SPVGateway: 6. Add Block To Chain + SPVGateway->>SPVGateway: 6.1. Save newBlockHeader & newBlockHash to Storage - SPVContract->>SPVContract: 6.2. Update Mainchain + SPVGateway->>SPVGateway: 6.2. Update Mainchain alt 6.2.1. prevBlockHash == mainchainHead? - SPVContract->>SPVContract: Move mainchainHead to newBlockHash + SPVGateway->>SPVGateway: Move mainchainHead to newBlockHash else - SPVContract->>SPVContract: 6.2.2. Calculate New Block & Current Head Cumulative Work - SPVContract->>SPVContract: 6.2.3. newBlock Cumulative Work > Current Head? + SPVGateway->>SPVGateway: 6.2.2. Calculate New Block & Current Head Cumulative Work + SPVGateway->>SPVGateway: 6.2.3. newBlock Cumulative Work > Current Head? alt New Block Has Higher Work - SPVContract->>SPVContract: Set New Block as mainchainHead - SPVContract->>SPVContract: Recursively update mainchain path backwards (do-while loop) + SPVGateway->>SPVGateway: Set New Block as mainchainHead + SPVGateway->>SPVGateway: Recursively update mainchain path backwards (do-while loop) end end - SPVContract->>SPVContract: Emit BlockHeaderAdded - SPVContract-->>Caller: Transaction Complete - deactivate SPVContract + SPVGateway->>SPVGateway: Emit BlockHeaderAdded + SPVGateway-->>Caller: Transaction Complete + deactivate SPVGateway ``` ### `addBlockHeaderBatch(bytes[] calldata blockHeaderRawArr_)` Sequence Diagram @@ -127,75 +127,72 @@ This function processes multiple block headers in a single transaction, iteratin ```mermaid sequenceDiagram participant Caller - participant SPVContract + participant SPVGateway participant BlockHeaderLib participant TargetsHelperLib - Caller->>SPVContract: addBlockHeaderBatch(blockHeaderRawArray_) - activate SPVContract + Caller->>SPVGateway: addBlockHeaderBatch(blockHeaderRawArray_) + activate SPVGateway - SPVContract->>SPVContract: Check if Header Array is Empty + SPVGateway->>SPVGateway: Check if Header Array is Empty alt Array Empty - SPVContract--xCaller: Error: EmptyBlockHeaderArray + SPVGateway--xCaller: Error: EmptyBlockHeaderArray end - SPVContract->>BlockHeaderLib: 1. Parse Block Headers Array (_parseBlockHeadersRaw) + SPVGateway->>BlockHeaderLib: 1. Parse Block Headers Array (_parseBlockHeadersRaw) activate BlockHeaderLib - BlockHeaderLib-->>SPVContract: Returns BlockHeaderData[] & bytes32[] + BlockHeaderLib-->>SPVGateway: Returns BlockHeaderData[] & bytes32[] deactivate BlockHeaderLib loop For each blockHeader in parsed array (from i=0 to length-1) - SPVContract->>SPVContract: 2. Check prevBlockHash for current block + SPVGateway->>SPVGateway: 2. Check prevBlockHash for current block alt First block in batch - SPVContract->>SPVContract: Check prevBlockHash existence (like addBlockHeader) + SPVGateway->>SPVGateway: Check prevBlockHash existence (like addBlockHeader) alt Prev Block Missing - SPVContract--xCaller: Error: PrevBlockDoesNotExist + SPVGateway--xCaller: Error: PrevBlockDoesNotExist end else Subsequent blocks - SPVContract->>SPVContract: Check prevBlockHash == blockHash of (i-1)th block + SPVGateway->>SPVGateway: Check prevBlockHash == blockHash of (i-1)th block alt Order Invalid - SPVContract--xCaller: Error: InvalidBlockHeadersOrder + SPVGateway--xCaller: Error: InvalidBlockHeadersOrder end end - SPVContract->>SPVContract: 3. Calculate currentBlockHeight = prevBlockHeight + 1 + SPVGateway->>SPVGateway: 3. Calculate currentBlockHeight = prevBlockHeight + 1 - SPVContract->>SPVContract: 4. Get Current Target (like addBlockHeader) - SPVContract->>TargetsHelperLib: Check for Recalculation Block & Recalculate if needed + SPVGateway->>SPVGateway: 4. Get Current Target (like addBlockHeader) + SPVGateway->>TargetsHelperLib: Check for Recalculation Block & Recalculate if needed activate TargetsHelperLib - TargetsHelperLib-->>SPVContract: Return networkTarget + TargetsHelperLib-->>SPVGateway: Return networkTarget deactivate TargetsHelperLib - SPVContract->>SPVContract: 5. Get Median Time + SPVGateway->>SPVGateway: 5. Get Median Time alt 5.1. Num blocks added < 12 - SPVContract->>SPVContract: Use _getStorageMedianTime (like addBlockHeader) + SPVGateway->>SPVGateway: Use _getStorageMedianTime (like addBlockHeader) else 5.2. Num blocks added >= 12 - SPVContract->>SPVContract: Use _getMemoryMedianTime (from batch data) + SPVGateway->>SPVGateway: Use _getMemoryMedianTime (from batch data) end - SPVContract->>SPVContract: 6. Validate Block Rules (_validateBlockRules) + SPVGateway->>SPVGateway: 6. Validate Block Rules (_validateBlockRules) alt Validation Fails - SPVContract--xCaller: Error: InvalidTarget / InvalidBlockHash / InvalidBlockTime + SPVGateway--xCaller: Error: InvalidTarget / InvalidBlockHash / InvalidBlockTime end - SPVContract->>SPVContract: 7. Add Block To Chain (_addBlock) - SPVContract->>SPVContract: Emit BlockHeaderAdded + SPVGateway->>SPVGateway: 7. Add Block To Chain (_addBlock) + SPVGateway->>SPVGateway: Emit BlockHeaderAdded end - SPVContract-->>Caller: Transaction Complete - deactivate SPVContract + SPVGateway-->>Caller: Transaction Complete + deactivate SPVGateway ``` # 📦 Contract Components -The solution is primarily composed of the main SPV contract and two essential helper libraries that manage the intricacies of Bitcoin's block structure and difficulty adjustments. +The solution primarily consists of the main SPV Gateway contract and the TargetsHelper library, which manages difficulty adjustments. -## SPVContract +## SPVGateway This is the central contract that users will interact with. It serves as the primary interface for managing Bitcoin block headers on the EVM. It handles the core logic for adding and validating blocks, tracking the main Bitcoin chain, and providing querying functionalities. All custom errors and events related to the SPV operations are defined here, ensuring clear feedback and transparency during contract execution. -## BlockHeader Library -This is a pure utility library specifically designed to handle the low-level details of Bitcoin block headers. It's responsible for the precise parsing of raw 80-byte Bitcoin block header data into a structured format that Solidity can easily work with. Crucially, it manages the byte order conversions, translating Bitcoin's little-endian format to Solidity's big-endian, and vice-versa. It also provides the essential function for calculating the double SHA256 hash of a block header, which is fundamental for verifying Proof-of-Work. - ## TargetsHelper Library This library encapsulates all the complex mathematical and logical operations related to Bitcoin's difficulty targets. It provides functions to accurately calculate new difficulty targets based on elapsed time between blocks, ensuring the contract adheres to Bitcoin's dynamic difficulty adjustment rules. Additionally, it offers utilities for converting between the compact "bits" format (as found in Bitcoin block headers) and the full 256-bit target value, and it calculates the cumulative work associated with a given block or epoch, which is vital for determining the most valid chain. diff --git a/contracts/SPVContract.sol b/contracts/SPVGateway.sol similarity index 85% rename from contracts/SPVContract.sol rename to contracts/SPVGateway.sol index 62ad498..659db8e 100644 --- a/contracts/SPVContract.sol +++ b/contracts/SPVGateway.sol @@ -11,19 +11,19 @@ import {LibSort} from "solady/src/utils/LibSort.sol"; import {TargetsHelper} from "./libs/TargetsHelper.sol"; -import {ISPVContract} from "./interfaces/ISPVContract.sol"; +import {ISPVGateway} from "./interfaces/ISPVGateway.sol"; -contract SPVContract is ISPVContract, Initializable { +contract SPVGateway is ISPVGateway, Initializable { using BlockHeader for bytes; using TargetsHelper for bytes32; using EndianConverter for bytes32; uint8 public constant MEDIAN_PAST_BLOCKS = 11; - bytes32 public constant SPV_CONTRACT_STORAGE_SLOT = - keccak256("spv.contract.spv.contract.storage"); + bytes32 public constant SPV_GATEWAY_STORAGE_SLOT = + keccak256("spv.gateway.spv.gateway.storage"); - struct SPVContractStorage { + struct SPVGatewayStorage { mapping(bytes32 => BlockData) blocksData; mapping(uint64 => bytes32) blocksHeightToBlockHash; bytes32 mainchainHead; @@ -40,7 +40,7 @@ contract SPVContract is ISPVContract, Initializable { } } - function __SPVContract_init() external initializer { + function __SPVGateway_init() external initializer { BlockHeader.HeaderData memory genesisBlockHeader_ = BlockHeader.HeaderData({ version: 1, prevBlockHash: bytes32(0), @@ -56,7 +56,7 @@ contract SPVContract is ISPVContract, Initializable { emit MainchainHeadUpdated(0, genesisBlockHash_); } - function __SPVContract_init( + function __SPVGateway_init( bytes calldata blockHeaderRaw_, uint64 blockHeight_, uint256 cumulativeWork_ @@ -71,20 +71,20 @@ contract SPVContract is ISPVContract, Initializable { ); _addBlock(blockHeader_, blockHash_, blockHeight_); - _getSPVContractStorage().lastEpochCumulativeWork = cumulativeWork_; + _getSPVGatewayStorage().lastEpochCumulativeWork = cumulativeWork_; emit MainchainHeadUpdated(blockHeight_, blockHash_); } - function _getSPVContractStorage() private pure returns (SPVContractStorage storage _spvs) { - bytes32 slot_ = SPV_CONTRACT_STORAGE_SLOT; + function _getSPVGatewayStorage() private pure returns (SPVGatewayStorage storage _spvs) { + bytes32 slot_ = SPV_GATEWAY_STORAGE_SLOT; assembly { _spvs.slot := slot_ } } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function addBlockHeaderBatch( bytes[] calldata blockHeaderRawArray_ ) external broadcastMainchainUpdateEvent { @@ -115,7 +115,7 @@ contract SPVContract is ISPVContract, Initializable { } } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function addBlockHeader( bytes calldata blockHeaderRaw_ ) external broadcastMainchainUpdateEvent { @@ -143,7 +143,7 @@ contract SPVContract is ISPVContract, Initializable { _addBlock(blockHeader_, blockHash_, blockHeight_); } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function checkTxInclusion( bytes32[] calldata merkleProof_, bytes32 blockHash_, @@ -162,23 +162,23 @@ contract SPVContract is ISPVContract, Initializable { return TxMerkleProof.verify(merkleProof_, leRoot_, txId_, txIndex_); } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function getMainchainHead() public view returns (bytes32) { - return _getSPVContractStorage().mainchainHead; + return _getSPVGatewayStorage().mainchainHead; } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function getMainchainHeight() public view returns (uint64) { - return getBlockHeight(_getSPVContractStorage().mainchainHead); + return getBlockHeight(_getSPVGatewayStorage().mainchainHead); } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function getBlockInfo(bytes32 blockHash_) external view returns (BlockInfo memory blockInfo_) { if (!blockExists(blockHash_)) { return blockInfo_; } - BlockData memory blockData_ = _getSPVContractStorage().blocksData[blockHash_]; + BlockData memory blockData_ = _getSPVGatewayStorage().blocksData[blockHash_]; blockInfo_ = BlockInfo({ mainBlockData: blockData_, @@ -187,11 +187,11 @@ contract SPVContract is ISPVContract, Initializable { }); } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function getBlockHeader( bytes32 blockHash_ ) public view returns (BlockHeader.HeaderData memory) { - BlockData storage blockData = _getSPVContractStorage().blocksData[blockHash_]; + BlockData storage blockData = _getSPVGatewayStorage().blocksData[blockHash_]; return BlockHeader.HeaderData({ @@ -204,7 +204,7 @@ contract SPVContract is ISPVContract, Initializable { }); } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function getBlockStatus(bytes32 blockHash_) public view returns (bool, uint64) { if (!isInMainchain(blockHash_)) { return (false, 0); @@ -213,37 +213,37 @@ contract SPVContract is ISPVContract, Initializable { return (true, getMainchainHeight() - getBlockHeight(blockHash_)); } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function getBlockMerkleRoot(bytes32 blockHash_) public view returns (bytes32) { - return _getSPVContractStorage().blocksData[blockHash_].merkleRoot; + return _getSPVGatewayStorage().blocksData[blockHash_].merkleRoot; } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function getBlockHeight(bytes32 blockHash_) public view returns (uint64) { - return _getSPVContractStorage().blocksData[blockHash_].blockHeight; + return _getSPVGatewayStorage().blocksData[blockHash_].blockHeight; } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function getBlockHash(uint64 blockHeight_) public view returns (bytes32) { - return _getSPVContractStorage().blocksHeightToBlockHash[blockHeight_]; + return _getSPVGatewayStorage().blocksHeightToBlockHash[blockHeight_]; } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function getBlockTarget(bytes32 blockHash_) public view returns (bytes32) { - return TargetsHelper.bitsToTarget(_getSPVContractStorage().blocksData[blockHash_].bits); + return TargetsHelper.bitsToTarget(_getSPVGatewayStorage().blocksData[blockHash_].bits); } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function getLastEpochCumulativeWork() public view returns (uint256) { - return _getSPVContractStorage().lastEpochCumulativeWork; + return _getSPVGatewayStorage().lastEpochCumulativeWork; } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function blockExists(bytes32 blockHash_) public view returns (bool) { return _getBlockHeaderTime(blockHash_) > 0; } - /// @inheritdoc ISPVContract + /// @inheritdoc ISPVGateway function isInMainchain(bytes32 blockHash_) public view returns (bool) { return getBlockHash(getBlockHeight(blockHash_)) == blockHash_; } @@ -253,7 +253,7 @@ contract SPVContract is ISPVContract, Initializable { bytes32 blockHash_, uint64 blockHeight_ ) internal { - SPVContractStorage storage $ = _getSPVContractStorage(); + SPVGatewayStorage storage $ = _getSPVGatewayStorage(); $.blocksData[blockHash_] = BlockData({ prevBlockHash: blockHeader_.prevBlockHash, @@ -275,7 +275,7 @@ contract SPVContract is ISPVContract, Initializable { bytes32 blockHash_, uint64 blockHeight_ ) internal { - SPVContractStorage storage $ = _getSPVContractStorage(); + SPVGatewayStorage storage $ = _getSPVGatewayStorage(); bytes32 mainchainHead = $.mainchainHead; @@ -302,7 +302,7 @@ contract SPVContract is ISPVContract, Initializable { do { $.blocksHeightToBlockHash[prevBlockHeight_] = prevBlockHash_; - prevBlockHash_ = _getSPVContractStorage().blocksData[prevBlockHash_].prevBlockHash; + prevBlockHash_ = _getSPVGatewayStorage().blocksData[prevBlockHash_].prevBlockHash; unchecked { --prevBlockHeight_; @@ -315,7 +315,7 @@ contract SPVContract is ISPVContract, Initializable { bytes32 currentTarget_, uint64 blockHeight_ ) internal returns (bytes32) { - SPVContractStorage storage $ = _getSPVContractStorage(); + SPVGatewayStorage storage $ = _getSPVGatewayStorage(); if (TargetsHelper.isTargetAdjustmentBlock(blockHeight_)) { $.lastEpochCumulativeWork += TargetsHelper.countEpochCumulativeWork(currentTarget_); @@ -390,7 +390,7 @@ contract SPVContract is ISPVContract, Initializable { uint32 currentTime_ = _getBlockHeaderTime(toBlockHash_); blocksTime_[i - 1] = currentTime_; - toBlockHash_ = _getSPVContractStorage().blocksData[toBlockHash_].prevBlockHash; + toBlockHash_ = _getSPVGatewayStorage().blocksData[toBlockHash_].prevBlockHash; if (i < MEDIAN_PAST_BLOCKS && currentTime_ > blocksTime_[i]) { needsSort_ = true; @@ -432,11 +432,11 @@ contract SPVContract is ISPVContract, Initializable { TargetsHelper.getEpochBlockNumber(blockHeight_) + 1 ); - return _getSPVContractStorage().lastEpochCumulativeWork + currentEpochCumulativeWork_; + return _getSPVGatewayStorage().lastEpochCumulativeWork + currentEpochCumulativeWork_; } function _getBlockHeaderTime(bytes32 blockHash_) internal view returns (uint32) { - return _getSPVContractStorage().blocksData[blockHash_].time; + return _getSPVGatewayStorage().blocksData[blockHash_].time; } function _onlyNonExistingBlock(bytes32 blockHash_) internal view { diff --git a/contracts/interfaces/ISPVContract.sol b/contracts/interfaces/ISPVGateway.sol similarity index 99% rename from contracts/interfaces/ISPVContract.sol rename to contracts/interfaces/ISPVGateway.sol index 3fead53..172245f 100644 --- a/contracts/interfaces/ISPVContract.sol +++ b/contracts/interfaces/ISPVGateway.sol @@ -8,7 +8,7 @@ import {BlockHeader} from "@solarity/solidity-lib/libs/bitcoin/BlockHeader.sol"; * This contract allows for the verification of Bitcoin block headers * and tracking of the main Bitcoin blockchain */ -interface ISPVContract { +interface ISPVGateway { /** * @notice Emitted when an initial block height is invalid. * This error indicates that the provided block height is not valid for initialization diff --git a/contracts/mock/SPVContractMock.sol b/contracts/mock/SPVGatewayMock.sol similarity index 89% rename from contracts/mock/SPVContractMock.sol rename to contracts/mock/SPVGatewayMock.sol index 263eaef..7241f5f 100644 --- a/contracts/mock/SPVContractMock.sol +++ b/contracts/mock/SPVGatewayMock.sol @@ -3,12 +3,12 @@ pragma solidity ^0.8.28; import {BlockHeader} from "@solarity/solidity-lib/libs/bitcoin/BlockHeader.sol"; -import {SPVContract} from "../SPVContract.sol"; +import {SPVGateway} from "../SPVGateway.sol"; -contract SPVContractMock is SPVContract { +contract SPVGatewayMock is SPVGateway { using BlockHeader for bytes; - function __SPVContractMock_init(bytes calldata blockHeaderRaw_) external initializer { + function __SPVGatewayMock_init(bytes calldata blockHeaderRaw_) external initializer { ( BlockHeader.HeaderData memory genesisBlockHeader_, bytes32 genesisBlockHash_ diff --git a/deploy/1_SPVContract.migration.ts b/deploy/1_SPVGateway.migration.ts similarity index 51% rename from deploy/1_SPVContract.migration.ts rename to deploy/1_SPVGateway.migration.ts index 05fe07d..bbf6f29 100644 --- a/deploy/1_SPVContract.migration.ts +++ b/deploy/1_SPVGateway.migration.ts @@ -1,19 +1,19 @@ import { Deployer, Reporter } from "@solarity/hardhat-migrate"; -import { SPVContract__factory } from "@ethers-v6"; +import { SPVGateway__factory } from "@ethers-v6"; import { getConfig } from "./config/config"; export = async (deployer: Deployer) => { const config = (await getConfig())!; - const spvContract = await deployer.deploy(SPVContract__factory); + const spvGateway = await deployer.deploy(SPVGateway__factory); - await spvContract["__SPVContract_init(bytes,uint256,uint256)"]( + await spvGateway["__SPVGateway_init(bytes,uint256,uint256)"]( config.blockHeader, config.blockHeight, config.cumulativeWork, ); - Reporter.reportContracts(["SPVContract", await spvContract.getAddress()]); + Reporter.reportContracts(["SPVGateway", await spvGateway.getAddress()]); }; diff --git a/hardhat.config.ts b/hardhat.config.ts index c51bf64..fed478a 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -88,7 +88,7 @@ const config: HardhatUserConfig = { discriminateTypes: true, }, markup: { - onlyFiles: ["contracts/libs", "contracts/SPVContract.sol", "contracts/interfaces/ISPVContract.sol"], + onlyFiles: ["contracts/libs", "contracts/SPVGateway.sol", "contracts/interfaces/ISPVGateway.sol"], outdir: "docs", }, }; diff --git a/package.json b/package.json index c911ee4..1433359 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "spv-contracts", + "name": "spv-gateway", "version": "0.1.0", "license": "MIT", "author": "Distributed Lab", @@ -8,7 +8,7 @@ "solidity", "smart-contracts", "bitcoin", - "spv-contracts" + "spv-gateway" ], "files": [ "**/*.sol", diff --git a/test/SPVContract.test.ts b/test/SPVContract.test.ts index fbd89db..0d6ae96 100644 --- a/test/SPVContract.test.ts +++ b/test/SPVContract.test.ts @@ -13,13 +13,13 @@ import { Reverter, } from "@test-helpers"; -import { SPVContractMock } from "@ethers-v6"; +import { SPVGatewayMock } from "@ethers-v6"; import { MerkleRawProofParser } from "./helpers/parse-proof-helpers"; -describe("SPVContract", () => { +describe("SPVGateway", () => { const reverter = new Reverter(); - let spvContract: SPVContractMock; + let spvGateway: SPVGatewayMock; let genesisBlockDataFilePath: string; let regtestGenesisBlockDataFilePath: string; @@ -28,7 +28,7 @@ describe("SPVContract", () => { let reorgBlocksDataFilePath: string; before(async () => { - spvContract = await ethers.deployContract("SPVContractMock"); + spvGateway = await ethers.deployContract("SPVGatewayMock"); genesisBlockDataFilePath = getBlocksDataFilePath("genesis_block.json"); regtestGenesisBlockDataFilePath = getBlocksDataFilePath("regtest_genesis_block.json"); @@ -45,21 +45,21 @@ describe("SPVContract", () => { it("should correctly init SPV contract from genesis state", async () => { const genesisData = getBlockHeaderData(genesisBlockDataFilePath, 0); - const tx = await spvContract["__SPVContract_init()"](); + const tx = await spvGateway["__SPVGateway_init()"](); - await expect(tx).to.emit(spvContract, "MainchainHeadUpdated").withArgs(genesisData.height, genesisData.blockHash); - await expect(tx).to.emit(spvContract, "BlockHeaderAdded").withArgs(genesisData.height, genesisData.blockHash); + await expect(tx).to.emit(spvGateway, "MainchainHeadUpdated").withArgs(genesisData.height, genesisData.blockHash); + await expect(tx).to.emit(spvGateway, "BlockHeaderAdded").withArgs(genesisData.height, genesisData.blockHash); }); it("should correctly init SPV contract from genesis state passed outside", async () => { const initBlockData = getBlockHeaderData(genesisBlockDataFilePath, 0); - const tx = await spvContract["__SPVContract_init(bytes,uint64,uint256)"](initBlockData.rawHeader, 0, 0); + const tx = await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"](initBlockData.rawHeader, 0, 0); await expect(tx) - .to.emit(spvContract, "MainchainHeadUpdated") + .to.emit(spvGateway, "MainchainHeadUpdated") .withArgs(initBlockData.height, initBlockData.blockHash); - await expect(tx).to.emit(spvContract, "BlockHeaderAdded").withArgs(initBlockData.height, initBlockData.blockHash); + await expect(tx).to.emit(spvGateway, "BlockHeaderAdded").withArgs(initBlockData.height, initBlockData.blockHash); }); it("should correctly init SPV contract from some block", async () => { @@ -69,20 +69,20 @@ describe("SPVContract", () => { .parsedBlockHeader.chainwork; const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); - const tx = await spvContract["__SPVContract_init(bytes,uint64,uint256)"]( + const tx = await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork, ); await expect(tx) - .to.emit(spvContract, "MainchainHeadUpdated") + .to.emit(spvGateway, "MainchainHeadUpdated") .withArgs(initBlockData.height, initBlockData.blockHash); - await expect(tx).to.emit(spvContract, "BlockHeaderAdded").withArgs(initBlockData.height, initBlockData.blockHash); + await expect(tx).to.emit(spvGateway, "BlockHeaderAdded").withArgs(initBlockData.height, initBlockData.blockHash); - expect(await spvContract.getLastEpochCumulativeWork()).to.be.eq(lastEpochCumulativeWork); - expect(await spvContract.getMainchainHead()).to.be.eq(initBlockData.blockHash); - expect(await spvContract.getMainchainHeight()).to.be.eq(initBlockData.height); + expect(await spvGateway.getLastEpochCumulativeWork()).to.be.eq(lastEpochCumulativeWork); + expect(await spvGateway.getMainchainHead()).to.be.eq(initBlockData.blockHash); + expect(await spvGateway.getMainchainHeight()).to.be.eq(initBlockData.height); }); it("should get exception if pass invalid block height", async () => { @@ -93,21 +93,21 @@ describe("SPVContract", () => { const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); await expect( - spvContract["__SPVContract_init(bytes,uint64,uint256)"]( + spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork, ), ) - .to.be.revertedWithCustomError(spvContract, "InvalidInitialBlockHeight") + .to.be.revertedWithCustomError(spvGateway, "InvalidInitialBlockHeight") .withArgs(initBlockHeight); }); it("should get exception if try to call init function twice", async () => { - await spvContract["__SPVContract_init()"](); + await spvGateway["__SPVGateway_init()"](); - await expect(spvContract["__SPVContract_init()"]()).to.be.revertedWithCustomError( - spvContract, + await expect(spvGateway["__SPVGateway_init()"]()).to.be.revertedWithCustomError( + spvGateway, "InvalidInitialization", ); @@ -117,12 +117,12 @@ describe("SPVContract", () => { const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); await expect( - spvContract["__SPVContract_init(bytes,uint64,uint256)"]( + spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork, ), - ).to.be.revertedWithCustomError(spvContract, "InvalidInitialization"); + ).to.be.revertedWithCustomError(spvGateway, "InvalidInitialization"); }); }); @@ -134,7 +134,7 @@ describe("SPVContract", () => { .parsedBlockHeader.chainwork; const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); - await spvContract["__SPVContract_init(bytes,uint64,uint256)"]( + await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork, @@ -147,29 +147,29 @@ describe("SPVContract", () => { let currentMainchainHead = initBlockData.blockHash; - expect(await spvContract.getMainchainHead()).to.be.eq(currentMainchainHead); + expect(await spvGateway.getMainchainHead()).to.be.eq(currentMainchainHead); for (let i = 0; i < batchesCount; i++) { const currentBlocksData = blocksData.slice(batchSize * i, batchSize * (i + 1)); const rawHeaders = currentBlocksData.map((headerData) => headerData.rawHeader); - const tx = await spvContract.addBlockHeaderBatch(rawHeaders); + const tx = await spvGateway.addBlockHeaderBatch(rawHeaders); await expect(tx) - .to.emit(spvContract, "MainchainHeadUpdated") + .to.emit(spvGateway, "MainchainHeadUpdated") .withArgs(currentBlocksData[batchSize - 1].height, currentBlocksData[batchSize - 1].blockHash); } - expect(await spvContract.getLastEpochCumulativeWork()).to.be.eq( + expect(await spvGateway.getLastEpochCumulativeWork()).to.be.eq( blocksData[DIFFICULTY_ADJUSTMENT_INTERVAL - 2].parsedBlockHeader.chainwork, ); - expect(await spvContract.getMainchainHead()).to.be.eq(blocksData[totalBlockToAdd - 1].blockHash); - expect(await spvContract.getMainchainHeight()).to.be.eq(initBlockHeight + totalBlockToAdd); + expect(await spvGateway.getMainchainHead()).to.be.eq(blocksData[totalBlockToAdd - 1].blockHash); + expect(await spvGateway.getMainchainHeight()).to.be.eq(initBlockHeight + totalBlockToAdd); await Promise.all( blocksData.map((data) => { return new Promise(async (resolve) => { - expect(await spvContract.isInMainchain(data.blockHash)).to.be.true; + expect(await spvGateway.isInMainchain(data.blockHash)).to.be.true; resolve(true); }); @@ -178,7 +178,7 @@ describe("SPVContract", () => { }); it("should get exception if the first block does not exist", async () => { - await spvContract["__SPVContract_init()"](); + await spvGateway["__SPVGateway_init()"](); const blockHeadersData = []; @@ -188,36 +188,33 @@ describe("SPVContract", () => { const rawHeaders = blockHeadersData.map((headerData) => headerData.rawHeader); - await expect(spvContract.addBlockHeaderBatch(rawHeaders)) - .to.revertedWithCustomError(spvContract, "PrevBlockDoesNotExist") + await expect(spvGateway.addBlockHeaderBatch(rawHeaders)) + .to.revertedWithCustomError(spvGateway, "PrevBlockDoesNotExist") .withArgs(blockHeadersData[0].parsedBlockHeader.previousblockhash); }); it("should get exception if pass block headers in the invalid order", async () => { - await spvContract["__SPVContract_init()"](); + await spvGateway["__SPVGateway_init()"](); await expect( - spvContract.addBlockHeaderBatch([ + spvGateway.addBlockHeaderBatch([ getBlockHeaderData(firstBlocksDataFilePath, 1).rawHeader, getBlockHeaderData(firstBlocksDataFilePath, 3).rawHeader, ]), - ).to.revertedWithCustomError(spvContract, "InvalidBlockHeadersOrder"); + ).to.revertedWithCustomError(spvGateway, "InvalidBlockHeadersOrder"); }); it("should get exception if pass zero array", async () => { - await spvContract["__SPVContract_init()"](); + await spvGateway["__SPVGateway_init()"](); - await expect(spvContract.addBlockHeaderBatch([])).to.revertedWithCustomError( - spvContract, - "EmptyBlockHeaderArray", - ); + await expect(spvGateway.addBlockHeaderBatch([])).to.revertedWithCustomError(spvGateway, "EmptyBlockHeaderArray"); }); }); describe("#checkTxInclusion", () => { describe("#when there are from 1 to 6 transactions in a block", () => { beforeEach(async () => { - await spvContract["__SPVContract_init()"](); + await spvGateway["__SPVGateway_init()"](); const initBlockHeight = 1; const batchSize = 200; @@ -229,10 +226,10 @@ describe("SPVContract", () => { const currentBlocksData = blocksData.slice(batchSize * i, batchSize * (i + 1)); const rawHeaders = currentBlocksData.map((headerData) => headerData.rawHeader); - const tx = await spvContract.addBlockHeaderBatch(rawHeaders); + const tx = await spvGateway.addBlockHeaderBatch(rawHeaders); await expect(tx) - .to.emit(spvContract, "MainchainHeadUpdated") + .to.emit(spvGateway, "MainchainHeadUpdated") .withArgs(currentBlocksData[batchSize - 1].height, currentBlocksData[batchSize - 1].blockHash); } }); @@ -246,7 +243,7 @@ describe("SPVContract", () => { const parser = new MerkleRawProofParser(txid, rawProof); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -265,7 +262,7 @@ describe("SPVContract", () => { const parser = new MerkleRawProofParser(txid, rawProof); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -285,7 +282,7 @@ describe("SPVContract", () => { const parser = new MerkleRawProofParser(txid, rawProof); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -305,7 +302,7 @@ describe("SPVContract", () => { const parser = new MerkleRawProofParser(txid, rawProof); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -325,7 +322,7 @@ describe("SPVContract", () => { const parser = new MerkleRawProofParser(txid, rawProof); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -345,7 +342,7 @@ describe("SPVContract", () => { const parser = new MerkleRawProofParser(txid, rawProof); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -366,7 +363,7 @@ describe("SPVContract", () => { const currentBlocksData = blocksData.slice(batchSize * i, batchSize * (i + 1)); const rawHeaders = currentBlocksData.map((headerData) => headerData.rawHeader); - await spvContract.addBlockHeaderBatch(rawHeaders); + await spvGateway.addBlockHeaderBatch(rawHeaders); } const neededBlockData = getBlockHeaderData(firstBlocksDataFilePath, 2812); @@ -378,7 +375,7 @@ describe("SPVContract", () => { let parser = new MerkleRawProofParser(txid0, rawProof0); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -394,7 +391,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid1, rawProof1); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -410,7 +407,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid2, rawProof2); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -426,7 +423,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid3, rawProof3); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -442,7 +439,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid4, rawProof4); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -458,7 +455,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid5, rawProof5); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -472,7 +469,7 @@ describe("SPVContract", () => { const neededBlockData = getBlockHeaderData(firstBlocksDataFilePath, 1); const txid = "0x0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098"; - expect(await spvContract.checkTxInclusion([], neededBlockData.blockHash, txid, 0n, 0n)).to.be.false; + expect(await spvGateway.checkTxInclusion([], neededBlockData.blockHash, txid, 0n, 0n)).to.be.false; }); it("should correctly return false when the txId is invalid", async () => { @@ -486,7 +483,7 @@ describe("SPVContract", () => { const wrongTxId = "0x0" + parser.getTxidReversed().slice(3); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, wrongTxId, @@ -507,7 +504,7 @@ describe("SPVContract", () => { const currentBlocksData = blocksData.slice(batchSize * i, batchSize * (i + 1)); const rawHeaders = currentBlocksData.map((headerData) => headerData.rawHeader); - await spvContract.addBlockHeaderBatch(rawHeaders); + await spvGateway.addBlockHeaderBatch(rawHeaders); } const neededBlockData = getBlockHeaderData(firstBlocksDataFilePath, 2812); @@ -519,7 +516,7 @@ describe("SPVContract", () => { let parser = new MerkleRawProofParser(txid0, rawProof0); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -537,7 +534,7 @@ describe("SPVContract", () => { .parsedBlockHeader.chainwork; const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); - await spvContract["__SPVContract_init(bytes,uint64,uint256)"]( + await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork, @@ -552,7 +549,7 @@ describe("SPVContract", () => { let parser = new MerkleRawProofParser(txid0, rawProof0); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -568,7 +565,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid1, rawProof1); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -584,7 +581,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid170, rawProof170); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -600,7 +597,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid511, rawProof511); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -616,7 +613,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid1024, rawProof1024); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -632,7 +629,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid1537, rawProof1537); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -648,7 +645,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid1655, rawProof1655); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -664,7 +661,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txid2000, rawProof2000); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -680,7 +677,7 @@ describe("SPVContract", () => { parser = new MerkleRawProofParser(txidLast, rawProofLast); expect( - await spvContract.checkTxInclusion( + await spvGateway.checkTxInclusion( parser.getSiblings(), neededBlockData.blockHash, parser.getTxidReversed(), @@ -693,62 +690,62 @@ describe("SPVContract", () => { describe("#addBlockHeader", () => { it("should correctly add new block header", async () => { - await spvContract["__SPVContract_init()"](); + await spvGateway["__SPVGateway_init()"](); const firstBlockData = getBlockHeaderData(firstBlocksDataFilePath, 1); const secondBlockData = getBlockHeaderData(firstBlocksDataFilePath, 2); - expect((await spvContract.getBlockInfo(firstBlockData.blockHash)).isInMainchain).to.be.false; - expect(await spvContract.getBlockStatus(firstBlockData.blockHash)).to.be.deep.eq([false, 0n]); + expect((await spvGateway.getBlockInfo(firstBlockData.blockHash)).isInMainchain).to.be.false; + expect(await spvGateway.getBlockStatus(firstBlockData.blockHash)).to.be.deep.eq([false, 0n]); - let tx = await spvContract.addBlockHeader(firstBlockData.rawHeader); + let tx = await spvGateway.addBlockHeader(firstBlockData.rawHeader); let expectedMainchainHead = firstBlockData.blockHash; let expectedMainchainBlockHeight = 1; await expect(tx) - .to.emit(spvContract, "BlockHeaderAdded") + .to.emit(spvGateway, "BlockHeaderAdded") .withArgs(expectedMainchainBlockHeight, expectedMainchainHead); await expect(tx) - .to.emit(spvContract, "MainchainHeadUpdated") + .to.emit(spvGateway, "MainchainHeadUpdated") .withArgs(expectedMainchainBlockHeight, expectedMainchainHead); - expect(await spvContract.getMainchainHead()).to.be.eq(expectedMainchainHead); - expect(await spvContract.getMainchainHeight()).to.be.eq(expectedMainchainBlockHeight); - expect(await spvContract.getBlockHeight(expectedMainchainHead)).to.be.eq(expectedMainchainBlockHeight); - expect(await spvContract.getBlockMerkleRoot(expectedMainchainHead)).to.be.eq( + expect(await spvGateway.getMainchainHead()).to.be.eq(expectedMainchainHead); + expect(await spvGateway.getMainchainHeight()).to.be.eq(expectedMainchainBlockHeight); + expect(await spvGateway.getBlockHeight(expectedMainchainHead)).to.be.eq(expectedMainchainBlockHeight); + expect(await spvGateway.getBlockMerkleRoot(expectedMainchainHead)).to.be.eq( firstBlockData.parsedBlockHeader.merkleroot, ); - expect(await spvContract.getBlockStatus(firstBlockData.blockHash)).to.be.deep.eq([true, 0n]); + expect(await spvGateway.getBlockStatus(firstBlockData.blockHash)).to.be.deep.eq([true, 0n]); - let blockInfo = await spvContract.getBlockInfo(expectedMainchainHead); + let blockInfo = await spvGateway.getBlockInfo(expectedMainchainHead); checkBlockHeaderData(blockInfo.mainBlockData, firstBlockData); expect(blockInfo.mainBlockData.blockHeight).to.be.eq(expectedMainchainBlockHeight); expect(blockInfo.isInMainchain).to.be.true; expect(blockInfo.cumulativeWork).to.be.eq(firstBlockData.parsedBlockHeader.chainwork); - tx = await spvContract.addBlockHeader(secondBlockData.rawHeader); + tx = await spvGateway.addBlockHeader(secondBlockData.rawHeader); expectedMainchainHead = secondBlockData.blockHash; expectedMainchainBlockHeight = 2; await expect(tx) - .to.emit(spvContract, "BlockHeaderAdded") + .to.emit(spvGateway, "BlockHeaderAdded") .withArgs(expectedMainchainBlockHeight, expectedMainchainHead); await expect(tx) - .to.emit(spvContract, "MainchainHeadUpdated") + .to.emit(spvGateway, "MainchainHeadUpdated") .withArgs(expectedMainchainBlockHeight, expectedMainchainHead); - blockInfo = await spvContract.getBlockInfo(expectedMainchainHead); + blockInfo = await spvGateway.getBlockInfo(expectedMainchainHead); checkBlockHeaderData(blockInfo.mainBlockData, secondBlockData); expect(blockInfo.mainBlockData.blockHeight).to.be.eq(expectedMainchainBlockHeight); expect(blockInfo.isInMainchain).to.be.true; expect(blockInfo.cumulativeWork).to.be.eq(secondBlockData.parsedBlockHeader.chainwork); - expect(await spvContract.getBlockStatus(firstBlockData.blockHash)).to.be.deep.eq([true, 1n]); - expect(await spvContract.getBlockStatus(secondBlockData.blockHash)).to.be.deep.eq([true, 0n]); + expect(await spvGateway.getBlockStatus(firstBlockData.blockHash)).to.be.deep.eq([true, 1n]); + expect(await spvGateway.getBlockStatus(secondBlockData.blockHash)).to.be.deep.eq([true, 0n]); }); it("should correctly add target adjustment block", async () => { @@ -758,7 +755,7 @@ describe("SPVContract", () => { .parsedBlockHeader.chainwork; const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); - await spvContract["__SPVContract_init(bytes,uint64,uint256)"]( + await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork, @@ -773,7 +770,7 @@ describe("SPVContract", () => { const currentBlocksData = blocksData.slice(batchSize * i, batchSize * (i + 1)); const rawHeaders = currentBlocksData.map((headerData) => headerData.rawHeader); - await spvContract.addBlockHeaderBatch(rawHeaders); + await spvGateway.addBlockHeaderBatch(rawHeaders); } const blocksToAdd = 20; @@ -782,16 +779,14 @@ describe("SPVContract", () => { for (let i = 0; i < blocksToAdd; i++) { if ((newBlockHeight + i) % DIFFICULTY_ADJUSTMENT_INTERVAL != 0) { - await spvContract.addBlockHeader(blocksData[i].rawHeader); + await spvGateway.addBlockHeader(blocksData[i].rawHeader); } else { - await spvContract.addBlockHeader(blocksData[i].rawHeader); + await spvGateway.addBlockHeader(blocksData[i].rawHeader); - expect((await spvContract.getBlockInfo(blocksData[i].blockHash)).cumulativeWork).to.be.eq( + expect((await spvGateway.getBlockInfo(blocksData[i].blockHash)).cumulativeWork).to.be.eq( blocksData[i].parsedBlockHeader.chainwork, ); - expect(await spvContract.getLastEpochCumulativeWork()).to.be.eq( - blocksData[i - 1].parsedBlockHeader.chainwork, - ); + expect(await spvGateway.getLastEpochCumulativeWork()).to.be.eq(blocksData[i - 1].parsedBlockHeader.chainwork); } } }); @@ -799,93 +794,93 @@ describe("SPVContract", () => { it("should correctly update mainchain with the longest chain", async () => { const genesisData = getBlockHeaderData(regtestGenesisBlockDataFilePath, 0); - await spvContract.__SPVContractMock_init(genesisData.rawHeader); + await spvGateway.__SPVGatewayMock_init(genesisData.rawHeader); const mainchainBlocks = getReorgBlockHeaderDataBatch(reorgBlocksDataFilePath, 1, 15); const rawHeaders = mainchainBlocks.map((blockData) => blockData.rawHeader); - await spvContract.addBlockHeaderBatch(rawHeaders); + await spvGateway.addBlockHeaderBatch(rawHeaders); const altBlock = getReorgBlockHeaderData(reorgBlocksDataFilePath, 16, false); - let tx = await spvContract.addBlockHeader(altBlock.rawHeader); + let tx = await spvGateway.addBlockHeader(altBlock.rawHeader); let expectedCurrentBlockHeight = 16; await expect(tx) - .to.emit(spvContract, "MainchainHeadUpdated") + .to.emit(spvGateway, "MainchainHeadUpdated") .withArgs(expectedCurrentBlockHeight, altBlock.blockHash); - expect(await spvContract.getMainchainHead()).to.be.eq(altBlock.blockHash); + expect(await spvGateway.getMainchainHead()).to.be.eq(altBlock.blockHash); const newMainchainBlocks = getReorgBlockHeaderDataBatch(reorgBlocksDataFilePath, 16, 2); const newRawHeaders = newMainchainBlocks.map((blockData) => blockData.rawHeader); - tx = await spvContract.addBlockHeaderBatch(newRawHeaders); + tx = await spvGateway.addBlockHeaderBatch(newRawHeaders); expectedCurrentBlockHeight = 17; const expectedMainchainHead = newMainchainBlocks[1]; await expect(tx) - .to.emit(spvContract, "MainchainHeadUpdated") + .to.emit(spvGateway, "MainchainHeadUpdated") .withArgs(expectedCurrentBlockHeight, expectedMainchainHead.blockHash); - expect(await spvContract.getMainchainHead()).to.be.eq(expectedMainchainHead.blockHash); - expect(await spvContract.isInMainchain(altBlock.blockHash)).to.be.false; + expect(await spvGateway.getMainchainHead()).to.be.eq(expectedMainchainHead.blockHash); + expect(await spvGateway.isInMainchain(altBlock.blockHash)).to.be.false; }); it("should correctly add alternative block without mainchain update", async () => { const genesisData = getBlockHeaderData(regtestGenesisBlockDataFilePath, 0); - await spvContract.__SPVContractMock_init(genesisData.rawHeader); + await spvGateway.__SPVGatewayMock_init(genesisData.rawHeader); const mainchainBlocks = getReorgBlockHeaderDataBatch(reorgBlocksDataFilePath, 1, 21); const rawHeaders = mainchainBlocks.map((blockData) => blockData.rawHeader); - await spvContract.addBlockHeaderBatch(rawHeaders); + await spvGateway.addBlockHeaderBatch(rawHeaders); const altBlock = getReorgBlockHeaderData(reorgBlocksDataFilePath, 16, false); - const tx = await spvContract.addBlockHeader(altBlock.rawHeader); + const tx = await spvGateway.addBlockHeader(altBlock.rawHeader); - await expect(tx).to.not.emit(spvContract, "MainchainHeadUpdated"); + await expect(tx).to.not.emit(spvGateway, "MainchainHeadUpdated"); - expect(await spvContract.isInMainchain(altBlock.blockHash)).to.be.false; + expect(await spvGateway.isInMainchain(altBlock.blockHash)).to.be.false; }); it("should get exception if pass block that already exists", async () => { - await spvContract["__SPVContract_init()"](); + await spvGateway["__SPVGateway_init()"](); const currentBlockData = getBlockHeaderData(firstBlocksDataFilePath, 1); - await spvContract.addBlockHeader(currentBlockData.rawHeader); + await spvGateway.addBlockHeader(currentBlockData.rawHeader); - await expect(spvContract.addBlockHeader(currentBlockData.rawHeader)) - .to.be.revertedWithCustomError(spvContract, "BlockAlreadyExists") + await expect(spvGateway.addBlockHeader(currentBlockData.rawHeader)) + .to.be.revertedWithCustomError(spvGateway, "BlockAlreadyExists") .withArgs(currentBlockData.blockHash); }); it("should get exception if prev block hash is not in the chain", async () => { - await spvContract["__SPVContract_init()"](); + await spvGateway["__SPVGateway_init()"](); const firstBlockData = getBlockHeaderData(firstBlocksDataFilePath, 1); const thirdBlockData = getBlockHeaderData(firstBlocksDataFilePath, 3); - await spvContract.addBlockHeader(firstBlockData.rawHeader); + await spvGateway.addBlockHeader(firstBlockData.rawHeader); - await expect(spvContract.addBlockHeader(thirdBlockData.rawHeader)) - .to.be.revertedWithCustomError(spvContract, "PrevBlockDoesNotExist") + await expect(spvGateway.addBlockHeader(thirdBlockData.rawHeader)) + .to.be.revertedWithCustomError(spvGateway, "PrevBlockDoesNotExist") .withArgs(thirdBlockData.parsedBlockHeader.previousblockhash); }); }); describe("#getStorageMedianTime", () => { beforeEach("setup", async () => { - await spvContract["__SPVContract_init()"](); + await spvGateway["__SPVGateway_init()"](); }); it("should return correct median time for the first block", async () => { const currentBlockData = getBlockHeaderData(firstBlocksDataFilePath, 1); - expect(await spvContract.getStorageMedianTime(currentBlockData.rawHeader, 1)).to.be.eq( + expect(await spvGateway.getStorageMedianTime(currentBlockData.rawHeader, 1)).to.be.eq( currentBlockData.parsedBlockHeader.time, ); }); @@ -896,14 +891,14 @@ describe("SPVContract", () => { for (let i = 1; i <= 11; ++i) { const currentBlockData = getBlockHeaderData(firstBlocksDataFilePath, i); - await spvContract.addBlockHeader(currentBlockData.rawHeader); + await spvGateway.addBlockHeader(currentBlockData.rawHeader); - expect(await spvContract.getBlockHeight(currentBlockData.blockHash)).to.be.eq(i); + expect(await spvGateway.getBlockHeight(currentBlockData.blockHash)).to.be.eq(i); blocksData.push(currentBlockData); if (i > 1) { - expect(await spvContract.getStorageMedianTime(currentBlockData.rawHeader, 1)).to.be.eq( + expect(await spvGateway.getStorageMedianTime(currentBlockData.rawHeader, 1)).to.be.eq( blocksData[i - 1].parsedBlockHeader.time, ); } @@ -917,10 +912,10 @@ describe("SPVContract", () => { blockHeadersData.push(getBlockHeaderData(firstBlocksDataFilePath, i)); } - await spvContract.addBlockHeaderBatch(blockHeadersData.map((headerData) => headerData.rawHeader)); + await spvGateway.addBlockHeaderBatch(blockHeadersData.map((headerData) => headerData.rawHeader)); for (let i = 12; i < 100; ++i) { - expect(await spvContract.getStorageMedianTime(blockHeadersData[i - 1].rawHeader, i)).to.be.eq( + expect(await spvGateway.getStorageMedianTime(blockHeadersData[i - 1].rawHeader, i)).to.be.eq( blockHeadersData[i - 2].parsedBlockHeader.mediantime, ); } @@ -929,17 +924,17 @@ describe("SPVContract", () => { describe("#getMemoryMedianTime", async () => { beforeEach("setup", async () => { - await spvContract["__SPVContract_init()"](); + await spvGateway["__SPVGateway_init()"](); }); it("should return correct median time", async () => { const blockHeadersData = getBlockHeaderDataBatch(firstBlocksDataFilePath, 1, 100); const rawHeaders = blockHeadersData.map((headerData) => headerData.rawHeader); - await spvContract.addBlockHeaderBatch(rawHeaders); + await spvGateway.addBlockHeaderBatch(rawHeaders); for (let i = 12; i < 100; ++i) { - expect(await spvContract.getMemoryMedianTime(rawHeaders, i)).to.be.eq( + expect(await spvGateway.getMemoryMedianTime(rawHeaders, i)).to.be.eq( blockHeadersData[i - 1].parsedBlockHeader.mediantime, ); } @@ -950,7 +945,7 @@ describe("SPVContract", () => { const rawHeaders = blockHeadersData.map((headerData) => headerData.rawHeader); for (let i = 1; i <= 10; ++i) { - expect(await spvContract.getMemoryMedianTime(rawHeaders, i)).to.be.eq(0); + expect(await spvGateway.getMemoryMedianTime(rawHeaders, i)).to.be.eq(0); } }); }); @@ -963,7 +958,7 @@ describe("SPVContract", () => { .parsedBlockHeader.chainwork; const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); - await spvContract["__SPVContract_init(bytes,uint64,uint256)"]( + await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork, @@ -979,7 +974,7 @@ describe("SPVContract", () => { const target = bitsToTarget(newBlockData.parsedBlockHeader.bits); await expect( - spvContract.validateBlockRules( + spvGateway.validateBlockRules( { prevBlockHash: newBlockData.parsedBlockHeader.previousblockhash, merkleRoot: newBlockData.parsedBlockHeader.merkleroot, @@ -993,7 +988,7 @@ describe("SPVContract", () => { newBlockData.parsedBlockHeader.mediantime, ), ) - .to.be.revertedWithCustomError(spvContract, "InvalidTarget") + .to.be.revertedWithCustomError(spvGateway, "InvalidTarget") .withArgs(mockTarget, target); }); @@ -1004,7 +999,7 @@ describe("SPVContract", () => { const mockTarget = bitsToTarget(mockBits); await expect( - spvContract.validateBlockRules( + spvGateway.validateBlockRules( { prevBlockHash: newBlockData.parsedBlockHeader.previousblockhash, merkleRoot: newBlockData.parsedBlockHeader.merkleroot, @@ -1018,7 +1013,7 @@ describe("SPVContract", () => { newBlockData.parsedBlockHeader.mediantime, ), ) - .to.be.revertedWithCustomError(spvContract, "InvalidBlockHash") + .to.be.revertedWithCustomError(spvGateway, "InvalidBlockHash") .withArgs(newBlockData.blockHash, mockTarget); }); @@ -1029,7 +1024,7 @@ describe("SPVContract", () => { const mockTime = BigInt(newBlockData.parsedBlockHeader.mediantime) - 100n; await expect( - spvContract.validateBlockRules( + spvGateway.validateBlockRules( { prevBlockHash: newBlockData.parsedBlockHeader.previousblockhash, merkleRoot: newBlockData.parsedBlockHeader.merkleroot, @@ -1043,7 +1038,7 @@ describe("SPVContract", () => { newBlockData.parsedBlockHeader.mediantime, ), ) - .to.be.revertedWithCustomError(spvContract, "InvalidBlockTime") + .to.be.revertedWithCustomError(spvGateway, "InvalidBlockTime") .withArgs(mockTime, newBlockData.parsedBlockHeader.mediantime); }); }); diff --git a/test/helpers/block-helpers.ts b/test/helpers/block-helpers.ts index c77150c..978882b 100644 --- a/test/helpers/block-helpers.ts +++ b/test/helpers/block-helpers.ts @@ -3,7 +3,7 @@ import path from "path"; import { expect } from "chai"; import { randomInt } from "crypto"; -import { ISPVContract } from "@/generated-types/ethers/contracts/SPVContract"; +import { ISPVGateway } from "@/generated-types/ethers/contracts/SPVGateway"; import { BlockHeaderData, ReorgBlocksData } from "./types"; @@ -77,7 +77,7 @@ export function getBlockHeaderDataBatch(pathToDataFile: string, height: number, } export function checkBlockHeaderData( - actualBlockHeaderData: ISPVContract.BlockDataStructOutput, + actualBlockHeaderData: ISPVGateway.BlockDataStructOutput, expectedBlockHeaderData: BlockHeaderData, ) { expect(actualBlockHeaderData.version).to.be.eq(expectedBlockHeaderData.parsedBlockHeader.version); From 0e8ce83612f2d45a51706f1d281e4542e91c8d90 Mon Sep 17 00:00:00 2001 From: Oleh Komendant Date: Mon, 1 Sep 2025 21:03:22 +0300 Subject: [PATCH 2/3] Add deterministic deployment --- contracts/interfaces/ICreateX.sol | 21 + deploy/1_SPVGateway.migration.ts | 24 +- deploy/config/sepolia.ts | 6 +- deploy/helpers/helpers.ts | 16 + hardhat.config.ts | 10 +- package-lock.json | 1452 ++++++++++++++++++++++------- package.json | 2 +- 7 files changed, 1177 insertions(+), 354 deletions(-) create mode 100644 contracts/interfaces/ICreateX.sol create mode 100644 deploy/helpers/helpers.ts diff --git a/contracts/interfaces/ICreateX.sol b/contracts/interfaces/ICreateX.sol new file mode 100644 index 0000000..826337b --- /dev/null +++ b/contracts/interfaces/ICreateX.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.28; + +interface ICreateX { + struct Values { + uint256 constructorAmount; + uint256 initCallAmount; + } + + function deployCreate2AndInit( + bytes32 salt_, + bytes memory initCode_, + bytes memory data_, + Values memory values_ + ) external payable returns (address newContract_); + + function computeCreate2Address( + bytes32 salt_, + bytes32 initCodeHash_ + ) external view returns (address computedAddress_); +} diff --git a/deploy/1_SPVGateway.migration.ts b/deploy/1_SPVGateway.migration.ts index bbf6f29..aa0797d 100644 --- a/deploy/1_SPVGateway.migration.ts +++ b/deploy/1_SPVGateway.migration.ts @@ -1,19 +1,27 @@ import { Deployer, Reporter } from "@solarity/hardhat-migrate"; -import { SPVGateway__factory } from "@ethers-v6"; +import { SPVGateway__factory, ICreateX__factory } from "@ethers-v6"; import { getConfig } from "./config/config"; +import { getSPVGatewayAddr, getSPVGatewaySalt } from "./helpers/helpers"; export = async (deployer: Deployer) => { - const config = (await getConfig())!; + const config = await getConfig(); - const spvGateway = await deployer.deploy(SPVGateway__factory); + const createXDeployer = await deployer.deployed(ICreateX__factory, "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed"); - await spvGateway["__SPVGateway_init(bytes,uint256,uint256)"]( - config.blockHeader, - config.blockHeight, - config.cumulativeWork, + const salt = getSPVGatewaySalt(); + const initCalldata = SPVGateway__factory.createInterface().encodeFunctionData( + "__SPVGateway_init(bytes,uint64,uint256)", + [config.blockHeader, config.blockHeight, config.cumulativeWork], ); - Reporter.reportContracts(["SPVGateway", await spvGateway.getAddress()]); + await createXDeployer.deployCreate2AndInit(salt, SPVGateway__factory.bytecode, initCalldata, { + constructorAmount: 0n, + initCallAmount: 0n, + }); + + const spvGatewayAddr = await getSPVGatewayAddr(createXDeployer); + + Reporter.reportContracts(["SPVGateway", spvGatewayAddr]); }; diff --git a/deploy/config/sepolia.ts b/deploy/config/sepolia.ts index 3ec9039..1366260 100644 --- a/deploy/config/sepolia.ts +++ b/deploy/config/sepolia.ts @@ -2,7 +2,7 @@ import { DeployConfig } from "./types"; export const deployConfig: DeployConfig = { blockHeader: - "0x0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c", - blockHeight: 0, - cumulativeWork: 0, + "0x010000006397bb6abd4fc521c0d3f6071b5650389f0b4551bc40b4e6b067306900000000ace470aecda9c8818c8fe57688cd2a772b5a57954a00df0420a7dd546b6d2c576b0e7f49ffff001d33f0192f", + blockHeight: 2016, + cumulativeWork: "0x000000000000000000000000000000000000000000000000000007e107e107e1", }; diff --git a/deploy/helpers/helpers.ts b/deploy/helpers/helpers.ts new file mode 100644 index 0000000..6c430d3 --- /dev/null +++ b/deploy/helpers/helpers.ts @@ -0,0 +1,16 @@ +import { SPVGateway__factory, ICreateX } from "@/generated-types/ethers"; + +import { ethers } from "hardhat"; + +export async function getSPVGatewayAddr(createXDeployer: ICreateX): Promise { + const salt = getSPVGatewaySalt(); + const guardedSalt = ethers.keccak256(ethers.AbiCoder.defaultAbiCoder().encode(["bytes32"], [salt])); + + const initcodeHash = ethers.keccak256(SPVGateway__factory.bytecode); + + return await createXDeployer.computeCreate2Address(guardedSalt, initcodeHash); +} + +export function getSPVGatewaySalt(): string { + return `0x0000000000000000000000000000000000000000000012341234123412341231`; +} diff --git a/hardhat.config.ts b/hardhat.config.ts index fed478a..49edff8 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -50,15 +50,7 @@ const config: HardhatUserConfig = { }, }, etherscan: { - apiKey: { - sepolia: `${process.env.ETHERSCAN_KEY}`, - mainnet: `${process.env.ETHERSCAN_KEY}`, - bscTestnet: `${process.env.BSCSCAN_KEY}`, - bsc: `${process.env.BSCSCAN_KEY}`, - polygon: `${process.env.POLYGONSCAN_KEY}`, - avalancheFujiTestnet: `${process.env.AVALANCHE_KEY}`, - avalanche: `${process.env.AVALANCHE_KEY}`, - }, + apiKey: `${process.env.ETHERSCAN_KEY}`, }, migrate: { paths: { diff --git a/package-lock.json b/package-lock.json index 74a9195..5848333 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@nomicfoundation/hardhat-verify": "^2.0.13", "@solarity/hardhat-gobind": "^1.2.2", "@solarity/hardhat-markup": "^1.0.10", - "@solarity/hardhat-migrate": "^3.0.0", + "@solarity/hardhat-migrate": "^3.1.0", "@typechain/ethers-v6": "^0.5.1", "@typechain/hardhat": "^9.1.0", "@types/chai": "^4.3.20", @@ -61,6 +61,7 @@ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "license": "Apache-2.0", + "optional": true, "peer": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -76,6 +77,7 @@ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "license": "MIT", + "optional": true, "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -102,6 +104,7 @@ "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=6.9.0" @@ -113,6 +116,7 @@ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", + "optional": true, "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -145,6 +149,8 @@ "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/parser": "^7.26.10", "@babel/types": "^7.26.10", @@ -162,6 +168,8 @@ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -173,6 +181,8 @@ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/types": "^7.25.9" }, @@ -186,6 +196,7 @@ "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "license": "MIT", + "optional": true, "peer": true, "dependencies": { "@babel/compat-data": "^7.26.5", @@ -204,6 +215,7 @@ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", + "optional": true, "peer": true, "dependencies": { "yallist": "^3.0.2" @@ -215,6 +227,8 @@ "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-member-expression-to-functions": "^7.25.9", @@ -237,6 +251,8 @@ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -251,6 +267,8 @@ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -265,6 +283,8 @@ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", @@ -283,6 +303,8 @@ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/types": "^7.25.9" }, @@ -296,6 +318,8 @@ "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -306,6 +330,8 @@ "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", @@ -324,6 +350,8 @@ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -338,6 +366,8 @@ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -357,6 +387,8 @@ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.9.0" } @@ -367,6 +399,7 @@ "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dev": true, "license": "MIT", + "optional": true, "peer": true, "dependencies": { "@babel/template": "^7.26.9", @@ -382,6 +415,8 @@ "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/types": "^7.26.10" }, @@ -398,6 +433,8 @@ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -414,6 +451,8 @@ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -430,6 +469,8 @@ "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-module-transforms": "^7.26.0", "@babel/helper-plugin-utils": "^7.25.9" @@ -447,6 +488,8 @@ "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", @@ -467,6 +510,8 @@ "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.25.9", "@babel/helper-validator-option": "^7.25.9", @@ -487,6 +532,8 @@ "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -500,6 +547,8 @@ "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.9", @@ -515,6 +564,8 @@ "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.10", @@ -534,6 +585,8 @@ "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -569,14 +622,18 @@ "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-browser/-/cardano-serialization-lib-browser-13.2.1.tgz", "integrity": "sha512-7RfX1gI16Vj2DgCp/ZoXqyLAakWo6+X95ku/rYGbVzuS/1etrlSiJmdbmdm+eYmszMlGQjrtOJQeVLXoj4L/Ag==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@emurgo/cardano-serialization-lib-nodejs": { "version": "13.2.0", "resolved": "https://registry.npmjs.org/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-13.2.0.tgz", "integrity": "sha512-Bz1zLGEqBQ0BVkqt1OgMxdBOE3BdUWUd7Ly9Ecr/aUwkA8AV1w1XzBMe4xblmJHnB1XXNlPH4SraXCvO+q0Mig==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@ethereumjs/common": { "version": "4.4.0", @@ -584,6 +641,8 @@ "integrity": "sha512-Fy5hMqF6GsE6DpYTyqdDIJPJgUtDn4dL120zKw+Pswuo+iLyBsEYuSyzMw6NVzD2vDzcBG9fE4+qX4X2bPc97w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethereumjs/util": "^9.1.0" } @@ -594,6 +653,8 @@ "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", "dev": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "bin": { "rlp": "bin/rlp.cjs" }, @@ -607,6 +668,8 @@ "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", "dev": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { "@ethereumjs/rlp": "^5.0.2", "ethereum-cryptography": "^2.2.1" @@ -621,6 +684,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -634,6 +699,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -647,6 +714,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -662,6 +731,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -676,6 +747,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -701,6 +774,8 @@ "integrity": "sha512-SCHnK7m/AouZ7nyoR0MEXw1OO/tQojSbp88t8oxhwes5iZkZCtfFdUrJaiIb72qIpH2FVw6s1k1uP7LXuH7PsA==", "dev": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { "@ethereumjs/common": "^4.4.0", "@ethereumjs/rlp": "^5.0.2", @@ -717,6 +792,8 @@ "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", "dev": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "bin": { "rlp": "bin/rlp.cjs" }, @@ -730,6 +807,8 @@ "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", "dev": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "dependencies": { "@ethereumjs/rlp": "^5.0.2", "ethereum-cryptography": "^2.2.1" @@ -744,6 +823,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -757,6 +838,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -770,6 +853,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -785,6 +870,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -799,6 +886,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -1021,6 +1110,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/properties": "^5.8.0" @@ -1104,6 +1195,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/abi": "^5.8.0", "@ethersproject/abstract-provider": "^5.8.0", @@ -1161,6 +1254,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/basex": "^5.8.0", @@ -1192,6 +1287,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/abstract-signer": "^5.8.0", "@ethersproject/address": "^5.8.0", @@ -1213,7 +1310,9 @@ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@ethersproject/keccak256": { "version": "5.8.0", @@ -1289,6 +1388,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/sha2": "^5.8.0" @@ -1330,6 +1431,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -1358,7 +1461,9 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@ethersproject/providers/node_modules/ws": { "version": "8.18.0", @@ -1366,6 +1471,8 @@ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -1398,6 +1505,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0" @@ -1440,6 +1549,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/logger": "^5.8.0", @@ -1487,6 +1598,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/bignumber": "^5.8.0", "@ethersproject/bytes": "^5.8.0", @@ -1584,6 +1697,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/abstract-provider": "^5.8.0", "@ethersproject/abstract-signer": "^5.8.0", @@ -1642,6 +1757,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/bytes": "^5.8.0", "@ethersproject/hash": "^5.8.0", @@ -1656,6 +1773,8 @@ "integrity": "sha512-ibzbHT86rXRWCmPtnJH5IcLAOtOZJOtwJqZDjpdYEkojhpreDrCTlTYh8j6B8oxZgjiHqBcXiQlo+QMCHthvIA==", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "@solana/web3.js": "1.95.8", "bignumber.js": "9.1.2", @@ -1670,6 +1789,8 @@ "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.7.1" }, @@ -1686,6 +1807,8 @@ "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -1699,6 +1822,8 @@ "integrity": "sha512-sBHzNh7dHMrmNS5xPD1d0Xa2QffW/RXaxu/OysRXBfwTp+LYqGGmMtCYYwrHPrN5rjAmJCsQRNAwv4FM0t3B6g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", @@ -1737,6 +1862,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -1757,6 +1884,8 @@ "integrity": "sha512-h25Pn1ZA7oqQBQDodGAgIsQt66T2wDge9onBKNqE66WNWL0KJiKJbpij8YOLo5AAlEIg5IS7EB1QjBgDOIg6DQ==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "@emurgo/cardano-serialization-lib-browser": "^13.2.0", "@emurgo/cardano-serialization-lib-nodejs": "13.2.0" @@ -1873,6 +2002,8 @@ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1888,6 +2019,8 @@ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1908,6 +2041,8 @@ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=6.0.0" } @@ -1928,58 +2063,14 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "dev": true, - "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, "node_modules/@mobily/ts-belt": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/@mobily/ts-belt/-/ts-belt-3.13.1.tgz", "integrity": "sha512-K5KqIhPI/EoCTbA6CGbrenM9s41OouyK8A03fGJJcla/zKucsgLbz8HNbeseoLarRPgyWJsUyCYqFhI7t3Ra9Q==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 10.*" } @@ -2056,28 +2147,28 @@ } }, "node_modules/@nomicfoundation/edr": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.7.0.tgz", - "integrity": "sha512-+Zyu7TE47TGNcPhOfWLPA/zISs32WDMXrhSWdWYyPHDVn/Uux5TVuOeScKb0BR/R8EJ+leR8COUF/EGxvDOVKg==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.11.3.tgz", + "integrity": "sha512-kqILRkAd455Sd6v8mfP3C1/0tCOynJWY+Ir+k/9Boocu2kObCrsFgG+ZWB7fSBVdd9cPVSNrnhWS+V+PEo637g==", "dev": true, "license": "MIT", "dependencies": { - "@nomicfoundation/edr-darwin-arm64": "0.7.0", - "@nomicfoundation/edr-darwin-x64": "0.7.0", - "@nomicfoundation/edr-linux-arm64-gnu": "0.7.0", - "@nomicfoundation/edr-linux-arm64-musl": "0.7.0", - "@nomicfoundation/edr-linux-x64-gnu": "0.7.0", - "@nomicfoundation/edr-linux-x64-musl": "0.7.0", - "@nomicfoundation/edr-win32-x64-msvc": "0.7.0" + "@nomicfoundation/edr-darwin-arm64": "0.11.3", + "@nomicfoundation/edr-darwin-x64": "0.11.3", + "@nomicfoundation/edr-linux-arm64-gnu": "0.11.3", + "@nomicfoundation/edr-linux-arm64-musl": "0.11.3", + "@nomicfoundation/edr-linux-x64-gnu": "0.11.3", + "@nomicfoundation/edr-linux-x64-musl": "0.11.3", + "@nomicfoundation/edr-win32-x64-msvc": "0.11.3" }, "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-darwin-arm64": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.7.0.tgz", - "integrity": "sha512-vAH20oh4GaSB/iQFTRcoO8jLc0CLd9XuLY9I7vtcqZWAiM4U1J4Y8cu67PWmtxbvUQOqXR7S6FtAr8/AlWm14g==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.11.3.tgz", + "integrity": "sha512-w0tksbdtSxz9nuzHKsfx4c2mwaD0+l5qKL2R290QdnN9gi9AV62p9DHkOgfBdyg6/a6ZlnQqnISi7C9avk/6VA==", "dev": true, "license": "MIT", "engines": { @@ -2085,9 +2176,9 @@ } }, "node_modules/@nomicfoundation/edr-darwin-x64": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.7.0.tgz", - "integrity": "sha512-WHDdIrPvLlgXQr2eKypBM5xOZAwdxhDAEQIvEMQL8tEEm2qYW2bliUlssBPrs8E3bdivFbe1HizImslMAfU3+g==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.11.3.tgz", + "integrity": "sha512-QR4jAFrPbOcrO7O2z2ESg+eUeIZPe2bPIlQYgiJ04ltbSGW27FblOzdd5+S3RoOD/dsZGKAvvy6dadBEl0NgoA==", "dev": true, "license": "MIT", "engines": { @@ -2095,9 +2186,9 @@ } }, "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.7.0.tgz", - "integrity": "sha512-WXpJB54ukz1no7gxCPXVEw9pgl/9UZ/WO3l1ctyv/T7vOygjqA4SUd6kppTs6MNXAuTiisPtvJ/fmvHiMBLrsw==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.11.3.tgz", + "integrity": "sha512-Ktjv89RZZiUmOFPspuSBVJ61mBZQ2+HuLmV67InNlh9TSUec/iDjGIwAn59dx0bF/LOSrM7qg5od3KKac4LJDQ==", "dev": true, "license": "MIT", "engines": { @@ -2105,9 +2196,9 @@ } }, "node_modules/@nomicfoundation/edr-linux-arm64-musl": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.7.0.tgz", - "integrity": "sha512-1iZYOcEgc+zJI7JQrlAFziuy9sBz1WgnIx3HIIu0J7lBRZ/AXeHHgATb+4InqxtEx9O3W8A0s7f11SyFqJL4Aw==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.11.3.tgz", + "integrity": "sha512-B3sLJx1rL2E9pfdD4mApiwOZSrX0a/KQSBWdlq1uAhFKqkl00yZaY4LejgZndsJAa4iKGQJlGnw4HCGeVt0+jA==", "dev": true, "license": "MIT", "engines": { @@ -2115,9 +2206,9 @@ } }, "node_modules/@nomicfoundation/edr-linux-x64-gnu": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.7.0.tgz", - "integrity": "sha512-wSjC94WcR5MM8sg9w3OsAmT6+bbmChJw6uJKoXR3qscps/jdhjzJWzfgT0XGRq3XMUfimyafW2RWOyfX3ouhrQ==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.11.3.tgz", + "integrity": "sha512-D/4cFKDXH6UYyKPu6J3Y8TzW11UzeQI0+wS9QcJzjlrrfKj0ENW7g9VihD1O2FvXkdkTjcCZYb6ai8MMTCsaVw==", "dev": true, "license": "MIT", "engines": { @@ -2125,9 +2216,9 @@ } }, "node_modules/@nomicfoundation/edr-linux-x64-musl": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.7.0.tgz", - "integrity": "sha512-Us22+AZ7wkG1mZwxqE4S4ZcuwkEA5VrUiBOJSvKHGOgy6vFvB/Euh5Lkp4GovwjrtiXuvyGO2UmtkzymZKDxZw==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.11.3.tgz", + "integrity": "sha512-ergXuIb4nIvmf+TqyiDX5tsE49311DrBky6+jNLgsGDTBaN1GS3OFwFS8I6Ri/GGn6xOaT8sKu3q7/m+WdlFzg==", "dev": true, "license": "MIT", "engines": { @@ -2135,80 +2226,15 @@ } }, "node_modules/@nomicfoundation/edr-win32-x64-msvc": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.7.0.tgz", - "integrity": "sha512-HAry0heTsWkzReVtjHwoIq3BgFCvXpVhJ5qPmTnegZGsr/KxqvMmHyDMifzKao4bycU8yrpTSyOiAJt27RWjzQ==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.11.3.tgz", + "integrity": "sha512-snvEf+WB3OV0wj2A7kQ+ZQqBquMcrozSLXcdnMdEl7Tmn+KDCbmFKBt3Tk0X3qOU4RKQpLPnTxdM07TJNVtung==", "dev": true, "license": "MIT", "engines": { "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", - "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.4" - } - }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", - "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", - "dev": true, - "bin": { - "rlp": "bin/rlp.cjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz", - "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "c-kzg": "^2.1.2" - }, - "peerDependenciesMeta": { - "c-kzg": { - "optional": true - } - } - }, - "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", - "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", - "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "c-kzg": "^2.1.2" - }, - "peerDependenciesMeta": { - "c-kzg": { - "optional": true - } - } - }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.8.tgz", @@ -2254,9 +2280,9 @@ } }, "node_modules/@nomicfoundation/hardhat-verify": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.13.tgz", - "integrity": "sha512-i57GX1sC0kYGyRVnbQrjjyBTpWTKgrvKC+jH8CMKV6gHp959Upb8lKaZ58WRHIU0espkulTxLnacYeUDirwJ2g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.1.1.tgz", + "integrity": "sha512-K1plXIS42xSHDJZRkrE2TZikqxp9T4y6jUMUNI/imLgN5uCcEQokmfU0DlyP9zzHncYK92HlT5IWP35UVCLrPw==", "dev": true, "license": "MIT", "dependencies": { @@ -2271,7 +2297,7 @@ "undici": "^5.14.0" }, "peerDependencies": { - "hardhat": "^2.0.4" + "hardhat": "^2.26.0" } }, "node_modules/@nomicfoundation/solidity-analyzer": { @@ -2445,28 +2471,36 @@ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/@protobufjs/base64": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", @@ -2474,6 +2508,8 @@ "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", "dev": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -2484,35 +2520,45 @@ "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/@protobufjs/pool": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/@scure/base": { "version": "1.1.9", @@ -2693,7 +2739,9 @@ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.33.22.tgz", "integrity": "sha512-auUj4k+f4pyrIVf4GW5UKquSZFHJWri06QgARy9C0t9ZTjJLIuNIrr1yl9bWcJWJ1Gz1vOvYN1D+QPaIlNMVkQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@sindresorhus/is": { "version": "5.6.0", @@ -2713,6 +2761,8 @@ "integrity": "sha512-PWcVmRx2gSQ8jd5va5HzSlKqQmR8Q1sYaPcqpCzhOHcApJ4YsVWY6QhaOD5Nx7z1UXkP12vNq3KDsSCZnT3Hkw==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "peerDependencies": { "@solana/web3.js": "^2.0.0" } @@ -2723,6 +2773,8 @@ "integrity": "sha512-q0ZnylK+LISjuP2jH5GWV9IJPtpzQctj5KQwij9XCDRSGkcFr2fpqptNnVupTLQiNL6Q4c1OZuG8WBmyFXVXZw==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "peerDependencies": { "@solana/web3.js": "^2.0.0" } @@ -2733,6 +2785,8 @@ "integrity": "sha512-eSYmjsapzE9jXT2J9xydlMj/zsangMEIZAy9dy75VCXM6kgDCSnH5R7+HsIoKOTvb2VggU7GojC+YhMwWGCIBw==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "peerDependencies": { "@solana/web3.js": "^2.0.0" } @@ -2743,6 +2797,8 @@ "integrity": "sha512-URHA91F9sDibbL6RbuhnKHWGeAONCDcCmHq8tMtpVOhse9/WKp0JOvdLSiGuRkKZqLHo74xF8otmgPVchgVZXQ==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "peerDependencies": { "@solana/web3.js": "^2.0.0" } @@ -2753,6 +2809,8 @@ "integrity": "sha512-1CE4P3QSDH5x+ZtSthMY2mn/ekROBnlT3/4f3CHDJicDvLQsgAq2yCvGHsYkK3ZA0mxhFLuhJVjuKASPnmG1rQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/addresses": "2.0.0", "@solana/codecs-core": "2.0.0", @@ -2774,6 +2832,8 @@ "integrity": "sha512-8n3c/mUlH1/z+pM8e7OJ6uDSXw26Be0dgYiokiqblO66DGQ0d+7pqFUFZ5pEGjJ9PU2lDTSfY8rHf4cemOqwzQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/assertions": "2.0.0", "@solana/codecs-core": "2.0.0", @@ -2793,6 +2853,8 @@ "integrity": "sha512-NyPPqZRNGXs/GAjfgsw7YS6vCTXWt4ibXveS+ciy5sdmp/0v3pA6DlzYjleF9Sljrew0IiON15rjaXamhDxYfQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/errors": "2.0.0" }, @@ -2809,6 +2871,8 @@ "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "buffer": "~6.0.3" }, @@ -2836,6 +2900,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -2847,6 +2913,8 @@ "integrity": "sha512-xneIG5ppE6WIGaZCK7JTys0uLhzlnEJUdBO8nRVIyerwH6aqCfb0fGe7q5WNNYAVDRSxC0Pc1TDe1hpdx3KWmQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/codecs-core": "2.0.0", "@solana/codecs-data-structures": "2.0.0", @@ -2867,6 +2935,8 @@ "integrity": "sha512-qCG+3hDU5Pm8V6joJjR4j4Zv9md1z0RaecniNDIkEglnxmOUODnmPLWbtOjnDylfItyuZeDihK8hkewdj8cUtw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/errors": "2.0.0" }, @@ -2883,6 +2953,8 @@ "integrity": "sha512-N98Y4jsrC/XeOgqrfsGqcOFIaOoMsKdAxOmy5oqVaEN67YoGSLNC9ROnqamOAOrsZdicTWx9/YLKFmQi9DPh1A==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/codecs-core": "2.0.0", "@solana/codecs-numbers": "2.0.0", @@ -2901,6 +2973,8 @@ "integrity": "sha512-r66i7VzJO1MZkQWZIAI6jjJOFVpnq0+FIabo2Z2ZDtrArFus/SbSEv543yCLeD2tdR/G/p+1+P5On10qF50Y1Q==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/codecs-core": "2.0.0", "@solana/errors": "2.0.0" @@ -2918,6 +2992,8 @@ "integrity": "sha512-dNqeCypsvaHcjW86H0gYgAZGGkKVBeKVeh7WXlOZ9kno7PeQ2wNkpccyzDfuzaIsKv+HZUD3v/eo86GCvnKazQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/codecs-core": "2.0.0", "@solana/codecs-numbers": "2.0.0", @@ -2937,6 +3013,8 @@ "integrity": "sha512-IHlaPFSy4lvYco1oHJ3X8DbchWwAwJaL/4wZKnF1ugwZ0g0re8wbABrqNOe/jyZ84VU9Z14PYM8W9oDAebdJbw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" @@ -2957,6 +3035,8 @@ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -2970,6 +3050,8 @@ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=18" } @@ -2980,6 +3062,8 @@ "integrity": "sha512-EsIx9z+eoxOmC+FpzhEb+H67CCYTbs/omAqXD4EdEYnCHWrI1li1oYBV+NoKzfx8fKlX+nzNB7S/9kc4u7Etpw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=20.18.0" }, @@ -2993,6 +3077,8 @@ "integrity": "sha512-Sj+sLiUTimnMEyGnSLGt0lbih2xPDUhxhonnrIkPwA+hjQ3ULGHAxeevHU06nqiVEgENQYUJ5rCtHs4xhUFAkQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=20.18.0" }, @@ -3006,6 +3092,8 @@ "integrity": "sha512-MiTEiNF7Pzp+Y+x4yadl2VUcNHboaW5WP52psBuhHns3GpbbruRv5efMpM9OEQNe1OsN+Eg39vjEidX55+P+DQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/errors": "2.0.0" }, @@ -3022,6 +3110,8 @@ "integrity": "sha512-SSLSX8BXRvfLKBqsmBghmlhMKpwHeWd5CHi5zXgTS1BRrtiU6lcrTVC9ie6B+WaNNq7oe3e6K5bdbhu3fFZ+0g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/assertions": "2.0.0", "@solana/codecs-core": "2.0.0", @@ -3041,6 +3131,8 @@ "integrity": "sha512-OVc4KnYosB8oAukQ/htgrxXSxlUP6gUu5Aau6d/BgEkPQzWd/Pr+w91VWw3i3zZuu2SGpedbyh05RoJBe/hSXA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/codecs-core": "2.0.0", "@solana/codecs-data-structures": "2.0.0", @@ -3061,6 +3153,8 @@ "integrity": "sha512-JPIKB61pWfODnsvEAaPALc6vR5rn7kmHLpFaviWhBtfUlEVgB8yVTR0MURe4+z+fJCPRV5wWss+svA4EeGDYzQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/addresses": "2.0.0", "@solana/errors": "2.0.0" @@ -3078,6 +3172,8 @@ "integrity": "sha512-4teQ52HDjK16ORrZe1zl+Q9WcZdQ+YEl0M1gk59XG7D0P9WqaVEQzeXGnKSCs+Y9bnB1u5xCJccwpUhHYWq6gg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=20.18.0" }, @@ -3091,6 +3187,8 @@ "integrity": "sha512-TumQ9DFRpib/RyaIqLVfr7UjqSo7ldfzpae0tgjM93YjbItB4Z0VcUXc3uAFvkeYw2/HIMb46Zg43mkUwozjDg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/errors": "2.0.0", "@solana/fast-stable-stringify": "2.0.0", @@ -3115,6 +3213,8 @@ "integrity": "sha512-1FwitYxwADMF/6zKP2kNXg8ESxB6GhNBNW1c4f5dEmuXuBbeD/enLV3WMrpg8zJkIaaYarEFNbt7R7HyFzmURQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/addresses": "2.0.0", "@solana/codecs-core": "2.0.0", @@ -3141,6 +3241,8 @@ "integrity": "sha512-VCeY/oKVEtBnp8EDOc5LSSiOeIOLFIgLndcxqU0ij/cZaQ01DOoHbhluvhZtU80Z3dUeicec8TiMgkFzed+WhQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=20.18.0" }, @@ -3154,6 +3256,8 @@ "integrity": "sha512-1uIDzj7vocCUqfOifjv1zAuxQ53ugiup/42edVFoQLOnJresoEZLL6WjnsJq4oCTccEAvGhUBI1WWKeZTGNxFQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/errors": "2.0.0", "@solana/rpc-spec-types": "2.0.0" @@ -3171,6 +3275,8 @@ "integrity": "sha512-G2lmhFhgtxMQd/D6B04BHGE7bm5dMZdIPQNOqVGhzNAVjrmyapD3JN2hKAbmaYPe97wLfZERw0Ux1u4Y6q7TqA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=20.18.0" }, @@ -3184,6 +3290,8 @@ "integrity": "sha512-AdwMJHMrhlj7q1MPjZmVcKq3iLqMW3N0MT8kzIAP2vP+8o/d6Fn4aqGxoz2Hlfn3OYIZoYStN2VBtwzbcfEgMA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/errors": "2.0.0", "@solana/fast-stable-stringify": "2.0.0", @@ -3210,6 +3318,8 @@ "integrity": "sha512-NAJQvSFXYIIf8zxsMFBCkSbZNZgT32pzPZ1V6ZAd+U2iDEjx3L+yFwoJgfOcHp8kAV+alsF2lIsGBlG4u+ehvw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/addresses": "2.0.0", "@solana/keys": "2.0.0", @@ -3232,6 +3342,8 @@ "integrity": "sha512-VXMiI3fYtU1PkVVTXL87pcY48ZY8aCi1N6FqtxSP2xg/GASL01j1qbwyIL1OvoCqGyRgIxdd/YfaByW9wmWBhA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/errors": "2.0.0", "@solana/promises": "2.0.0", @@ -3251,6 +3363,8 @@ "integrity": "sha512-hSQDZBmcp2t+gLZsSBqs/SqVw4RuNSC7njiP46azyzW7oGg8X2YPV36AHGsHD12KPsc0UpT1OAZ4+AN9meVKww==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/errors": "2.0.0", "@solana/functional": "2.0.0", @@ -3271,6 +3385,7 @@ "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "dev": true, "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=10.0.0" @@ -3294,6 +3409,8 @@ "integrity": "sha512-H6tN0qcqzUangowsLLQtYXKJsf1Roe3/qJ1Cy0gv9ojY9uEvNbJqpeEj+7blv0MUZfEe+rECAwBhxxRKPMhYGw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/errors": "2.0.0", "@solana/functional": "2.0.0", @@ -3313,6 +3430,8 @@ "integrity": "sha512-UJLhKhhxDd1OPi8hb2AenHsDm1mofCBbhWn4bDCnH2Q3ulwYadUhcNqNbxjJPQ774VNhAf53SSI5A6PQo8IZSQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/errors": "2.0.0", "@solana/rpc-spec": "2.0.0", @@ -3332,6 +3451,8 @@ "integrity": "sha512-o1ApB9PYR0A3XjVSOh//SOVWgjDcqMlR3UNmtqciuREIBmWqnvPirdOa5EJxD3iPhfA4gnNnhGzT+tMDeDW/Kw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/addresses": "2.0.0", "@solana/codecs-core": "2.0.0", @@ -3352,6 +3473,8 @@ "integrity": "sha512-JEYJS3x/iKkqPV/3b1nLpX9lHib21wQKV3fOuu1aDLQqmX9OYKrnIIITYdnFDhmvGhpEpkkbPnqu7yVaFIBYsQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/addresses": "2.0.0", "@solana/codecs-core": "2.0.0", @@ -3374,6 +3497,8 @@ "integrity": "sha512-Ex7d2GnTSNVMZDU3z6nKN4agRDDgCgBDiLnmn1hmt0iFo3alr3gRAqiqa7qGouAtYh9/29pyc8tVJCijHWJPQQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/errors": "2.0.0" }, @@ -3390,6 +3515,8 @@ "integrity": "sha512-8D4ajKcCYQsTG1p4k30lre2vjxLR6S5MftUGJnIaQObDCzGmaeA9GRti4Kk4gSPWVYFTBoj1ASx8EcEXaB3eIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/accounts": "2.0.0", "@solana/codecs": "2.0.0", @@ -3409,6 +3536,8 @@ "integrity": "sha512-JkTw5gXLiqQjf6xK0fpVcoJ/aMp2kagtFSD/BAOazdJ3UYzOzbzqvECt6uWa3ConcMswQ2vXalVtI7ZjmYuIeg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/addresses": "2.0.0", "@solana/codecs-strings": "2.0.0", @@ -3434,6 +3563,8 @@ "integrity": "sha512-Uc6Fw1EJLBrmgS1lH2ZfLAAKFvprWPQQzOVwZS78Pv8Whsk7tweYTK6S0Upv0nHr50rGpnORJfmdBrXE6OfNGg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/addresses": "2.0.0", "@solana/codecs-core": "2.0.0", @@ -3457,6 +3588,8 @@ "integrity": "sha512-VfdTE+59WKvuBG//6iE9RPjAB+ZT2kLgY2CDHabaz6RkH6OjOkMez9fWPVa3Xtcus+YQWN1SnQoryjF/xSx04w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/addresses": "2.0.0", "@solana/codecs-core": "2.0.0", @@ -3483,6 +3616,8 @@ "integrity": "sha512-x+ZRB2/r5tVK/xw8QRbAfgPcX51G9f2ifEyAQ/J5npOO+6+MPeeCjtr5UxHNDAYs9Ypo0PN+YJATCO4vhzQJGg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@solana/accounts": "2.0.0", "@solana/addresses": "2.0.0", @@ -3540,39 +3675,58 @@ } }, "node_modules/@solarity/hardhat-migrate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@solarity/hardhat-migrate/-/hardhat-migrate-3.0.0.tgz", - "integrity": "sha512-o6UMr2e+el8nA+zo/7oEzviYtvRK2ymVk6/bth8ssj2ZKC65HnpWKI5U4S+E386lAOTTJGUDuh4reEYDmvVGHg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@solarity/hardhat-migrate/-/hardhat-migrate-3.1.1.tgz", + "integrity": "sha512-1eOwtQSpZTDu4TwRy6e/ItXs74yDiRDfejRGeIlyH9th4Vybs/AluCdpGiEdYT+VIB6Kx+8QAZ92o1pMqW9P7Q==", "dev": true, "license": "MIT", "workspaces": [ "test/fixture-projects/*" ], "dependencies": { - "@trezor/connect": "9.5.0", - "axios": "1.7.9", - "ethers": "6.13.5", - "json2md": "2.0.2", + "axios": "1.9.0", + "ethers": "6.13.7", + "json2md": "2.0.3", "ora": "5.4.1", - "prettier": "3.5.1" + "prettier": "3.5.3" }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.0", - "@nomicfoundation/hardhat-verify": "^2.0.0", - "hardhat": "^2.10.0", + "@nomicfoundation/hardhat-verify": "^2.1.0", + "@trezor/connect": "9.5.0", + "hardhat": "^2.26.0", "typechain": "^8.0.0" + }, + "peerDependenciesMeta": { + "@trezor/connect": { + "optional": true + } } }, - "node_modules/@solarity/hardhat-migrate/node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "node_modules/@solarity/hardhat-migrate/node_modules/json2md": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/json2md/-/json2md-2.0.3.tgz", + "integrity": "sha512-ZPzh6Djvqz8grJMxKllfCHo0p+p7BsbZ1J95KcCJgvvfdoy7myuKrrkUp80Kpy+wGauykC0dYljLqLY0kENaOw==", "dev": true, "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "indento": "^1.1.13" + } + }, + "node_modules/@solarity/hardhat-migrate/node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/@solarity/solidity-lib": { @@ -3620,6 +3774,8 @@ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "tslib": "^2.8.0" } @@ -3629,7 +3785,9 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "optional": true, + "peer": true }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", @@ -3649,6 +3807,8 @@ "integrity": "sha512-z6dqmpK+DeJJN9cSUlOtxf0QB4dJM2rrOg0M4SMJuEZAAtEBMuhBMt2drs4KvS81ZfT8y7KOs8TvCV7Mkxxy4g==", "dev": true, "license": "See LICENSE.md in repo root", + "optional": true, + "peer": true, "dependencies": { "@trezor/env-utils": "1.3.0", "@trezor/utils": "9.3.0" @@ -3663,6 +3823,8 @@ "integrity": "sha512-oZIf9MY7NU/kZwe6nxIRpbyuW/1loaC19tQCRdNac3nUdKKfGpS4Km9dXjau9rdq9ZzoXiBPdmJ28IF8Fbf37A==", "dev": true, "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "peer": true, "dependencies": { "@everstake/wallet-sdk": "^1.0.10", "@solana-program/token": "^0.4.1", @@ -3689,6 +3851,8 @@ "integrity": "sha512-NTMFrDzNyAoqE1556UVp63KuCkrpZa3Lv4SKWOpIovkQP0kk4trMKRZua1phqOFdPHUw2lWRxOzvCHq6xOnzmg==", "dev": true, "license": "See LICENSE.md in repo root", + "optional": true, + "peer": true, "dependencies": { "@everstake/wallet-sdk": "^1.0.10", "@solana/web3.js": "^2.0.0", @@ -3705,6 +3869,8 @@ "integrity": "sha512-RDosOutSlltckmetUq+02XqwkiZVNYwSh82SpD/ZWQKjohZT5Cv6L9RMGt34+UurZXPUxFOvHQj1gBc+DIamkw==", "dev": true, "license": "See LICENSE.md in repo root", + "optional": true, + "peer": true, "dependencies": { "@everstake/wallet-sdk": "^1.0.10", "@mobily/ts-belt": "^3.13.1", @@ -3721,6 +3887,8 @@ "integrity": "sha512-xvt5TK0uNgVvfLx7MC0Bqwt2FesEmo8iPaOV73KRHqx2uzqZoYwRuHRmL2UN/eMyxRIZgCmaZZXlflRLTXVFgw==", "dev": true, "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "peer": true, "dependencies": { "@babel/preset-typescript": "^7.24.7", "@ethereumjs/common": "^4.4.0", @@ -3761,6 +3929,8 @@ "integrity": "sha512-DCKVnnCB7h+XysUKzghVg2PY/5zETt2dkbKtywwd/uRgnXH3LuFajVj60s1eTOLzSakUaUHr5i+v+Gi2Poz4yA==", "dev": true, "license": "See LICENSE.md in repo root", + "optional": true, + "peer": true, "dependencies": { "@trezor/analytics": "1.3.0" }, @@ -3774,6 +3944,8 @@ "integrity": "sha512-7hjIuXAFxKZp72u2oESuxUFx77onLMOyWNVZf0uOaC6WBfhux7ZYgY+9+qGiV9SYD6xpdLRhrlKerxtQn78eng==", "dev": true, "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "peer": true, "dependencies": { "@trezor/env-utils": "1.3.0", "@trezor/utils": "9.3.0" @@ -3788,6 +3960,8 @@ "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^14.21.3 || >=16" }, @@ -3801,6 +3975,8 @@ "integrity": "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "funding": { "url": "https://paulmillr.com/funding/" } @@ -3811,6 +3987,8 @@ "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.7.1", "@scure/base": "~1.2.4" @@ -3824,7 +4002,9 @@ "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@trezor/connect/node_modules/bs58": { "version": "6.0.0", @@ -3832,6 +4012,8 @@ "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base-x": "^5.0.0" } @@ -3842,6 +4024,8 @@ "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "^1.2.0", "bs58": "^6.0.0" @@ -3853,6 +4037,8 @@ "integrity": "sha512-Uej/0tM9ElOdh+zSHkNZ2fV3NhxhB05tb8rQrboWQ711h2NmKYTpza0KwqLn1riVFQU35+6ok4WxmdB6iPP1gA==", "dev": true, "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "peer": true, "peerDependencies": { "tslib": "^2.6.2" } @@ -3863,6 +4049,8 @@ "integrity": "sha512-ll9RGEAFZuX/C79KU3/OTjRdD/TS0vOx0PcW6n9JtGeMrFeEwRrgVy8+0OcFcYODSdzsWLhwB9XHPaLPC3tOCQ==", "dev": true, "license": "See LICENSE.md in repo root", + "optional": true, + "peer": true, "dependencies": { "ua-parser-js": "^1.0.37" }, @@ -3890,6 +4078,8 @@ "integrity": "sha512-HLi++RB9/9AYK/k/BOODMNcibyN8Z8MPtcYcHcnxqNbv+/xTaNThBh70Q3ji57p0Vc17n/5QtFB4dhsWX3cNrg==", "dev": true, "license": "See LICENSE.md in repo root", + "optional": true, + "peer": true, "dependencies": { "@trezor/schema-utils": "1.3.0", "protobufjs": "7.4.0" @@ -3904,6 +4094,8 @@ "integrity": "sha512-iXD+Wqpk0FpwJpQbAFKw+8AL6ipfDjQ7g+MYZ7lU1H7/gCxM2XqLI4eW7Il+FAwk7orepDuoSbJSVcsNJYKjOA==", "dev": true, "license": "See LICENSE.md in repo root", + "optional": true, + "peer": true, "peerDependencies": { "tslib": "^2.6.2" } @@ -3914,6 +4106,8 @@ "integrity": "sha512-/emJCZcONgKVp3fgh5RB2pge73lIZYnvLnx8ik+lBwaH/XX/kfF1vNC2aSjeqg/i9JmaKC5waDd33PxCjxjECg==", "dev": true, "license": "See LICENSE.md in repo root", + "optional": true, + "peer": true, "dependencies": { "@sinclair/typebox": "^0.33.7", "ts-mixer": "^6.0.3" @@ -3928,6 +4122,8 @@ "integrity": "sha512-OfeowwZj9BCxr+t+lFM532F9VeJ4FbbkjGjVwDh9qnyP1cg7ddbefKotzewro5nIjmgGLu47gvjwHvhncKiSXw==", "dev": true, "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "peer": true, "dependencies": { "@trezor/protobuf": "1.3.0", "@trezor/protocol": "1.2.2", @@ -3946,7 +4142,9 @@ "resolved": "https://registry.npmjs.org/@trezor/type-utils/-/type-utils-1.1.4.tgz", "integrity": "sha512-pzrIdskmTZRocHellMZxCDPQ3IpmTr749qn1xdIN29pIKuI4ms0OfNUPk/rfR4Iug0kEiWt+n+Hw7+lIBzc2LA==", "dev": true, - "license": "See LICENSE.md in repo root" + "license": "See LICENSE.md in repo root", + "optional": true, + "peer": true }, "node_modules/@trezor/utils": { "version": "9.3.0", @@ -3954,6 +4152,8 @@ "integrity": "sha512-u3b3uYPnSW3IH8nY1Pic4L7q8QF4rjY5Aikm+zZF1vC+b2W3J8kvyL9e9f0D2OPvtC9UPPRUW7ZGQZ35eTDsKA==", "dev": true, "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "peer": true, "dependencies": { "bignumber.js": "^9.1.2" }, @@ -3967,6 +4167,8 @@ "integrity": "sha512-YvMdvOvX0v1KSzUelz8TfZDo/6hTR4GvIRKCiq2rIT1XmxeZiP8FYuOUcAL7YqL8tdKTPiMXzw2k9LSsdhvOrQ==", "dev": true, "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "peer": true, "dependencies": { "@trezor/utils": "9.3.0", "bchaddrjs": "^0.5.2", @@ -3995,7 +4197,9 @@ "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@trezor/utxo-lib/node_modules/bs58": { "version": "6.0.0", @@ -4003,6 +4207,8 @@ "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base-x": "^5.0.0" } @@ -4013,6 +4219,8 @@ "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "^1.2.0", "bs58": "^6.0.0" @@ -4024,6 +4232,8 @@ "integrity": "sha512-7KD1Ive8jMcGpdTAHmV1FPCFUjqYiV/2kGJHBqoLXx4kkvkMU9n9++WieD2W7YVDM3uXuIoRvGYRnZDjcFuEdw==", "dev": true, "license": "SEE LICENSE IN LICENSE.md", + "optional": true, + "peer": true, "dependencies": { "@trezor/utils": "9.3.0", "ws": "^8.18.0" @@ -4038,6 +4248,8 @@ "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -4174,6 +4386,8 @@ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -4220,13 +4434,9 @@ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", "dev": true, - "license": "MIT" - }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@types/minimatch": { "version": "5.1.2", @@ -4280,21 +4490,27 @@ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@types/w3c-web-usb": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@types/w3c-web-usb/-/w3c-web-usb-1.0.10.tgz", "integrity": "sha512-CHgUI5kTc/QLMP8hODUHhge0D4vx+9UiAwIGiT0sTy/B2XpdX1U5rJt6JSISgr6ikRT7vxV9EVAFeYZqUnl1gQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/@types/web": { "version": "0.0.197", "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.197.tgz", "integrity": "sha512-V4sOroWDADFx9dLodWpKm298NOJ1VJ6zoDVgaP+WBb/utWxqQ6gnMzd9lvVDAr/F3ibiKaxH9i45eS0gQPSTaQ==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "node_modules/@types/ws": { "version": "7.4.7", @@ -4302,6 +4518,8 @@ "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -4390,6 +4608,8 @@ "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "humanize-ms": "^1.2.1" }, @@ -4548,6 +4768,8 @@ "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", @@ -4600,6 +4822,8 @@ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -4663,6 +4887,8 @@ "integrity": "sha512-OO7gIn3m7ea4FVx4cT8gdlWQR2+++EquhdpWQJH9BQjK63tJJ6ngB3QMZDO6DiBoXiIGUsTPHjlrHVxPGcGxLQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "bs58check": "2.1.2", "buffer": "^6.0.3", @@ -4693,6 +4919,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -4703,7 +4931,9 @@ "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/better-ajv-errors": { "version": "2.0.2", @@ -4800,6 +5030,8 @@ "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", "dev": true, "license": "Unlicense", + "optional": true, + "peer": true, "engines": { "node": ">=0.6" } @@ -4811,6 +5043,8 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "bindings": "^1.3.0" }, @@ -4824,6 +5058,8 @@ "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "*" } @@ -4846,6 +5082,8 @@ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "file-uri-to-path": "1.0.0" } @@ -4855,14 +5093,18 @@ "resolved": "https://registry.npmjs.org/bip66/-/bip66-2.0.0.tgz", "integrity": "sha512-kBG+hSpgvZBrkIm9dt5T1Hd/7xGCPEX2npoxAWZfsK1FvjgaxySEh2WizjyIstWXriKo9K9uJ4u0OnsyLDUPXQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/bitcoin-ops": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/bitcoin-ops/-/bitcoin-ops-1.4.1.tgz", "integrity": "sha512-pef6gxZFztEhaE9RY9HmWVmiIHqCb2OyS4HPKkpc6CIiiOa3Qmuoylxc5P2EkU3w+5eTSifI9SEZC88idAIGow==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/bl": { "version": "4.1.0", @@ -4882,6 +5124,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-addon-api": "^3.0.0", "node-gyp-build": "^4.2.2", @@ -4896,7 +5140,9 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/blakejs": { "version": "1.2.1", @@ -4916,6 +5162,8 @@ "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", @@ -5112,6 +5360,7 @@ } ], "license": "MIT", + "optional": true, "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001688", @@ -5189,6 +5438,7 @@ "dev": true, "hasInstallScript": true, "optional": true, + "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -5237,6 +5487,8 @@ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -5257,6 +5509,8 @@ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -5271,6 +5525,8 @@ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -5311,6 +5567,7 @@ } ], "license": "CC-BY-4.0", + "optional": true, "peer": true }, "node_modules/cashaddrjs": { @@ -5319,6 +5576,8 @@ "integrity": "sha512-xZkuWdNOh0uq/mxJIng6vYWfTowZLd9F4GMAlp2DwFHlcCqCm91NtuAc47RuV4L7r4PYcY5p6Cr2OKNb4hnkWA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "big-integer": "1.6.36" } @@ -5651,6 +5910,7 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT", + "optional": true, "peer": true }, "node_modules/cookie": { @@ -5694,6 +5954,8 @@ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "dev": true, "license": "Apache-2.0", + "optional": true, + "peer": true, "bin": { "crc32": "bin/crc32.njs" }, @@ -5740,6 +6002,8 @@ "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "node-fetch": "^2.7.0" } @@ -5822,7 +6086,9 @@ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/decompress-response": { "version": "6.0.0", @@ -5904,6 +6170,8 @@ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -5921,6 +6189,8 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -5939,6 +6209,8 @@ "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=10" }, @@ -6016,6 +6288,8 @@ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -6037,6 +6311,7 @@ "integrity": "sha512-Ku4NMzUjz3e3Vweh7PhApPrZSS4fyiCIbcIrG9eKrriYVLmbMepETR/v6SU7xPm98QTqMSYiCwfO89QNjXLkbQ==", "dev": true, "license": "ISC", + "optional": true, "peer": true }, "node_modules/elliptic": { @@ -6125,6 +6400,8 @@ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -6134,6 +6411,8 @@ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -6144,6 +6423,8 @@ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -6156,7 +6437,9 @@ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/es6-promisify": { "version": "5.0.0", @@ -6164,6 +6447,8 @@ "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "es6-promise": "^4.0.3" } @@ -6290,6 +6575,8 @@ "integrity": "sha512-7PslfFiHPUrA0zQpMgZdftUBNyVWuHVBwnRtDOr6Eam8O/OwucqP+OHZZDE7qdrWzi4Jrji8IMw2ZUFv/wbs8Q==", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/providers": "^5.0.10", "ethers": "^5.0.15" @@ -6311,6 +6598,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@ethersproject/abi": "5.8.0", "@ethersproject/abstract-provider": "5.8.0", @@ -6344,47 +6633,6 @@ "@ethersproject/wordlists": "5.8.0" } }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "deprecated": "This library has been deprecated and usage is discouraged.", - "dev": true, - "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dev": true, - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, "node_modules/ethereumjs-util": { "version": "7.1.5", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", @@ -6402,9 +6650,9 @@ } }, "node_modules/ethers": { - "version": "6.13.5", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.5.tgz", - "integrity": "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==", + "version": "6.13.7", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.7.tgz", + "integrity": "sha512-qbaJ0uIrjh+huP1Lad2f2QtzW5dcqSVjIzVH6yWB4dKoMuj2WqYz5aMeeQTCNpAKgTJBM5J9vcc2cYJ23UAimQ==", "dev": true, "funding": [ { @@ -6465,26 +6713,14 @@ "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", "dev": true }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dev": true, - "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, "node_modules/eventemitter3": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/events": { "version": "3.3.0", @@ -6492,6 +6728,8 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=0.8.x" } @@ -6511,6 +6749,8 @@ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": "> 0.1.90" } @@ -6560,7 +6800,9 @@ "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/fast-uri": { "version": "3.0.3", @@ -6574,6 +6816,7 @@ "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", "dev": true, "license": "CC0-1.0", + "optional": true, "peer": true }, "node_modules/fastq": { @@ -6590,7 +6833,9 @@ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/fill-range": { "version": "7.1.1", @@ -6667,6 +6912,8 @@ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "is-callable": "^1.1.3" } @@ -6801,6 +7048,7 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", + "optional": true, "peer": true, "engines": { "node": ">=6.9.0" @@ -6831,6 +7079,8 @@ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -6856,6 +7106,8 @@ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -6954,6 +7206,8 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=4" } @@ -6983,6 +7237,8 @@ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -7052,22 +7308,17 @@ } }, "node_modules/hardhat": { - "version": "2.22.18", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.18.tgz", - "integrity": "sha512-2+kUz39gvMo56s75cfLBhiFedkQf+gXdrwCcz4R/5wW0oBdwiyfj2q9BIkMoaA0WIGYYMU2I1Cc4ucTunhfjzw==", + "version": "2.26.3", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.26.3.tgz", + "integrity": "sha512-gBfjbxCCEaRgMCRgTpjo1CEoJwqNPhyGMMVHYZJxoQ3LLftp2erSVf8ZF6hTQC0r2wst4NcqNmLWqMnHg1quTw==", "dev": true, "license": "MIT", "dependencies": { + "@ethereumjs/util": "^9.1.0", "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/edr": "^0.7.0", - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", + "@nomicfoundation/edr": "^0.11.3", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", "adm-zip": "^0.4.16", "aggregate-error": "^3.0.0", "ansi-escapes": "^4.3.0", @@ -7078,7 +7329,6 @@ "enquirer": "^2.3.0", "env-paths": "^2.2.0", "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", "find-up": "^5.0.0", "fp-ts": "1.19.3", "fs-extra": "^7.0.1", @@ -7087,6 +7337,7 @@ "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", @@ -7389,52 +7640,160 @@ "glob": "dist/esm/bin.mjs" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/hardhat-gas-reporter/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat/node_modules/@ethereumjs/rlp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", + "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", + "dev": true, + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/hardhat/node_modules/@ethereumjs/util": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz", + "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/rlp": "^5.0.2", + "ethereum-cryptography": "^2.2.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/hardhat/node_modules/@ethereumjs/util/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat/node_modules/@ethereumjs/util/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat/node_modules/@ethereumjs/util/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/hardhat-gas-reporter/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/hardhat/node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, - "engines": { - "node": ">=8" + "license": "MIT", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" } }, - "node_modules/hardhat-gas-reporter/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/hardhat/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" + "@noble/hashes": "1.4.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/hardhat-gas-reporter/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/hardhat/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/hardhat-gas-reporter/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" + "node": ">= 16" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/hardhat/node_modules/@noble/hashes": { @@ -7825,6 +8184,8 @@ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -7838,6 +8199,8 @@ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -7850,6 +8213,8 @@ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "has-symbols": "^1.0.3" }, @@ -7976,6 +8341,8 @@ "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ms": "^2.0.0" } @@ -8090,7 +8457,9 @@ "resolved": "https://registry.npmjs.org/int64-buffer/-/int64-buffer-1.1.0.tgz", "integrity": "sha512-94smTCQOvigN4d/2R/YDjz8YVG0Sufvv2aAh8P5m42gwhCsDAJqnbNOrxJsrADuAFAA69Q/ptGzxvNcNuIJcvw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/interpret": { "version": "1.4.0", @@ -8116,6 +8485,8 @@ "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -8129,7 +8500,9 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "optional": true, + "peer": true }, "node_modules/is-arguments": { "version": "1.2.0", @@ -8137,6 +8510,8 @@ "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" @@ -8171,6 +8546,8 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" }, @@ -8217,6 +8594,8 @@ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", @@ -8267,6 +8646,8 @@ "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -8302,6 +8683,8 @@ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -8320,6 +8703,8 @@ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "which-typed-array": "^1.1.14" }, @@ -8354,6 +8739,8 @@ "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "ws": "*" } @@ -8394,6 +8781,8 @@ "integrity": "sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", @@ -8420,14 +8809,18 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/jayson/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/jayson/node_modules/isomorphic-ws": { "version": "4.0.1", @@ -8435,6 +8828,8 @@ "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "ws": "*" } @@ -8445,6 +8840,8 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -8455,6 +8852,8 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -8500,7 +8899,9 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/jsesc": { "version": "3.1.0", @@ -8508,6 +8909,8 @@ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "jsesc": "bin/jsesc" }, @@ -8547,7 +8950,9 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, - "license": "ISC" + "license": "ISC", + "optional": true, + "peer": true }, "node_modules/json2md": { "version": "2.0.2", @@ -8588,7 +8993,9 @@ "engines": [ "node >= 0.2.0" ], - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/jsonpointer": { "version": "5.0.1", @@ -8614,6 +9021,8 @@ "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "license": "(MIT OR Apache-2.0)", + "optional": true, + "peer": true, "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -8839,7 +9248,9 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "node_modules/loupe": { "version": "2.3.7", @@ -8899,6 +9310,8 @@ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -8932,12 +9345,76 @@ "node": ">= 8" } }, + "node_modules/micro-eth-signer": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/micro-eth-signer/-/micro-eth-signer-0.14.0.tgz", + "integrity": "sha512-5PLLzHiVYPWClEvZIXXFu5yutzpadb73rnQCpUqIHu3No3coFuWQNfE5tkBQJ7djuLYl6aRLaS0MgWJYGoqiBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "micro-packed": "~0.7.2" + } + }, + "node_modules/micro-eth-signer/node_modules/@noble/curves": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz", + "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.7.2" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-eth-signer/node_modules/@noble/hashes": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", + "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/micro-ftch": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==", "dev": true }, + "node_modules/micro-packed": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.3.tgz", + "integrity": "sha512-2Milxs+WNC00TRlem41oRswvw31146GiSaoCT7s3Xi2gMUglW5QBeqlQaZeHr5tJx9nm3i57LNXPqxOOaWtTYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@scure/base": "~1.2.5" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/micro-packed/node_modules/@scure/base": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz", + "integrity": "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -9236,7 +9713,9 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.2.tgz", "integrity": "sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/neo-async": { "version": "2.6.2", @@ -9265,6 +9744,8 @@ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -9297,6 +9778,7 @@ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT", + "optional": true, "peer": true }, "node_modules/nofilter": { @@ -9368,6 +9850,8 @@ "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" @@ -9384,6 +9868,8 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -9393,6 +9879,8 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "call-bind": "^1.0.5", "define-properties": "^1.2.1", @@ -9838,6 +10326,8 @@ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">= 0.4" } @@ -9921,6 +10411,8 @@ "dev": true, "hasInstallScript": true, "license": "BSD-3-Clause", + "optional": true, + "peer": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -9944,7 +10436,9 @@ "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "optional": true, + "peer": true }, "node_modules/proxy-from-env": { "version": "1.1.0", @@ -9968,6 +10462,8 @@ "integrity": "sha512-hw7rcYTJRAl4olM8Owe8x0fBuJJ+WGbMhQuLWOXEMN3PxPCKQHRkhfL+XG0+iXUmSHjkMmb3Ba55Mt21cZc9kQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "bitcoin-ops": "^1.3.0" } @@ -10129,7 +10625,9 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/registry-auth-token": { "version": "5.0.2", @@ -10262,6 +10760,8 @@ "integrity": "sha512-Qa3+9wKVvpL/xYtT6+wANsn0A1QcC5CT6IMZbRJZ/1lGt7gmwIfsrCuz1X0+LCEO7zgb+3UT1I1dc0k/5dwKQQ==", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "base-x": "^3.0.9", "create-hash": "^1.1.2" @@ -10276,6 +10776,8 @@ "integrity": "sha512-g7+gs3T+NfoeW6vIq5dcN0CkIT4t/zwRzFxz8X2RzfbrWRnewPUKqQbmBgs05tXLX5NuWPaneiaAVpFpYBcdfw==", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "assert": "^2.0.0", "big-integer": "^1.6.48", @@ -10294,6 +10796,8 @@ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "license": "Unlicense", + "optional": true, + "peer": true, "engines": { "node": ">=0.6" } @@ -10318,6 +10822,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -10329,6 +10835,8 @@ "integrity": "sha512-dmPlraWKJciFJxHcoubDahGnoIalG5e/BtV6HNDUs7wLXmtnLMHt6w4ed9R8MTL2zNrVPiIdI/HCtMMo0Tm7JQ==", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "bn.js": "^5.1.1", "brorand": "^1.0.5", @@ -10347,6 +10855,8 @@ "deprecated": "ripple-lib is deprecated. Please migrate to xrpl.js using this migration guide: https://xrpl.org/xrpljs2-migration-guide.html", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "@types/lodash": "^4.14.136", "@types/ws": "^7.2.0", @@ -10371,6 +10881,8 @@ "integrity": "sha512-1teosQLjYHLyOQrKUQfYyMjDR3MAq/Ga+MJuLUfpBMypl4LZB4bEoMcmG99/+WVTEiZOezJmH9iCSvm/MyxD+g==", "dev": true, "license": "ISC", + "optional": true, + "peer": true, "dependencies": { "bignumber.js": "^9.0.0", "lodash": "^4.17.15" @@ -10382,6 +10894,8 @@ "integrity": "sha512-iX5OFQ6yx9NgbHCwse51ohhKgLuLL7Z5cNOeZOPIlDUtAMrxlruHLzVZxbltdHE5mEDXN+75oFOwq6Gn0MZwsA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "*" } @@ -10392,6 +10906,8 @@ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=8.3.0" }, @@ -10426,6 +10942,8 @@ "integrity": "sha512-1IXGM/TfPT6nfYMIXkJdzn+L4JEsmb0FL1O2OBjaH03V3yuUDdKFulGLMFG6ErV+8pZ5HVC0limve01RyO+saA==", "dev": true, "license": "LGPL-3.0-only", + "optional": true, + "peer": true, "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", @@ -10450,6 +10968,8 @@ "integrity": "sha512-8svvI3hMyvN0kKCJMvTJP/x6Y/EoQbepff882wL+Sn5QsXb3etnamgrJq4isrBxSJj5L2AuXcI0+bgkoAXGUJw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -10474,6 +10994,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -10485,6 +11007,8 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -10538,6 +11062,8 @@ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -10729,6 +11255,8 @@ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -10888,6 +11416,8 @@ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -10899,6 +11429,8 @@ "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -10914,6 +11446,8 @@ "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", @@ -10929,6 +11463,8 @@ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 14" } @@ -11515,6 +12051,8 @@ "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -11668,6 +12206,8 @@ "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.0.0" } @@ -11801,7 +12341,9 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==", - "dev": true + "dev": true, + "optional": true, + "peer": true }, "node_modules/text-table": { "version": "0.2.0", @@ -11814,7 +12356,9 @@ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/tiny-secp256k1": { "version": "1.1.7", @@ -11823,6 +12367,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "bindings": "^1.3.0", "bn.js": "^4.11.8", @@ -11839,7 +12385,9 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/tinyglobby": { "version": "0.2.10", @@ -11921,7 +12469,9 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/ts-command-line-args": { "version": "2.5.1", @@ -12022,7 +12572,9 @@ "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/ts-node": { "version": "10.9.2", @@ -12102,18 +12654,6 @@ "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", "dev": true }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "dev": true - }, - "node_modules/tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", - "dev": true - }, "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -12239,7 +12779,9 @@ "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", "integrity": "sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/typescript": { "version": "5.7.3", @@ -12284,6 +12826,8 @@ } ], "license": "MIT", + "optional": true, + "peer": true, "bin": { "ua-parser-js": "script/cli.js" }, @@ -12310,6 +12854,8 @@ "integrity": "sha512-xS6+s8e0Xbx++5/0L+yyexukU7pz//Yg6IHg3BKhXotg1JcYtgxVcUctQ0HxLByiJzpAkNFawz1Nz5Xadzo82g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">=14.0.0" } @@ -12371,6 +12917,7 @@ } ], "license": "MIT", + "optional": true, "peer": true, "dependencies": { "escalade": "^3.2.0", @@ -12399,6 +12946,8 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/w3c-web-usb": "^1.0.6", "node-addon-api": "^8.0.0", @@ -12414,6 +12963,8 @@ "integrity": "sha512-lytcDEdxKjGJPTLEfW4mYMigRezMlyJY8W4wxJK8zE533Jlb8L8dRuObJFWg2P+AuOIxoCgKF+2Oq4d4Zd0OUA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": "^18 || ^20 || >= 21" } @@ -12425,6 +12976,7 @@ "dev": true, "hasInstallScript": true, "optional": true, + "peer": true, "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -12444,6 +12996,8 @@ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -12470,6 +13024,8 @@ "integrity": "sha512-6QZbU/rHO2ZQYpWFDALCDSRsXbAs1VOEmXAxtbtjLtKuMJ/FQ8YbhfxlaiKv5nklci0M6lZtlZyxo9Q+qNnyog==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "uint8array-tools": "^0.0.8" } @@ -12546,6 +13102,8 @@ "integrity": "sha512-SgoMSBo6EsJ5GFCGar2E/pR2lcR/xmUSuQ61iK6yDqzxmm42aPPxSqZfJz2z/UCR6pk03u77pU8TGV6lgMDdIQ==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "web3-core": "^4.7.1", "web3-errors": "^1.3.1", @@ -12576,6 +13134,8 @@ "integrity": "sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "web3-errors": "^1.3.1", "web3-eth-accounts": "^4.3.1", @@ -12600,6 +13160,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -12613,6 +13175,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -12626,6 +13190,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -12641,6 +13207,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -12655,6 +13223,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -12668,6 +13238,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -12686,6 +13258,8 @@ "integrity": "sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "web3-types": "^1.10.0" }, @@ -12700,6 +13274,8 @@ "integrity": "sha512-q9zOkzHnbLv44mwgLjLXuyqszHuUgZWsQayD2i/rus2uk0G7hMn11bE2Q3hOVnJS4ws4VCtUznlMxwKQ+38V2w==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "setimmediate": "^1.0.5", "web3-core": "^4.7.1", @@ -12724,6 +13300,8 @@ "integrity": "sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "abitype": "0.7.1", "web3-errors": "^1.3.1", @@ -12742,6 +13320,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -12755,6 +13335,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -12768,6 +13350,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -12783,6 +13367,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -12797,6 +13383,8 @@ "integrity": "sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "peerDependencies": { "typescript": ">=4.9.4", "zod": "^3 >=3.19.1" @@ -12813,6 +13401,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -12826,6 +13416,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -12844,6 +13436,8 @@ "integrity": "sha512-rTXf+H9OKze6lxi7WMMOF1/2cZvJb2AOnbNQxPhBDssKOllAMzLhg1FbZ4Mf3lWecWfN6luWgRhaeSqO1l+IBQ==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "@ethereumjs/rlp": "^4.0.1", "crc-32": "^1.2.2", @@ -12864,6 +13458,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -12877,6 +13473,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -12890,6 +13488,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -12905,6 +13505,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -12919,6 +13521,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -12932,6 +13536,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -12950,6 +13556,8 @@ "integrity": "sha512-3ETqs2pMNPEAc7BVY/C3voOhTUeJdkf2aM3X1v+edbngJLHAxbvxKpOqrcO0cjXzC4uc2Q8Zpf8n8zT5r0eLnA==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "@ethereumjs/rlp": "^5.0.2", "web3-core": "^4.7.1", @@ -12971,6 +13579,8 @@ "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", "dev": true, "license": "MPL-2.0", + "optional": true, + "peer": true, "bin": { "rlp": "bin/rlp.cjs" }, @@ -12984,6 +13594,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -12997,6 +13609,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -13010,6 +13624,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -13025,6 +13641,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -13039,6 +13657,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -13052,6 +13672,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -13070,6 +13692,8 @@ "integrity": "sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "@adraffy/ens-normalize": "^1.8.8", "web3-core": "^4.5.0", @@ -13092,6 +13716,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -13105,6 +13731,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -13118,6 +13746,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -13133,6 +13763,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -13147,6 +13779,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -13160,6 +13794,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -13178,6 +13814,8 @@ "integrity": "sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "web3-errors": "^1.1.3", "web3-types": "^1.3.0", @@ -13195,6 +13833,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -13208,6 +13848,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -13221,6 +13863,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -13236,6 +13880,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -13250,6 +13896,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -13263,6 +13911,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -13281,6 +13931,8 @@ "integrity": "sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "web3-core": "^4.6.0", "web3-eth": "^4.9.0", @@ -13300,6 +13952,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -13313,6 +13967,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -13326,6 +13982,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -13341,6 +13999,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -13355,6 +14015,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -13368,6 +14030,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -13386,6 +14050,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -13399,6 +14065,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -13412,6 +14080,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -13427,6 +14097,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -13441,6 +14113,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -13454,6 +14128,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -13472,6 +14148,8 @@ "integrity": "sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "web3-core": "^4.4.0", "web3-rpc-methods": "^1.3.0", @@ -13489,6 +14167,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -13502,6 +14182,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -13515,6 +14197,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -13530,6 +14214,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -13544,6 +14230,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -13557,6 +14245,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -13575,6 +14265,8 @@ "integrity": "sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "cross-fetch": "^4.0.0", "web3-errors": "^1.3.0", @@ -13592,6 +14284,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -13605,6 +14299,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -13618,6 +14314,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -13633,6 +14331,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -13647,6 +14347,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -13660,6 +14362,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -13679,6 +14383,7 @@ "dev": true, "license": "LGPL-3.0", "optional": true, + "peer": true, "dependencies": { "web3-errors": "^1.1.3", "web3-types": "^1.3.0", @@ -13696,6 +14401,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -13710,6 +14416,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -13724,6 +14431,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -13740,6 +14448,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -13755,6 +14464,7 @@ "dev": true, "license": "MIT", "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -13769,6 +14479,7 @@ "dev": true, "license": "LGPL-3.0", "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -13787,6 +14498,8 @@ "integrity": "sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "@types/ws": "8.5.3", "isomorphic-ws": "^5.0.0", @@ -13806,6 +14519,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -13819,6 +14534,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -13832,6 +14549,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -13847,6 +14566,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -13861,6 +14582,8 @@ "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -13871,6 +14594,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -13884,6 +14609,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -13902,6 +14629,8 @@ "integrity": "sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "web3-core": "^4.4.0", "web3-types": "^1.6.0", @@ -13918,6 +14647,8 @@ "integrity": "sha512-PXosCqHW0EADrYzgmueNHP3Y5jcSmSwH+Dkqvn7EYD0T2jcsdDAIHqk6szBiwIdhumM7gv9Raprsu/s/f7h1fw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "web3-errors": "^1.3.1", "web3-providers-http": "^4.2.0", @@ -13937,6 +14668,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -13950,6 +14683,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -13963,6 +14698,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -13978,6 +14715,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -13992,6 +14731,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -14005,6 +14746,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -14023,6 +14766,8 @@ "integrity": "sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "engines": { "node": ">=14", "npm": ">=6.12.0" @@ -14116,6 +14861,8 @@ "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "util": "^0.12.5", @@ -14134,6 +14881,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -14147,6 +14896,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -14160,6 +14911,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -14175,6 +14928,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -14189,6 +14944,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -14202,6 +14959,8 @@ "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "1.4.0" }, @@ -14215,6 +14974,8 @@ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "engines": { "node": ">= 16" }, @@ -14228,6 +14989,8 @@ "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "~1.4.0", "@noble/hashes": "~1.4.0", @@ -14243,6 +15006,8 @@ "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "~1.4.0", "@scure/base": "~1.1.6" @@ -14257,6 +15022,8 @@ "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/curves": "1.4.2", "@noble/hashes": "1.4.0", @@ -14270,6 +15037,8 @@ "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", "dev": true, "license": "LGPL-3.0", + "optional": true, + "peer": true, "dependencies": { "ethereum-cryptography": "^2.0.0", "eventemitter3": "^5.0.1", @@ -14287,7 +15056,9 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "optional": true, + "peer": true }, "node_modules/whatwg-url": { "version": "5.0.0", @@ -14295,6 +15066,8 @@ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -14317,6 +15090,8 @@ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", @@ -14349,6 +15124,8 @@ "integrity": "sha512-iFzrC/9ne740qFbNjTZ2FciSRJlHIXoxqk/Y5EnE08QOXu1WjJyCCswwDTYbohAOEnlCtLaAAQBhyaLRFh2hMA==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "bs58check": "^4.0.0" } @@ -14358,7 +15135,9 @@ "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.1.tgz", "integrity": "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "peer": true }, "node_modules/wif/node_modules/bs58": { "version": "6.0.0", @@ -14366,6 +15145,8 @@ "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "base-x": "^5.0.0" } @@ -14376,6 +15157,8 @@ "integrity": "sha512-FsGDOnFg9aVI9erdriULkd/JjEWONV/lQE5aYziB5PoBsXRind56lh8doIZIc9X4HoxT5x4bLjMWN1/NB8Zp5g==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "dependencies": { "@noble/hashes": "^1.2.0", "bs58": "^6.0.0" @@ -14610,6 +15393,7 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC", + "optional": true, "peer": true }, "node_modules/yargs": { @@ -14695,6 +15479,8 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "dev": true, + "optional": true, + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 1433359..a1092e3 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@nomicfoundation/hardhat-verify": "^2.0.13", "@solarity/hardhat-gobind": "^1.2.2", "@solarity/hardhat-markup": "^1.0.10", - "@solarity/hardhat-migrate": "^3.0.0", + "@solarity/hardhat-migrate": "^3.1.0", "@typechain/ethers-v6": "^0.5.1", "@typechain/hardhat": "^9.1.0", "@types/chai": "^4.3.20", From c9559caed041ed82575ec669fcde726f2d449415 Mon Sep 17 00:00:00 2001 From: Oleh Komendant Date: Wed, 3 Sep 2025 18:26:40 +0300 Subject: [PATCH 3/3] Fix comments --- contracts/SPVGateway.sol | 2 +- contracts/{ => mock}/interfaces/ICreateX.sol | 0 hardhat.config.ts | 5 +- package.json | 4 +- test/SPVContract.test.ts | 66 ++++++-------------- 5 files changed, 27 insertions(+), 50 deletions(-) rename contracts/{ => mock}/interfaces/ICreateX.sol (100%) diff --git a/contracts/SPVGateway.sol b/contracts/SPVGateway.sol index 659db8e..86b2f55 100644 --- a/contracts/SPVGateway.sol +++ b/contracts/SPVGateway.sol @@ -40,7 +40,7 @@ contract SPVGateway is ISPVGateway, Initializable { } } - function __SPVGateway_init() external initializer { + function __SPVGateway_init_genesis() external initializer { BlockHeader.HeaderData memory genesisBlockHeader_ = BlockHeader.HeaderData({ version: 1, prevBlockHash: bytes32(0), diff --git a/contracts/interfaces/ICreateX.sol b/contracts/mock/interfaces/ICreateX.sol similarity index 100% rename from contracts/interfaces/ICreateX.sol rename to contracts/mock/interfaces/ICreateX.sol diff --git a/hardhat.config.ts b/hardhat.config.ts index 49edff8..6b0d3cd 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -42,11 +42,14 @@ const config: HardhatUserConfig = { solidity: { version: "0.8.28", settings: { + metadata: { + bytecodeHash: "none", + }, optimizer: { enabled: true, runs: 1000000, }, - evmVersion: "paris", + evmVersion: "london", }, }, etherscan: { diff --git a/package.json b/package.json index a1092e3..d36efa0 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { - "name": "spv-gateway", + "name": "@distributedlab/spv-gateway", "version": "0.1.0", "license": "MIT", "author": "Distributed Lab", - "description": "", + "description": "ERC-8002: SPV gateway reference implementation", "keywords": [ "solidity", "smart-contracts", diff --git a/test/SPVContract.test.ts b/test/SPVContract.test.ts index 0d6ae96..22b3263 100644 --- a/test/SPVContract.test.ts +++ b/test/SPVContract.test.ts @@ -45,7 +45,7 @@ describe("SPVGateway", () => { it("should correctly init SPV contract from genesis state", async () => { const genesisData = getBlockHeaderData(genesisBlockDataFilePath, 0); - const tx = await spvGateway["__SPVGateway_init()"](); + const tx = await spvGateway.__SPVGateway_init_genesis(); await expect(tx).to.emit(spvGateway, "MainchainHeadUpdated").withArgs(genesisData.height, genesisData.blockHash); await expect(tx).to.emit(spvGateway, "BlockHeaderAdded").withArgs(genesisData.height, genesisData.blockHash); @@ -54,7 +54,7 @@ describe("SPVGateway", () => { it("should correctly init SPV contract from genesis state passed outside", async () => { const initBlockData = getBlockHeaderData(genesisBlockDataFilePath, 0); - const tx = await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"](initBlockData.rawHeader, 0, 0); + const tx = await spvGateway.__SPVGateway_init(initBlockData.rawHeader, 0, 0); await expect(tx) .to.emit(spvGateway, "MainchainHeadUpdated") @@ -69,7 +69,7 @@ describe("SPVGateway", () => { .parsedBlockHeader.chainwork; const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); - const tx = await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( + const tx = await spvGateway.__SPVGateway_init( initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork, @@ -92,21 +92,15 @@ describe("SPVGateway", () => { .parsedBlockHeader.chainwork; const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); - await expect( - spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( - initBlockData.rawHeader, - initBlockData.height, - lastEpochCumulativeWork, - ), - ) + await expect(spvGateway.__SPVGateway_init(initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork)) .to.be.revertedWithCustomError(spvGateway, "InvalidInitialBlockHeight") .withArgs(initBlockHeight); }); it("should get exception if try to call init function twice", async () => { - await spvGateway["__SPVGateway_init()"](); + await spvGateway.__SPVGateway_init_genesis(); - await expect(spvGateway["__SPVGateway_init()"]()).to.be.revertedWithCustomError( + await expect(spvGateway.__SPVGateway_init_genesis()).to.be.revertedWithCustomError( spvGateway, "InvalidInitialization", ); @@ -117,11 +111,7 @@ describe("SPVGateway", () => { const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); await expect( - spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( - initBlockData.rawHeader, - initBlockData.height, - lastEpochCumulativeWork, - ), + spvGateway.__SPVGateway_init(initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork), ).to.be.revertedWithCustomError(spvGateway, "InvalidInitialization"); }); }); @@ -134,11 +124,7 @@ describe("SPVGateway", () => { .parsedBlockHeader.chainwork; const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); - await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( - initBlockData.rawHeader, - initBlockData.height, - lastEpochCumulativeWork, - ); + await spvGateway.__SPVGateway_init(initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork); const batchSize = 100; const batchesCount = 22; @@ -178,7 +164,7 @@ describe("SPVGateway", () => { }); it("should get exception if the first block does not exist", async () => { - await spvGateway["__SPVGateway_init()"](); + await spvGateway.__SPVGateway_init_genesis(); const blockHeadersData = []; @@ -194,7 +180,7 @@ describe("SPVGateway", () => { }); it("should get exception if pass block headers in the invalid order", async () => { - await spvGateway["__SPVGateway_init()"](); + await spvGateway.__SPVGateway_init_genesis(); await expect( spvGateway.addBlockHeaderBatch([ @@ -205,7 +191,7 @@ describe("SPVGateway", () => { }); it("should get exception if pass zero array", async () => { - await spvGateway["__SPVGateway_init()"](); + await spvGateway.__SPVGateway_init_genesis(); await expect(spvGateway.addBlockHeaderBatch([])).to.revertedWithCustomError(spvGateway, "EmptyBlockHeaderArray"); }); @@ -214,7 +200,7 @@ describe("SPVGateway", () => { describe("#checkTxInclusion", () => { describe("#when there are from 1 to 6 transactions in a block", () => { beforeEach(async () => { - await spvGateway["__SPVGateway_init()"](); + await spvGateway.__SPVGateway_init_genesis(); const initBlockHeight = 1; const batchSize = 200; @@ -534,11 +520,7 @@ describe("SPVGateway", () => { .parsedBlockHeader.chainwork; const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); - await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( - initBlockData.rawHeader, - initBlockData.height, - lastEpochCumulativeWork, - ); + await spvGateway.__SPVGateway_init(initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork); const neededBlockData = getBlockHeaderData(newestBlocksDataFilePath, 802368); @@ -690,7 +672,7 @@ describe("SPVGateway", () => { describe("#addBlockHeader", () => { it("should correctly add new block header", async () => { - await spvGateway["__SPVGateway_init()"](); + await spvGateway.__SPVGateway_init_genesis(); const firstBlockData = getBlockHeaderData(firstBlocksDataFilePath, 1); const secondBlockData = getBlockHeaderData(firstBlocksDataFilePath, 2); @@ -755,11 +737,7 @@ describe("SPVGateway", () => { .parsedBlockHeader.chainwork; const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); - await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( - initBlockData.rawHeader, - initBlockData.height, - lastEpochCumulativeWork, - ); + await spvGateway.__SPVGateway_init(initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork); const batchSize = 200; const batchesCount = 10; @@ -847,7 +825,7 @@ describe("SPVGateway", () => { }); it("should get exception if pass block that already exists", async () => { - await spvGateway["__SPVGateway_init()"](); + await spvGateway.__SPVGateway_init_genesis(); const currentBlockData = getBlockHeaderData(firstBlocksDataFilePath, 1); @@ -859,7 +837,7 @@ describe("SPVGateway", () => { }); it("should get exception if prev block hash is not in the chain", async () => { - await spvGateway["__SPVGateway_init()"](); + await spvGateway.__SPVGateway_init_genesis(); const firstBlockData = getBlockHeaderData(firstBlocksDataFilePath, 1); const thirdBlockData = getBlockHeaderData(firstBlocksDataFilePath, 3); @@ -874,7 +852,7 @@ describe("SPVGateway", () => { describe("#getStorageMedianTime", () => { beforeEach("setup", async () => { - await spvGateway["__SPVGateway_init()"](); + await spvGateway.__SPVGateway_init_genesis(); }); it("should return correct median time for the first block", async () => { @@ -924,7 +902,7 @@ describe("SPVGateway", () => { describe("#getMemoryMedianTime", async () => { beforeEach("setup", async () => { - await spvGateway["__SPVGateway_init()"](); + await spvGateway.__SPVGateway_init_genesis(); }); it("should return correct median time", async () => { @@ -958,11 +936,7 @@ describe("SPVGateway", () => { .parsedBlockHeader.chainwork; const initBlockData = getBlockHeaderData(newestBlocksDataFilePath, initBlockHeight); - await spvGateway["__SPVGateway_init(bytes,uint64,uint256)"]( - initBlockData.rawHeader, - initBlockData.height, - lastEpochCumulativeWork, - ); + await spvGateway.__SPVGateway_init(initBlockData.rawHeader, initBlockData.height, lastEpochCumulativeWork); }); it("should get exception if pass invalid bits field", async () => {