From 12453b8db453d6f50ecf1181e6964bbbd179995b Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 1 Apr 2025 15:50:00 +0200 Subject: [PATCH 001/106] Add random sampling lib --- contracts/libraries/RandomSamplingLib.sol | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 contracts/libraries/RandomSamplingLib.sol diff --git a/contracts/libraries/RandomSamplingLib.sol b/contracts/libraries/RandomSamplingLib.sol new file mode 100644 index 00000000..dac8e059 --- /dev/null +++ b/contracts/libraries/RandomSamplingLib.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.20; + +library RandomSamplingLib { + struct Challenge { + uint256 knowledgeCollectionId; + uint256 chunkId; // TODO:Smaller data structure + uint256 activeProofPeriodStartBlock; + bool solved; + } +} From 17b3e0b132ff72ae2115f051f372c5bfbada96c9 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 1 Apr 2025 15:50:12 +0200 Subject: [PATCH 002/106] Add random sampling storage --- contracts/storage/RandomSamplingStorage.sol | 65 +++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 contracts/storage/RandomSamplingStorage.sol diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol new file mode 100644 index 00000000..bace9f02 --- /dev/null +++ b/contracts/storage/RandomSamplingStorage.sol @@ -0,0 +1,65 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.20; + +import {INamed} from "../interfaces/INamed.sol"; +import {IVersioned} from "../interfaces/IVersioned.sol"; +import {Guardian} from "../Guardian.sol"; +import {RandomSamplingLib} from "../libraries/RandomSamplingLib.sol"; + +contract RandomSamplingStorage is INamed, IVersioned, Guardian { + string private constant _NAME = "RandomSamplingStorage"; + string private constant _VERSION = "1.0.0"; + + uint8 public immutable CHUNK_BYTE_SIZE = 32; + uint256 public activeProofPeriodStartBlock; + // Chain Id => Proofing period duration in blocks + mapping(uint256 => uint8) public chainProofingPeriodDurationInBlocks; + // identityId => Challenge - used in proof to verify the challenge is within proofing period + mapping(uint72 => RandomSamplingLib.Challenge) public nodesChallenges; + + constructor(address hubAddress) Guardian(hubAddress) {} + + function name() external pure virtual override returns (string memory) { + return _NAME; + } + + function version() external pure virtual override returns (string memory) { + return _VERSION; + } + + function getActiveProofPeriodStartBlock() external view returns (uint256) { + return activeProofPeriodStartBlock; + } + + function getChainProofingPeriodDurationInBlocks(uint256 chainId) external view returns (uint8) { + return chainProofingPeriodDurationInBlocks[chainId]; + } + + function setChainProofingPeriodDurationInBlocks(uint8 chainId, uint8 durationInBlocks) external onlyHubOwner { + chainProofingPeriodDurationInBlocks[chainId] = durationInBlocks; + } + + function getNodeChallenge(uint72 identityId) external view returns (RandomSamplingLib.Challenge memory) { + return nodesChallenges[identityId]; + } + + function setNodeChallenge( + uint72 identityId, + RandomSamplingLib.Challenge memory challenge + ) external onlyRandomSamplingContract { + nodesChallenges[identityId] = challenge; + } + + function setActiveProofPeriodStartBlock(uint256 blockNumber) external onlyRandomSamplingContract { + activeProofPeriodStartBlock = blockNumber; + } + + modifier onlyRandomSamplingContract() { + require( + msg.sender == hub.getContractAddress("RandomSampling"), + "Only RandomSampling contract can call this function" + ); + _; + } +} From 6317af4cd605530aa83edd864795ea4588b16a2f Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 1 Apr 2025 15:50:32 +0200 Subject: [PATCH 003/106] Add random sampling logic contract --- contracts/RandomSampling.sol | 101 +++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 contracts/RandomSampling.sol diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol new file mode 100644 index 00000000..52de7fcd --- /dev/null +++ b/contracts/RandomSampling.sol @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.20; + +import {INamed} from "./interfaces/INamed.sol"; +import {IVersioned} from "./interfaces/IVersioned.sol"; +import {ContractStatus} from "./abstract/ContractStatus.sol"; +import {IInitializable} from "./interfaces/IInitializable.sol"; +import {RandomSamplingLib} from "./libraries/RandomSamplingLib.sol"; +import {IdentityStorage} from "./storage/IdentityStorage.sol"; +import {RandomSamplingStorage} from "./storage/RandomSamplingStorage.sol"; +import {KnowledgeCollectionStorage} from "./storage/KnowledgeCollectionStorage.sol"; + +contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { + string private constant _NAME = "RandomSampling"; + string private constant _VERSION = "1.0.0"; + + IdentityStorage public identityStorage; + RandomSamplingStorage public rss; + KnowledgeCollectionStorage public kcs; + + event ChallengeCreated(uint256 knowledgeCollectionId, uint256 chunkId, uint256 activeProofPeriodBlock); + + constructor(address hubAddress) ContractStatus(hubAddress) {} + + function initialize() external override { + identityStorage = IdentityStorage(hub.getContractAddress("IdentityStorage")); + rss = RandomSamplingStorage(hub.getContractAddress("RandomSamplingStorage")); + kcs = KnowledgeCollectionStorage(hub.getContractAddress("KnowledgeCollectionStorage")); + } + + function name() external pure virtual override returns (string memory) { + return _NAME; + } + + function version() external pure virtual override returns (string memory) { + return _VERSION; + } + + function createChallenge() external returns (RandomSamplingLib.Challenge memory) { + // identityId + uint72 identityId = identityStorage.getIdentityId(msg.sender); + + // update the active proof period start block if necessary + uint8 chainProofingPeriodDurationInBlocks = rss.getChainProofingPeriodDurationInBlocks(block.chainid); + if (block.number > rss.getActiveProofPeriodStartBlock() + chainProofingPeriodDurationInBlocks) { + rss.setActiveProofPeriodStartBlock(block.number - (block.number % chainProofingPeriodDurationInBlocks)); + } + + RandomSamplingLib.Challenge memory nodeChallenge = rss.getNodeChallenge(identityId); + + // If node has already participated in the challenge, return an empty challenge + if (nodeChallenge.solved == true) { + return RandomSamplingLib.Challenge(0, 0, 0, false); + } + + // If the challenge for this node exists but has not been solved yet, return the existing challenge + if ( + nodeChallenge.activeProofPeriodStartBlock == rss.getActiveProofPeriodStartBlock() && + nodeChallenge.knowledgeCollectionId != 0 + ) { + return nodeChallenge; + } + + // Generate a new challenge + RandomSamplingLib.Challenge memory challenge = _generateChallenge(identityId, msg.sender); + + // Store the new challenge in the storage contract + rss.setNodeChallenge(identityId, challenge); + + return challenge; + } + + function _generateChallenge( + uint72 identityId, + address originalSender + ) internal returns (RandomSamplingLib.Challenge memory) { + bytes32 myBlockHash = blockhash(block.number - (identityId % 256)); + + bytes32 pseudoRandomVariable = keccak256( + abi.encodePacked( + block.prevrandao, + myBlockHash, + originalSender, + block.timestamp, + tx.gasprice, + uint8(1) // sector = 1 by default + ) + ); + + uint256 knowledgeCollectionId = uint256(pseudoRandomVariable) % kcs.getLatestKnowledgeCollectionId(); + + uint88 chunksCount = kcs.getKnowledgeCollection(knowledgeCollectionId).byteSize / rss.CHUNK_BYTE_SIZE(); + uint256 chunkId = uint256(pseudoRandomVariable) % chunksCount; + uint256 activeProofPeriodStartBlock = rss.getActiveProofPeriodStartBlock(); + + emit ChallengeCreated(knowledgeCollectionId, chunkId, activeProofPeriodStartBlock); + + return RandomSamplingLib.Challenge(knowledgeCollectionId, chunkId, activeProofPeriodStartBlock, false); + } +} From 3e4361e4027622b2c303165d8d82318d1d0cde1d Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 2 Apr 2025 15:28:20 +0200 Subject: [PATCH 004/106] Add submitProof --- contracts/RandomSampling.sol | 149 +++++++++++++++++--- contracts/storage/RandomSamplingStorage.sol | 62 ++++++-- 2 files changed, 178 insertions(+), 33 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 52de7fcd..90d89b68 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -10,23 +10,46 @@ import {RandomSamplingLib} from "./libraries/RandomSamplingLib.sol"; import {IdentityStorage} from "./storage/IdentityStorage.sol"; import {RandomSamplingStorage} from "./storage/RandomSamplingStorage.sol"; import {KnowledgeCollectionStorage} from "./storage/KnowledgeCollectionStorage.sol"; +import {StakingStorage} from "./storage/StakingStorage.sol"; +import {ProfileStorage} from "./storage/ProfileStorage.sol"; +import {EpochStorage} from "./storage/EpochStorage.sol"; +import {Chronos} from "./storage/Chronos.sol"; +import {AskStorage} from "./storage/AskStorage.sol"; -contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { +contract RandomSampling is INamed, IVersioned, ContractStatus { string private constant _NAME = "RandomSampling"; string private constant _VERSION = "1.0.0"; + uint8 public avgBlockTimeInSeconds; IdentityStorage public identityStorage; RandomSamplingStorage public rss; KnowledgeCollectionStorage public kcs; + StakingStorage public stakingStorage; + ProfileStorage public profileStorage; + EpochStorage public epochStorage; + Chronos public chronos; + AskStorage public askStorage; event ChallengeCreated(uint256 knowledgeCollectionId, uint256 chunkId, uint256 activeProofPeriodBlock); + event ValidProofSubmitted(uint72 indexed identityId, uint256 indexed epoch, uint256 score); + event AvgBlockTimeUpdated(uint256 indexed chainId, uint8 avgBlockTimeInSeconds); + event ProofingPeriodDurationInBlocksUpdated(uint8 durationInBlocks); - constructor(address hubAddress) ContractStatus(hubAddress) {} + constructor(address hubAddress, uint8 _avgBlockTimeInSeconds) ContractStatus(hubAddress) { + avgBlockTimeInSeconds = _avgBlockTimeInSeconds; + } - function initialize() external override { + function initialize(uint8 _proofingPeriodDurationInBlocks) external { identityStorage = IdentityStorage(hub.getContractAddress("IdentityStorage")); rss = RandomSamplingStorage(hub.getContractAddress("RandomSamplingStorage")); kcs = KnowledgeCollectionStorage(hub.getContractAddress("KnowledgeCollectionStorage")); + stakingStorage = StakingStorage(hub.getContractAddress("StakingStorage")); + profileStorage = ProfileStorage(hub.getContractAddress("ProfileStorage")); + epochStorage = EpochStorage(hub.getContractAddress("EpochStorage")); + chronos = Chronos(hub.getContractAddress("Chronos")); + askStorage = AskStorage(hub.getContractAddress("AskStorage")); + + rss.setProofingPeriodDurationInBlocks(_proofingPeriodDurationInBlocks); } function name() external pure virtual override returns (string memory) { @@ -41,25 +64,18 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { // identityId uint72 identityId = identityStorage.getIdentityId(msg.sender); - // update the active proof period start block if necessary - uint8 chainProofingPeriodDurationInBlocks = rss.getChainProofingPeriodDurationInBlocks(block.chainid); - if (block.number > rss.getActiveProofPeriodStartBlock() + chainProofingPeriodDurationInBlocks) { - rss.setActiveProofPeriodStartBlock(block.number - (block.number % chainProofingPeriodDurationInBlocks)); - } - RandomSamplingLib.Challenge memory nodeChallenge = rss.getNodeChallenge(identityId); - // If node has already participated in the challenge, return an empty challenge - if (nodeChallenge.solved == true) { - return RandomSamplingLib.Challenge(0, 0, 0, false); - } + if (nodeChallenge.activeProofPeriodStartBlock == rss.getActiveProofPeriodStartBlock()) { + // If node has already solved the challenge for this period, return an empty challenge + if (nodeChallenge.solved == true) { + return RandomSamplingLib.Challenge(0, 0, 0, false); + } - // If the challenge for this node exists but has not been solved yet, return the existing challenge - if ( - nodeChallenge.activeProofPeriodStartBlock == rss.getActiveProofPeriodStartBlock() && - nodeChallenge.knowledgeCollectionId != 0 - ) { - return nodeChallenge; + // If the challenge for this node exists but has not been solved yet, return the existing challenge + if (nodeChallenge.knowledgeCollectionId != 0) { + return nodeChallenge; + } } // Generate a new challenge @@ -71,6 +87,82 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { return challenge; } + function computeMerkleRoot(bytes32 chunk, bytes32[] memory merkleProof) public pure returns (bytes32) { + bytes32 computedHash = keccak256(abi.encodePacked(chunk)); + + for (uint256 i = 0; i < merkleProof.length; i++) { + if (computedHash < merkleProof[i]) { + computedHash = keccak256(abi.encodePacked(computedHash, merkleProof[i])); + } else { + computedHash = keccak256(abi.encodePacked(merkleProof[i], computedHash)); + } + } + + return computedHash; + } + + function submitProof(bytes32 chunk, bytes32[] calldata merkleProof) public returns (bool) { + // Get node identityId + uint72 identityId = identityStorage.getIdentityId(msg.sender); + + // update the active proof period start block if necessary + uint256 currentActiveBlock = rss.getActiveProofPeriodStartBlock(); + + // Get node challenge + RandomSamplingLib.Challenge memory challenge = rss.getNodeChallenge(identityId); + + // verify that the challengeId matches the current challenge + if (challenge.activeProofPeriodStartBlock != currentActiveBlock) { + // This challenge is no longer active + return false; + } + + // Construct the merkle root from chunk and merkleProof + bytes32 computedMerkleRoot = computeMerkleRoot(chunk, merkleProof); + + // Get the expected merkle root for this challenge + bytes32 expectedMerkleRoot = kcs.getLatestMerkleRoot(challenge.knowledgeCollectionId); + + // Verify the submitted root matches + if (computedMerkleRoot == expectedMerkleRoot) { + // Mark as correct submission and add points to the node + challenge.solved = true; + rss.setNodeChallenge(identityId, challenge); + + uint256 epoch = chronos.getCurrentEpoch(); + rss.incrementEpochNodeValidProofsCount(epoch, identityId); + + uint256 SCALING_FACTOR = 1e18; + + // Node stake factor + uint256 nodeStake = stakingStorage.getNodeStake(identityId); + uint256 nodeStakeFactor = (2 * ((nodeStake * SCALING_FACTOR) / 2000000) ** 2) / SCALING_FACTOR; + + // Node ask factor + uint256 nodeAsk = profileStorage.getAsk(identityId); + (uint256 askLowerBound, uint256 askUpperBound) = askStorage.getAskBounds(); + uint256 nodeAskFactor = (nodeStake * + (((askUpperBound - nodeAsk) * SCALING_FACTOR) / (askUpperBound - askLowerBound)) ** 2) / + 2 / + SCALING_FACTOR; + + // Node publishing factor + uint256 nodePubFactor = epochStorage.getNodeCurrentEpochProducedKnowledgeValue(identityId); + uint256 nodePublishingFactor = (nodeStakeFactor * + (nodePubFactor * epochStorage.getCurrentEpochNodeMaxProducedKnowledgeValue())) / SCALING_FACTOR; + + // Node score + uint256 score = nodeStakeFactor + nodePublishingFactor - nodeAskFactor; + rss.addToEpochNodeTotalScore(epoch, identityId, score); + + emit ValidProofSubmitted(identityId, epoch, score); + + return true; + } + + return false; + } + function _generateChallenge( uint72 identityId, address originalSender @@ -79,7 +171,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { bytes32 pseudoRandomVariable = keccak256( abi.encodePacked( - block.prevrandao, + block.difficulty, myBlockHash, originalSender, block.timestamp, @@ -98,4 +190,21 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { return RandomSamplingLib.Challenge(knowledgeCollectionId, chunkId, activeProofPeriodStartBlock, false); } + + function getAllExpectedEpochProofsCount() internal view returns (uint256) { + uint256 allNodesCount = identityStorage.lastIdentityId(); + uint256 epochLengthInSeconds = chronos.epochLength(); + uint256 maxPossibleNodeProofsInEpoch = epochLengthInSeconds / + (rss.getProofingPeriodDurationInBlocks() * avgBlockTimeInSeconds); + return allNodesCount * maxPossibleNodeProofsInEpoch; + } + + function setAvgBlockTimeInSeconds(uint8 blockTimeInSeconds) external onlyHubOwner { + avgBlockTimeInSeconds = blockTimeInSeconds; + emit AvgBlockTimeUpdated(block.chainid, blockTimeInSeconds); + } + + // get rewards amount + + // claim rewards } diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index bace9f02..023aaf17 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -4,21 +4,27 @@ pragma solidity ^0.8.20; import {INamed} from "../interfaces/INamed.sol"; import {IVersioned} from "../interfaces/IVersioned.sol"; -import {Guardian} from "../Guardian.sol"; import {RandomSamplingLib} from "../libraries/RandomSamplingLib.sol"; +import {HubDependent} from "../abstract/HubDependent.sol"; -contract RandomSamplingStorage is INamed, IVersioned, Guardian { +contract RandomSamplingStorage is INamed, IVersioned, HubDependent { string private constant _NAME = "RandomSamplingStorage"; string private constant _VERSION = "1.0.0"; + uint8 public constant CHUNK_BYTE_SIZE = 32; + + uint8 public proofingPeriodDurationInBlocks; - uint8 public immutable CHUNK_BYTE_SIZE = 32; uint256 public activeProofPeriodStartBlock; - // Chain Id => Proofing period duration in blocks - mapping(uint256 => uint8) public chainProofingPeriodDurationInBlocks; // identityId => Challenge - used in proof to verify the challenge is within proofing period mapping(uint72 => RandomSamplingLib.Challenge) public nodesChallenges; + // epoch => identityId => successful proofs count + mapping(uint256 => mapping(uint72 => uint256)) public epochNodeValidProofsCount; + // epoch => identityId => score + mapping(uint256 => mapping(uint72 => uint256)) public epochNodeTotalScore; + // epoch => score + mapping(uint256 => uint256) public epochAllNodesTotalScore; - constructor(address hubAddress) Guardian(hubAddress) {} + constructor(address hubAddress) HubDependent(hubAddress) {} function name() external pure virtual override returns (string memory) { return _NAME; @@ -28,16 +34,25 @@ contract RandomSamplingStorage is INamed, IVersioned, Guardian { return _VERSION; } - function getActiveProofPeriodStartBlock() external view returns (uint256) { + function getActiveProofPeriodStartBlock() external returns (uint256) { + if (block.number > activeProofPeriodStartBlock + proofingPeriodDurationInBlocks) { + uint256 newActiveBlock = block.number - (block.number % proofingPeriodDurationInBlocks); + activeProofPeriodStartBlock = newActiveBlock; + } + return activeProofPeriodStartBlock; } - function getChainProofingPeriodDurationInBlocks(uint256 chainId) external view returns (uint8) { - return chainProofingPeriodDurationInBlocks[chainId]; + function getProofingPeriodDurationInBlocks() external view returns (uint8) { + return proofingPeriodDurationInBlocks; } - function setChainProofingPeriodDurationInBlocks(uint8 chainId, uint8 durationInBlocks) external onlyHubOwner { - chainProofingPeriodDurationInBlocks[chainId] = durationInBlocks; + function setProofingPeriodDurationInBlocks(uint8 durationInBlocks) external { + require( + msg.sender == hub.owner() || msg.sender == hub.getContractAddress("RandomSampling"), + "Only hub owner or RandomSampling contract can call this function" + ); + proofingPeriodDurationInBlocks = durationInBlocks; } function getNodeChallenge(uint72 identityId) external view returns (RandomSamplingLib.Challenge memory) { @@ -51,8 +66,29 @@ contract RandomSamplingStorage is INamed, IVersioned, Guardian { nodesChallenges[identityId] = challenge; } - function setActiveProofPeriodStartBlock(uint256 blockNumber) external onlyRandomSamplingContract { - activeProofPeriodStartBlock = blockNumber; + function incrementEpochNodeValidProofsCount(uint256 epoch, uint72 identityId) external onlyRandomSamplingContract { + epochNodeValidProofsCount[epoch][identityId] += 1; + } + + function getEpochNodeValidProofsCount(uint256 epoch, uint72 identityId) external view returns (uint256) { + return epochNodeValidProofsCount[epoch][identityId]; + } + + function getEpochNodeTotalScore(uint256 epoch, uint72 identityId) external view returns (uint256) { + return epochNodeTotalScore[epoch][identityId]; + } + + function addToEpochNodeTotalScore( + uint256 epoch, + uint72 identityId, + uint256 score + ) external onlyRandomSamplingContract { + epochNodeTotalScore[epoch][identityId] += score; + epochAllNodesTotalScore[epoch] += score; + } + + function getEpochAllNodesTotalScore(uint256 epoch) external view returns (uint256) { + return epochAllNodesTotalScore[epoch]; } modifier onlyRandomSamplingContract() { From 98321b3ea23b0a85edcda3447f9efb84424606e9 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 2 Apr 2025 16:53:26 +0200 Subject: [PATCH 005/106] Adapt node score data structures --- contracts/storage/RandomSamplingStorage.sol | 55 +++++++++++++++------ 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 023aaf17..cc769400 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -19,12 +19,18 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { mapping(uint72 => RandomSamplingLib.Challenge) public nodesChallenges; // epoch => identityId => successful proofs count mapping(uint256 => mapping(uint72 => uint256)) public epochNodeValidProofsCount; - // epoch => identityId => score - mapping(uint256 => mapping(uint72 => uint256)) public epochNodeTotalScore; - // epoch => score - mapping(uint256 => uint256) public epochAllNodesTotalScore; - - constructor(address hubAddress) HubDependent(hubAddress) {} + // identityId => epoch => proofPeriodStartBlock => score + mapping(uint72 => mapping(uint256 => mapping(uint256 => uint256))) public nodeEpochProofPeriodScore; + // epoch => proofPeriodStartBlock => score + mapping(uint256 => mapping(uint256 => uint256)) public allNodesEpochProofPeriodScore; + // // epoch => identityId => score + // mapping(uint256 => mapping(uint72 => uint256)) public epochNodeTotalScore; + // // epoch => score + // mapping(uint256 => uint256) public epochAllNodesTotalScore; + + constructor(address hubAddress, uint8 _proofingPeriodDurationInBlocks) HubDependent(hubAddress) { + proofingPeriodDurationInBlocks = _proofingPeriodDurationInBlocks; + } function name() external pure virtual override returns (string memory) { return _NAME; @@ -66,6 +72,21 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { nodesChallenges[identityId] = challenge; } + function getNodeEpochProofPeriodScore( + uint72 identityId, + uint256 epoch, + uint256 proofPeriodStartBlock + ) external view returns (uint256) { + return nodeEpochProofPeriodScore[identityId][epoch][proofPeriodStartBlock]; + } + + function getEpochAllNodesProofPeriodScore( + uint256 epoch, + uint256 proofPeriodStartBlock + ) external view returns (uint256) { + return allNodesEpochProofPeriodScore[epoch][proofPeriodStartBlock]; + } + function incrementEpochNodeValidProofsCount(uint256 epoch, uint72 identityId) external onlyRandomSamplingContract { epochNodeValidProofsCount[epoch][identityId] += 1; } @@ -74,23 +95,27 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { return epochNodeValidProofsCount[epoch][identityId]; } - function getEpochNodeTotalScore(uint256 epoch, uint72 identityId) external view returns (uint256) { - return epochNodeTotalScore[epoch][identityId]; - } + // function getEpochNodeTotalScore(uint256 epoch, uint72 identityId) external view returns (uint256) { + // return epochNodeTotalScore[epoch][identityId]; + // } - function addToEpochNodeTotalScore( + function addToNodeScore( uint256 epoch, + uint256 proofPeriodStartBlock, uint72 identityId, uint256 score ) external onlyRandomSamplingContract { - epochNodeTotalScore[epoch][identityId] += score; - epochAllNodesTotalScore[epoch] += score; - } + nodeEpochProofPeriodScore[identityId][epoch][proofPeriodStartBlock] += score; + allNodesEpochProofPeriodScore[epoch][proofPeriodStartBlock] += score; - function getEpochAllNodesTotalScore(uint256 epoch) external view returns (uint256) { - return epochAllNodesTotalScore[epoch]; + // epochNodeTotalScore[epoch][identityId] += score; + // epochAllNodesTotalScore[epoch] += score; } + // function getEpochAllNodesTotalScore(uint256 epoch) external view returns (uint256) { + // return epochAllNodesTotalScore[epoch]; + // } + modifier onlyRandomSamplingContract() { require( msg.sender == hub.getContractAddress("RandomSampling"), From 72d745f94ce4967677e55b657ee604120db01d4e Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 2 Apr 2025 17:22:57 +0200 Subject: [PATCH 006/106] review updates --- contracts/RandomSampling.sol | 80 +++++++++++++-------- contracts/storage/RandomSamplingStorage.sol | 21 ++---- 2 files changed, 56 insertions(+), 45 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 90d89b68..efb453f5 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -22,34 +22,38 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { uint8 public avgBlockTimeInSeconds; IdentityStorage public identityStorage; - RandomSamplingStorage public rss; - KnowledgeCollectionStorage public kcs; + RandomSamplingStorage public randomSamplingStorage; + KnowledgeCollectionStorage public knowledgeCollectionStorage; StakingStorage public stakingStorage; ProfileStorage public profileStorage; EpochStorage public epochStorage; Chronos public chronos; AskStorage public askStorage; - event ChallengeCreated(uint256 knowledgeCollectionId, uint256 chunkId, uint256 activeProofPeriodBlock); + event ChallengeCreated( + uint256 indexed identityId, + uint256 indexed epoch, + uint256 knowledgeCollectionId, + uint256 chunkId, + uint256 indexed activeProofPeriodBlock + ); event ValidProofSubmitted(uint72 indexed identityId, uint256 indexed epoch, uint256 score); - event AvgBlockTimeUpdated(uint256 indexed chainId, uint8 avgBlockTimeInSeconds); + event AvgBlockTimeUpdated(uint8 avgBlockTimeInSeconds); event ProofingPeriodDurationInBlocksUpdated(uint8 durationInBlocks); constructor(address hubAddress, uint8 _avgBlockTimeInSeconds) ContractStatus(hubAddress) { avgBlockTimeInSeconds = _avgBlockTimeInSeconds; } - function initialize(uint8 _proofingPeriodDurationInBlocks) external { + function initialize() external { identityStorage = IdentityStorage(hub.getContractAddress("IdentityStorage")); - rss = RandomSamplingStorage(hub.getContractAddress("RandomSamplingStorage")); - kcs = KnowledgeCollectionStorage(hub.getContractAddress("KnowledgeCollectionStorage")); + randomSamplingStorage = RandomSamplingStorage(hub.getContractAddress("RandomSamplingStorage")); + knowledgeCollectionStorage = KnowledgeCollectionStorage(hub.getContractAddress("KnowledgeCollectionStorage")); stakingStorage = StakingStorage(hub.getContractAddress("StakingStorage")); profileStorage = ProfileStorage(hub.getContractAddress("ProfileStorage")); epochStorage = EpochStorage(hub.getContractAddress("EpochStorage")); chronos = Chronos(hub.getContractAddress("Chronos")); askStorage = AskStorage(hub.getContractAddress("AskStorage")); - - rss.setProofingPeriodDurationInBlocks(_proofingPeriodDurationInBlocks); } function name() external pure virtual override returns (string memory) { @@ -64,9 +68,11 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { // identityId uint72 identityId = identityStorage.getIdentityId(msg.sender); - RandomSamplingLib.Challenge memory nodeChallenge = rss.getNodeChallenge(identityId); + RandomSamplingLib.Challenge memory nodeChallenge = randomSamplingStorage.getNodeChallenge(identityId); - if (nodeChallenge.activeProofPeriodStartBlock == rss.getActiveProofPeriodStartBlock()) { + if ( + nodeChallenge.activeProofPeriodStartBlock == randomSamplingStorage.updateAndGetActiveProofPeriodStartBlock() + ) { // If node has already solved the challenge for this period, return an empty challenge if (nodeChallenge.solved == true) { return RandomSamplingLib.Challenge(0, 0, 0, false); @@ -82,7 +88,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { RandomSamplingLib.Challenge memory challenge = _generateChallenge(identityId, msg.sender); // Store the new challenge in the storage contract - rss.setNodeChallenge(identityId, challenge); + randomSamplingStorage.setNodeChallenge(identityId, challenge); return challenge; } @@ -90,12 +96,16 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { function computeMerkleRoot(bytes32 chunk, bytes32[] memory merkleProof) public pure returns (bytes32) { bytes32 computedHash = keccak256(abi.encodePacked(chunk)); - for (uint256 i = 0; i < merkleProof.length; i++) { + for (uint256 i = 0; i < merkleProof.length; ) { if (computedHash < merkleProof[i]) { computedHash = keccak256(abi.encodePacked(computedHash, merkleProof[i])); } else { computedHash = keccak256(abi.encodePacked(merkleProof[i], computedHash)); } + + unchecked { + i++; + } } return computedHash; @@ -105,14 +115,13 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { // Get node identityId uint72 identityId = identityStorage.getIdentityId(msg.sender); - // update the active proof period start block if necessary - uint256 currentActiveBlock = rss.getActiveProofPeriodStartBlock(); - // Get node challenge - RandomSamplingLib.Challenge memory challenge = rss.getNodeChallenge(identityId); + RandomSamplingLib.Challenge memory challenge = randomSamplingStorage.getNodeChallenge(identityId); + + uint256 activeProofPeriodStartBlock = randomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); // verify that the challengeId matches the current challenge - if (challenge.activeProofPeriodStartBlock != currentActiveBlock) { + if (challenge.activeProofPeriodStartBlock != activeProofPeriodStartBlock) { // This challenge is no longer active return false; } @@ -121,16 +130,16 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { bytes32 computedMerkleRoot = computeMerkleRoot(chunk, merkleProof); // Get the expected merkle root for this challenge - bytes32 expectedMerkleRoot = kcs.getLatestMerkleRoot(challenge.knowledgeCollectionId); + bytes32 expectedMerkleRoot = knowledgeCollectionStorage.getLatestMerkleRoot(challenge.knowledgeCollectionId); // Verify the submitted root matches if (computedMerkleRoot == expectedMerkleRoot) { // Mark as correct submission and add points to the node challenge.solved = true; - rss.setNodeChallenge(identityId, challenge); + randomSamplingStorage.setNodeChallenge(identityId, challenge); uint256 epoch = chronos.getCurrentEpoch(); - rss.incrementEpochNodeValidProofsCount(epoch, identityId); + randomSamplingStorage.incrementEpochNodeValidProofsCount(epoch, identityId); uint256 SCALING_FACTOR = 1e18; @@ -153,7 +162,12 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { // Node score uint256 score = nodeStakeFactor + nodePublishingFactor - nodeAskFactor; - rss.addToEpochNodeTotalScore(epoch, identityId, score); + randomSamplingStorage.addToNodeScore(epoch, activeProofPeriodStartBlock, identityId, score); + + // uint256 delegatorCount = ; + + // iterate through all delegators + for (uint8 i = 0; i < stakingStorage.getDelegatorCount(identityId); i++) {} emit ValidProofSubmitted(identityId, epoch, score); @@ -180,13 +194,21 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { ) ); - uint256 knowledgeCollectionId = uint256(pseudoRandomVariable) % kcs.getLatestKnowledgeCollectionId(); + uint256 knowledgeCollectionId = uint256(pseudoRandomVariable) % + knowledgeCollectionStorage.getLatestKnowledgeCollectionId(); - uint88 chunksCount = kcs.getKnowledgeCollection(knowledgeCollectionId).byteSize / rss.CHUNK_BYTE_SIZE(); + uint88 chunksCount = knowledgeCollectionStorage.getKnowledgeCollection(knowledgeCollectionId).byteSize / + randomSamplingStorage.CHUNK_BYTE_SIZE(); uint256 chunkId = uint256(pseudoRandomVariable) % chunksCount; - uint256 activeProofPeriodStartBlock = rss.getActiveProofPeriodStartBlock(); - - emit ChallengeCreated(knowledgeCollectionId, chunkId, activeProofPeriodStartBlock); + uint256 activeProofPeriodStartBlock = randomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + + emit ChallengeCreated( + identityId, + chronos.getCurrentEpoch(), + knowledgeCollectionId, + chunkId, + activeProofPeriodStartBlock + ); return RandomSamplingLib.Challenge(knowledgeCollectionId, chunkId, activeProofPeriodStartBlock, false); } @@ -195,13 +217,13 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { uint256 allNodesCount = identityStorage.lastIdentityId(); uint256 epochLengthInSeconds = chronos.epochLength(); uint256 maxPossibleNodeProofsInEpoch = epochLengthInSeconds / - (rss.getProofingPeriodDurationInBlocks() * avgBlockTimeInSeconds); + (randomSamplingStorage.getProofingPeriodDurationInBlocks() * avgBlockTimeInSeconds); return allNodesCount * maxPossibleNodeProofsInEpoch; } function setAvgBlockTimeInSeconds(uint8 blockTimeInSeconds) external onlyHubOwner { avgBlockTimeInSeconds = blockTimeInSeconds; - emit AvgBlockTimeUpdated(block.chainid, blockTimeInSeconds); + emit AvgBlockTimeUpdated(blockTimeInSeconds); } // get rewards amount diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index cc769400..5681e766 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -14,7 +14,7 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { uint8 public proofingPeriodDurationInBlocks; - uint256 public activeProofPeriodStartBlock; + uint256 private activeProofPeriodStartBlock; // identityId => Challenge - used in proof to verify the challenge is within proofing period mapping(uint72 => RandomSamplingLib.Challenge) public nodesChallenges; // epoch => identityId => successful proofs count @@ -40,7 +40,7 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { return _VERSION; } - function getActiveProofPeriodStartBlock() external returns (uint256) { + function updateAndGetActiveProofPeriodStartBlock() external returns (uint256) { if (block.number > activeProofPeriodStartBlock + proofingPeriodDurationInBlocks) { uint256 newActiveBlock = block.number - (block.number % proofingPeriodDurationInBlocks); activeProofPeriodStartBlock = newActiveBlock; @@ -65,10 +65,7 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { return nodesChallenges[identityId]; } - function setNodeChallenge( - uint72 identityId, - RandomSamplingLib.Challenge memory challenge - ) external onlyRandomSamplingContract { + function setNodeChallenge(uint72 identityId, RandomSamplingLib.Challenge memory challenge) external onlyContracts { nodesChallenges[identityId] = challenge; } @@ -87,7 +84,7 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { return allNodesEpochProofPeriodScore[epoch][proofPeriodStartBlock]; } - function incrementEpochNodeValidProofsCount(uint256 epoch, uint72 identityId) external onlyRandomSamplingContract { + function incrementEpochNodeValidProofsCount(uint256 epoch, uint72 identityId) external onlyContracts { epochNodeValidProofsCount[epoch][identityId] += 1; } @@ -104,7 +101,7 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { uint256 proofPeriodStartBlock, uint72 identityId, uint256 score - ) external onlyRandomSamplingContract { + ) external onlyContracts { nodeEpochProofPeriodScore[identityId][epoch][proofPeriodStartBlock] += score; allNodesEpochProofPeriodScore[epoch][proofPeriodStartBlock] += score; @@ -115,12 +112,4 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { // function getEpochAllNodesTotalScore(uint256 epoch) external view returns (uint256) { // return epochAllNodesTotalScore[epoch]; // } - - modifier onlyRandomSamplingContract() { - require( - msg.sender == hub.getContractAddress("RandomSampling"), - "Only RandomSampling contract can call this function" - ); - _; - } } From 18be0daa6913314d98894a399b1a133b23b874e9 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 2 Apr 2025 17:25:40 +0200 Subject: [PATCH 007/106] review updates --- contracts/storage/RandomSamplingStorage.sol | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 5681e766..cb4568c7 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -53,11 +53,8 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { return proofingPeriodDurationInBlocks; } - function setProofingPeriodDurationInBlocks(uint8 durationInBlocks) external { - require( - msg.sender == hub.owner() || msg.sender == hub.getContractAddress("RandomSampling"), - "Only hub owner or RandomSampling contract can call this function" - ); + function setProofingPeriodDurationInBlocks(uint8 durationInBlocks) external onlyContracts { + require(durationInBlocks > 0, "Duration in blocks must be greater than 0"); proofingPeriodDurationInBlocks = durationInBlocks; } From 26a3a40187def7c9339d4ec5f320fba2f4e2c148 Mon Sep 17 00:00:00 2001 From: Mihajlo Pavlovic Date: Thu, 3 Apr 2025 10:17:19 +0200 Subject: [PATCH 008/106] Fix migration and add structure for isNodeDelegator lookup --- contracts/storage/DelegatorsInfo.sol | 92 ++++++++++++++++++++++++++++ contracts/storage/StakingStorage.sol | 14 +++++ 2 files changed, 106 insertions(+) create mode 100644 contracts/storage/DelegatorsInfo.sol diff --git a/contracts/storage/DelegatorsInfo.sol b/contracts/storage/DelegatorsInfo.sol new file mode 100644 index 00000000..0a873cd1 --- /dev/null +++ b/contracts/storage/DelegatorsInfo.sol @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.20; + +import {ShardingTableStorage} from "./ShardingTableStorage.sol"; +import {StakingStorage} from "./StakingStorage.sol"; +import {IInitializable} from "../interfaces/IInitializable.sol"; +import {INamed} from "../interfaces/INamed.sol"; +import {IVersioned} from "../interfaces/IVersioned.sol"; +import {ContractStatus} from "../abstract/ContractStatus.sol"; + +contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { + string private constant _NAME = "DelegatorsInfo"; + string private constant _VERSION = "1.0.0"; + + ShardingTableStorage public shardingTableStorage; + + // IdentityId => Delegators + mapping(uint72 => address[]) public nodeDelegators; + // IdentityId => Delegator => Index + mapping(uint72 => mapping(address => uint256)) public nodeDelegatorIndex; + // IdentityId => Delegator => IsDelegator + mapping(uint72 => mapping(address => bool)) public isDelegatorMap; + + // solhint-disable-next-line no-empty-blocks + constructor(address hubAddress) ContractStatus(hubAddress) {} + + function initialize() public onlyHub { + shardingTableStorage = ShardingTableStorage(hub.getContractAddress("ShardingTableStorage")); + } + + function name() external pure virtual override returns (string memory) { + return _NAME; + } + + function version() external pure virtual override returns (string memory) { + return _VERSION; + } + + function addDelegator(uint72 identityId, address delegator) external onlyContracts { + nodeDelegatorIndex[identityId][delegator] = nodeDelegators[identityId].length; + nodeDelegators[identityId].push(delegator); + } + + function removeDelegator(uint72 identityId, address delegator) external onlyContracts { + uint256 index = nodeDelegatorIndex[identityId][delegator]; + + if (nodeDelegators[identityId].length == index - 1) { + nodeDelegators[identityId].pop(); + } else { + nodeDelegators[identityId][index] = nodeDelegators[identityId][nodeDelegators[identityId].length - 1]; + nodeDelegators[identityId].pop(); + } + } + + function getDelegators(uint72 identityId) external view returns (address[] memory) { + return nodeDelegators[identityId]; + } + + function getDelegatorIndex(uint72 identityId, address delegator) external view returns (uint256) { + return nodeDelegatorIndex[identityId][delegator]; + } + + function isDelegator(uint72 identityId, address delegator) external view returns (bool) { + return isDelegatorMap[identityId][delegator]; + } + + function migrate(address[] memory newAddress) external onlyContracts { + StakingStorage ss = StakingStorage(hub.getContractAddress("StakingStorage")); + for (uint256 i = 0; i < newAddress.length; ) { + bytes32 addressHash = keccak256(abi.encodePacked(newAddress[i])); + uint72[] memory delegatorNodes = ss.getDelegatorNodes(addressHash); + for (uint256 j = 0; j < delegatorNodes.length; ) { + if (isDelegatorMap[delegatorNodes[j]][newAddress[i]]) { + unchecked { + j++; + } + continue; + } + nodeDelegatorIndex[delegatorNodes[j]][newAddress[i]] = nodeDelegators[delegatorNodes[j]].length; + nodeDelegators[delegatorNodes[j]].push(newAddress[i]); + isDelegatorMap[delegatorNodes[j]][newAddress[i]] = true; + unchecked { + j++; + } + } + unchecked { + i++; + } + } + } +} diff --git a/contracts/storage/StakingStorage.sol b/contracts/storage/StakingStorage.sol index 5845cabc..98c47576 100644 --- a/contracts/storage/StakingStorage.sol +++ b/contracts/storage/StakingStorage.sol @@ -61,6 +61,10 @@ contract StakingStorage is INamed, IVersioned, Guardian { mapping(uint72 => StakingLib.StakeWithdrawalRequest) public operatorFeeWithdrawals; mapping(bytes32 => EnumerableSetLib.Uint256Set) private delegatorNodes; + mapping(uint72 => EnumerableSetLib.Bytes32Set) private nodeDelegators; + + // Add new mapping for direct address lookup + mapping(uint72 => mapping(address => bool)) public isDelegatorMap; // solhint-disable-next-line no-empty-blocks constructor(address hubAddress) Guardian(hubAddress) {} @@ -661,14 +665,24 @@ contract StakingStorage is INamed, IVersioned, Guardian { // Internal Operations // ----------------------------------------------------------------------------------------------------------------- + function isDelegator(uint72 identityId, address delegator) external view returns (bool) { + return isDelegatorMap[identityId][delegator]; + } + function _updateDelegatorActivity(uint72 identityId, bytes32 delegatorKey, bool wasActive, bool isActive) internal { + address delegator = address(uint160(uint256(delegatorKey))); + if (!wasActive && isActive) { delegatorNodes[delegatorKey].add(identityId); + nodeDelegators[identityId].add(delegatorKey); + isDelegatorMap[identityId][delegator] = true; nodes[identityId].delegatorCount += 1; emit DelegatorCountUpdated(identityId, nodes[identityId].delegatorCount); } else if (wasActive && !isActive) { delegatorNodes[delegatorKey].remove(identityId); + nodeDelegators[identityId].remove(delegatorKey); + isDelegatorMap[identityId][delegator] = false; nodes[identityId].delegatorCount -= 1; emit DelegatorCountUpdated(identityId, nodes[identityId].delegatorCount); From ec212e7c9faf64bdf2a48c76098ab25cc931fd07 Mon Sep 17 00:00:00 2001 From: Mihajlo Pavlovic Date: Thu, 3 Apr 2025 10:29:51 +0200 Subject: [PATCH 009/106] Fix removeDelegator function --- contracts/storage/DelegatorsInfo.sol | 29 ++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/contracts/storage/DelegatorsInfo.sol b/contracts/storage/DelegatorsInfo.sol index 0a873cd1..07c8abad 100644 --- a/contracts/storage/DelegatorsInfo.sol +++ b/contracts/storage/DelegatorsInfo.sol @@ -13,8 +13,6 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { string private constant _NAME = "DelegatorsInfo"; string private constant _VERSION = "1.0.0"; - ShardingTableStorage public shardingTableStorage; - // IdentityId => Delegators mapping(uint72 => address[]) public nodeDelegators; // IdentityId => Delegator => Index @@ -25,9 +23,7 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { // solhint-disable-next-line no-empty-blocks constructor(address hubAddress) ContractStatus(hubAddress) {} - function initialize() public onlyHub { - shardingTableStorage = ShardingTableStorage(hub.getContractAddress("ShardingTableStorage")); - } + function initialize() public onlyHub {} function name() external pure virtual override returns (string memory) { return _NAME; @@ -40,17 +36,26 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { function addDelegator(uint72 identityId, address delegator) external onlyContracts { nodeDelegatorIndex[identityId][delegator] = nodeDelegators[identityId].length; nodeDelegators[identityId].push(delegator); + isDelegatorMap[identityId][delegator] = true; } function removeDelegator(uint72 identityId, address delegator) external onlyContracts { - uint256 index = nodeDelegatorIndex[identityId][delegator]; + if (!isDelegatorMap[identityId][delegator]) { + revert("Delegator not found"); + } - if (nodeDelegators[identityId].length == index - 1) { - nodeDelegators[identityId].pop(); - } else { - nodeDelegators[identityId][index] = nodeDelegators[identityId][nodeDelegators[identityId].length - 1]; - nodeDelegators[identityId].pop(); + uint256 indexToRemove = nodeDelegatorIndex[identityId][delegator]; + uint256 lastIndex = nodeDelegators[identityId].length - 1; + + if (indexToRemove != lastIndex) { + address lastDelegator = nodeDelegators[identityId][lastIndex]; + nodeDelegators[identityId][indexToRemove] = lastDelegator; + nodeDelegatorIndex[identityId][lastDelegator] = indexToRemove; } + + nodeDelegators[identityId].pop(); + delete nodeDelegatorIndex[identityId][delegator]; + isDelegatorMap[identityId][delegator] = false; } function getDelegators(uint72 identityId) external view returns (address[] memory) { @@ -61,7 +66,7 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { return nodeDelegatorIndex[identityId][delegator]; } - function isDelegator(uint72 identityId, address delegator) external view returns (bool) { + function isNodeDelegator(uint72 identityId, address delegator) external view returns (bool) { return isDelegatorMap[identityId][delegator]; } From 99bd4555bf310bab9c221b66d9fba29b91e74007 Mon Sep 17 00:00:00 2001 From: Mihajlo Pavlovic Date: Thu, 3 Apr 2025 11:45:19 +0200 Subject: [PATCH 010/106] Optimize removeDelegator --- contracts/storage/DelegatorsInfo.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/storage/DelegatorsInfo.sol b/contracts/storage/DelegatorsInfo.sol index 07c8abad..93ad104d 100644 --- a/contracts/storage/DelegatorsInfo.sol +++ b/contracts/storage/DelegatorsInfo.sol @@ -55,7 +55,7 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { nodeDelegators[identityId].pop(); delete nodeDelegatorIndex[identityId][delegator]; - isDelegatorMap[identityId][delegator] = false; + delete isDelegatorMap[identityId][delegator]; } function getDelegators(uint72 identityId) external view returns (address[] memory) { From c7596e1df7db7f293bfc65d6281ecfa477e5f965 Mon Sep 17 00:00:00 2001 From: Mihajlo Pavlovic Date: Thu, 3 Apr 2025 11:47:54 +0200 Subject: [PATCH 011/106] Fix renaming newAddresses --- contracts/storage/DelegatorsInfo.sol | 15 +- contracts/storage/StakingStorage.sol | 691 --------------------------- 2 files changed, 7 insertions(+), 699 deletions(-) diff --git a/contracts/storage/DelegatorsInfo.sol b/contracts/storage/DelegatorsInfo.sol index 93ad104d..29077ec2 100644 --- a/contracts/storage/DelegatorsInfo.sol +++ b/contracts/storage/DelegatorsInfo.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.20; -import {ShardingTableStorage} from "./ShardingTableStorage.sol"; import {StakingStorage} from "./StakingStorage.sol"; import {IInitializable} from "../interfaces/IInitializable.sol"; import {INamed} from "../interfaces/INamed.sol"; @@ -70,21 +69,21 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { return isDelegatorMap[identityId][delegator]; } - function migrate(address[] memory newAddress) external onlyContracts { + function migrate(address[] memory newAddresses) external onlyContracts { StakingStorage ss = StakingStorage(hub.getContractAddress("StakingStorage")); - for (uint256 i = 0; i < newAddress.length; ) { - bytes32 addressHash = keccak256(abi.encodePacked(newAddress[i])); + for (uint256 i = 0; i < newAddresses.length; ) { + bytes32 addressHash = keccak256(abi.encodePacked(newAddresses[i])); uint72[] memory delegatorNodes = ss.getDelegatorNodes(addressHash); for (uint256 j = 0; j < delegatorNodes.length; ) { - if (isDelegatorMap[delegatorNodes[j]][newAddress[i]]) { + if (isDelegatorMap[delegatorNodes[j]][newAddresses[i]]) { unchecked { j++; } continue; } - nodeDelegatorIndex[delegatorNodes[j]][newAddress[i]] = nodeDelegators[delegatorNodes[j]].length; - nodeDelegators[delegatorNodes[j]].push(newAddress[i]); - isDelegatorMap[delegatorNodes[j]][newAddress[i]] = true; + nodeDelegatorIndex[delegatorNodes[j]][newAddresses[i]] = nodeDelegators[delegatorNodes[j]].length; + nodeDelegators[delegatorNodes[j]].push(newAddresses[i]); + isDelegatorMap[delegatorNodes[j]][newAddresses[i]] = true; unchecked { j++; } diff --git a/contracts/storage/StakingStorage.sol b/contracts/storage/StakingStorage.sol index 98c47576..e69de29b 100644 --- a/contracts/storage/StakingStorage.sol +++ b/contracts/storage/StakingStorage.sol @@ -1,691 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 - -pragma solidity ^0.8.20; - -import {Guardian} from "../Guardian.sol"; -import {StakingLib} from "../libraries/StakingLib.sol"; -import {INamed} from "../interfaces/INamed.sol"; -import {IVersioned} from "../interfaces/IVersioned.sol"; -import {EnumerableSetLib} from "solady/src/utils/EnumerableSetLib.sol"; - -contract StakingStorage is INamed, IVersioned, Guardian { - using EnumerableSetLib for EnumerableSetLib.Uint256Set; - - string private constant _NAME = "StakingStorage"; - string private constant _VERSION = "1.0.0"; - - event TotalStakeUpdated(uint96 totalStake); - event NodeStakeUpdated(uint72 indexed identityId, uint96 stake); - event NodeRewardIndexUpdated(uint72 indexed identityId, uint256 rewardIndex); - event NodeCumulativeEarnedRewardsUpdated(uint72 indexed identityId, uint96 cumulativeEarnedRewards); - event NodeCumulativePaidOutRewardsUpdated(uint72 indexed identityId, uint96 cumulativePaidOutRewards); - event DelegatorCountUpdated(uint72 indexed identityId, uint256 delegatorsCount); - event OperatorFeeBalanceUpdated(uint72 indexed identityId, uint96 feeBalance); - event OperatorFeeCumulativeEarnedRewardsUpdated(uint72 indexed identityId, uint96 cumulativeFeeEarnedRewards); - event OperatorFeeCumulativePaidOutRewardsUpdated(uint72 indexed identityId, uint96 cumulativeFeePaidOutRewards); - event DelegatorBaseStakeUpdated(uint72 indexed identityId, bytes32 indexed delegatorKey, uint96 stakeBase); - event DelegatorIndexedStakeUpdated(uint72 indexed identityId, bytes32 indexed delegatorKey, uint96 stakeIndexed); - event DelegatorLastRewardIndexUpdated(uint72 indexed identityId, bytes32 indexed delegatorKey, uint256 lastIndex); - event DelegatorCumulativeEarnedRewardsUpdated( - uint72 indexed identityId, - bytes32 indexed delegatorKey, - uint96 cumulativeEarnedRewards - ); - event DelegatorCumulativePaidOutRewardsUpdated( - uint72 indexed identityId, - bytes32 indexed delegatorKey, - uint96 cumulativePaidOutRewards - ); - event DelegatorWithdrawalRequestCreated( - uint72 indexed identityId, - bytes32 indexed delegatorKey, - uint96 amount, - uint96 indexedOutAmount, - uint256 timestamp - ); - event DelegatorWithdrawalRequestDeleted(uint72 indexed identityId, bytes32 indexed delegatorKey); - event OperatorFeeWithdrawalRequestCreated( - uint72 indexed identityId, - uint96 amount, - uint96 indexedOutAmount, - uint256 timestamp - ); - event OperatorFeeWithdrawalRequestDeleted(uint72 indexed identityId); - event StakedTokensTransferred(address indexed receiver, uint96 amount); - - uint96 private _totalStake; - - mapping(uint72 => StakingLib.NodeData) public nodes; - mapping(uint72 => mapping(bytes32 => StakingLib.DelegatorData)) public delegators; - mapping(uint72 => mapping(bytes32 => StakingLib.StakeWithdrawalRequest)) public withdrawals; - mapping(uint72 => StakingLib.StakeWithdrawalRequest) public operatorFeeWithdrawals; - - mapping(bytes32 => EnumerableSetLib.Uint256Set) private delegatorNodes; - mapping(uint72 => EnumerableSetLib.Bytes32Set) private nodeDelegators; - - // Add new mapping for direct address lookup - mapping(uint72 => mapping(address => bool)) public isDelegatorMap; - - // solhint-disable-next-line no-empty-blocks - constructor(address hubAddress) Guardian(hubAddress) {} - - function name() external pure virtual override returns (string memory) { - return _NAME; - } - - function version() external pure virtual override returns (string memory) { - return _VERSION; - } - - // ----------------------------------------------------------------------------------------------------------------- - // Global Stake Operations - // ----------------------------------------------------------------------------------------------------------------- - - function getTotalStake() external view returns (uint96) { - return _totalStake; - } - - function setTotalStake(uint96 newTotalStake) external onlyContracts { - _totalStake = newTotalStake; - - emit TotalStakeUpdated(newTotalStake); - } - - function increaseTotalStake(uint96 addedStake) external onlyContracts { - _totalStake += addedStake; - - emit TotalStakeUpdated(_totalStake); - } - - function decreaseTotalStake(uint96 removedStake) external onlyContracts { - _totalStake -= removedStake; - - emit TotalStakeUpdated(_totalStake); - } - - // ----------------------------------------------------------------------------------------------------------------- - // Nodes Staking Data Operations - // ----------------------------------------------------------------------------------------------------------------- - - function setNodeStakeInfo(uint72 identityId, uint96 stake, uint256 rewardIndex) external onlyContracts { - StakingLib.NodeData storage node = nodes[identityId]; - - node.stake = stake; - node.rewardIndex = rewardIndex; - - emit NodeStakeUpdated(identityId, stake); - emit NodeRewardIndexUpdated(identityId, rewardIndex); - } - - function getNodeData( - uint72 identityId - ) external view returns (uint96, uint256, uint96, uint96, uint96, uint96, uint96, uint256) { - StakingLib.NodeData memory node = nodes[identityId]; - return ( - node.stake, - node.rewardIndex, - node.cumulativeEarnedRewards, - node.cumulativePaidOutRewards, - node.operatorFeeBalance, - node.operatorFeeCumulativeEarnedRewards, - node.operatorFeeCumulativePaidOutRewards, - node.delegatorCount - ); - } - - function getNodeStakeInfo(uint72 identityId) external view returns (uint96, uint256) { - StakingLib.NodeData memory node = nodes[identityId]; - return (node.stake, node.rewardIndex); - } - - function getNodeRewardsInfo(uint72 identityId) external view returns (uint96, uint96, uint96) { - StakingLib.NodeData memory node = nodes[identityId]; - return ( - node.stake, - node.cumulativeEarnedRewards - node.cumulativePaidOutRewards, - node.cumulativePaidOutRewards - ); - } - - function getNodeOperatorFeesInfo(uint72 identityId) external view returns (uint96, uint96, uint96) { - StakingLib.NodeData memory node = nodes[identityId]; - return ( - node.operatorFeeBalance, - node.operatorFeeCumulativeEarnedRewards - node.operatorFeeCumulativePaidOutRewards, - node.operatorFeeCumulativePaidOutRewards - ); - } - - function setNodeStake(uint72 identityId, uint96 newNodeStake) external onlyContracts { - nodes[identityId].stake = newNodeStake; - - emit NodeStakeUpdated(identityId, newNodeStake); - } - - function increaseNodeStake(uint72 identityId, uint96 addedNodeStake) external onlyContracts { - nodes[identityId].stake += addedNodeStake; - - emit NodeStakeUpdated(identityId, nodes[identityId].stake); - } - - function decreaseNodeStake(uint72 identityId, uint96 removedNodeStake) external onlyContracts { - nodes[identityId].stake -= removedNodeStake; - - emit NodeStakeUpdated(identityId, nodes[identityId].stake); - } - - function getNodeStake(uint72 identityId) external view returns (uint96) { - return nodes[identityId].stake; - } - - function setNodeRewardIndex(uint72 identityId, uint256 newIndex) external onlyContracts { - nodes[identityId].rewardIndex = newIndex; - - emit NodeRewardIndexUpdated(identityId, newIndex); - } - - function increaseNodeRewardIndex(uint72 identityId, uint256 addedIndex) external onlyContracts { - nodes[identityId].rewardIndex += addedIndex; - - emit NodeRewardIndexUpdated(identityId, nodes[identityId].rewardIndex); - } - - function getNodeRewardIndex(uint72 identityId) external view returns (uint256) { - return nodes[identityId].rewardIndex; - } - - function getNodeCumulativeEarnedRewards(uint72 identityId) external view returns (uint96) { - return nodes[identityId].cumulativeEarnedRewards; - } - - function setNodeCumulativeEarnedRewards(uint72 identityId, uint96 newEarnedRewards) external onlyContracts { - nodes[identityId].cumulativeEarnedRewards = newEarnedRewards; - - emit NodeCumulativeEarnedRewardsUpdated(identityId, newEarnedRewards); - } - - function addNodeCumulativeEarnedRewards(uint72 identityId, uint96 addedRewards) external onlyContracts { - nodes[identityId].cumulativeEarnedRewards += addedRewards; - - emit NodeCumulativeEarnedRewardsUpdated(identityId, nodes[identityId].cumulativeEarnedRewards); - } - - function getNodeCumulativePaidOutRewards(uint72 identityId) external view returns (uint96) { - return nodes[identityId].cumulativePaidOutRewards; - } - - function setNodeCumulativePaidOutRewards(uint72 identityId, uint96 newPaidOutRewards) external onlyContracts { - nodes[identityId].cumulativePaidOutRewards = newPaidOutRewards; - - emit NodeCumulativePaidOutRewardsUpdated(identityId, newPaidOutRewards); - } - - function addNodeCumulativePaidOutRewards(uint72 identityId, uint96 addedRewards) external onlyContracts { - nodes[identityId].cumulativePaidOutRewards += addedRewards; - - emit NodeCumulativePaidOutRewardsUpdated(identityId, nodes[identityId].cumulativePaidOutRewards); - } - - function setOperatorFeeBalance(uint72 identityId, uint96 newBalance) external onlyContracts { - nodes[identityId].operatorFeeBalance = newBalance; - - emit OperatorFeeBalanceUpdated(identityId, newBalance); - } - - function increaseOperatorFeeBalance(uint72 identityId, uint96 addedFee) external onlyContracts { - nodes[identityId].operatorFeeBalance += addedFee; - - emit OperatorFeeBalanceUpdated(identityId, nodes[identityId].operatorFeeBalance); - } - - function decreaseOperatorFeeBalance(uint72 identityId, uint96 removedFee) external onlyContracts { - nodes[identityId].operatorFeeBalance -= removedFee; - - emit OperatorFeeBalanceUpdated(identityId, nodes[identityId].operatorFeeBalance); - } - - function getOperatorFeeBalance(uint72 identityId) external view returns (uint96) { - return nodes[identityId].operatorFeeBalance; - } - - function setOperatorFeeCumulativeEarnedRewards(uint72 identityId, uint96 amount) external onlyContracts { - nodes[identityId].operatorFeeCumulativeEarnedRewards = amount; - - emit OperatorFeeCumulativeEarnedRewardsUpdated(identityId, amount); - } - - function addOperatorFeeCumulativeEarnedRewards(uint72 identityId, uint96 amount) external onlyContracts { - nodes[identityId].operatorFeeCumulativeEarnedRewards += amount; - - emit OperatorFeeCumulativeEarnedRewardsUpdated( - identityId, - nodes[identityId].operatorFeeCumulativeEarnedRewards - ); - } - - function getOperatorFeeCumulativeEarnedRewards(uint72 identityId) external view returns (uint96) { - return nodes[identityId].operatorFeeCumulativeEarnedRewards; - } - - function setOperatorFeeCumulativePaidOutRewards(uint72 identityId, uint96 amount) external onlyContracts { - nodes[identityId].operatorFeeCumulativePaidOutRewards = amount; - - emit OperatorFeeCumulativePaidOutRewardsUpdated(identityId, amount); - } - - function addOperatorFeeCumulativePaidOutRewards(uint72 identityId, uint96 amount) external onlyContracts { - nodes[identityId].operatorFeeCumulativePaidOutRewards += amount; - - emit OperatorFeeCumulativePaidOutRewardsUpdated( - identityId, - nodes[identityId].operatorFeeCumulativePaidOutRewards - ); - } - - function getOperatorFeeCumulativePaidOutRewards(uint72 identityId) external view returns (uint96) { - return nodes[identityId].operatorFeeCumulativePaidOutRewards; - } - - function setDelegatorCount(uint72 identityId, uint256 delegatorCount) external onlyContracts { - nodes[identityId].delegatorCount = delegatorCount; - - emit DelegatorCountUpdated(identityId, delegatorCount); - } - - function getDelegatorCount(uint72 identityId) external view returns (uint256) { - return nodes[identityId].delegatorCount; - } - - // ----------------------------------------------------------------------------------------------------------------- - // Delegators Stake Data Operations - // ----------------------------------------------------------------------------------------------------------------- - - function setDelegatorStakeInfo( - uint72 identityId, - bytes32 delegatorKey, - uint96 stakeBase, - uint96 stakeRewardIndexed - ) external onlyContracts { - StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; - - bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - delegator.stakeBase = stakeBase; - delegator.stakeRewardIndexed = stakeRewardIndexed; - - bool isActive = (stakeBase > 0 || stakeRewardIndexed > 0); - - _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); - - emit DelegatorBaseStakeUpdated(identityId, delegatorKey, stakeBase); - emit DelegatorIndexedStakeUpdated(identityId, delegatorKey, stakeRewardIndexed); - } - - function getDelegatorData( - uint72 identityId, - bytes32 delegatorKey - ) external view returns (uint96, uint96, uint256, uint96, uint96) { - StakingLib.DelegatorData memory delegator = delegators[identityId][delegatorKey]; - return ( - delegator.stakeBase, - delegator.stakeRewardIndexed, - delegator.lastRewardIndex, - delegator.cumulativeEarnedRewards, - delegator.cumulativePaidOutRewards - ); - } - - function getDelegatorStakeInfo( - uint72 identityId, - bytes32 delegatorKey - ) external view returns (uint96, uint96, uint256) { - StakingLib.DelegatorData memory delegator = delegators[identityId][delegatorKey]; - return (delegator.stakeBase, delegator.stakeRewardIndexed, delegator.lastRewardIndex); - } - - function getDelegatorRewardsInfo(uint72 identityId, bytes32 delegatorKey) external view returns (uint96, uint96) { - StakingLib.DelegatorData memory delegator = delegators[identityId][delegatorKey]; - return (delegator.cumulativeEarnedRewards, delegator.cumulativePaidOutRewards); - } - - function setDelegatorStakeBase(uint72 identityId, bytes32 delegatorKey, uint96 stakeBase) external onlyContracts { - StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; - - bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - delegator.stakeBase = stakeBase; - - bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); - - emit DelegatorBaseStakeUpdated(identityId, delegatorKey, stakeBase); - } - - function increaseDelegatorStakeBase( - uint72 identityId, - bytes32 delegatorKey, - uint96 addedStake - ) external onlyContracts { - StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; - - bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - delegator.stakeBase += addedStake; - - bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); - - emit DelegatorBaseStakeUpdated(identityId, delegatorKey, delegator.stakeBase); - } - - function decreaseDelegatorStakeBase( - uint72 identityId, - bytes32 delegatorKey, - uint96 removedStake - ) external onlyContracts { - StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; - - bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - delegator.stakeBase -= removedStake; - - bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); - - emit DelegatorBaseStakeUpdated(identityId, delegatorKey, delegator.stakeBase); - } - - function getDelegatorStakeBase(uint72 identityId, bytes32 delegatorKey) external view returns (uint96) { - return delegators[identityId][delegatorKey].stakeBase; - } - - function setDelegatorStakeRewardIndexed( - uint72 identityId, - bytes32 delegatorKey, - uint96 stakeRewardIndexed - ) external onlyContracts { - StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; - - bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - delegator.stakeRewardIndexed = stakeRewardIndexed; - - bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); - - emit DelegatorIndexedStakeUpdated(identityId, delegatorKey, stakeRewardIndexed); - } - - function increaseDelegatorStakeRewardIndexed( - uint72 identityId, - bytes32 delegatorKey, - uint96 addedStakeReward - ) external onlyContracts { - StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; - - bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - delegator.stakeRewardIndexed += addedStakeReward; - - bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); - - emit DelegatorIndexedStakeUpdated(identityId, delegatorKey, delegator.stakeRewardIndexed); - } - - function decreaseDelegatorStakeRewardIndexed( - uint72 identityId, - bytes32 delegatorKey, - uint96 removedStakeReward - ) external onlyContracts { - StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; - - bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - delegator.stakeRewardIndexed -= removedStakeReward; - - bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); - - _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); - - emit DelegatorIndexedStakeUpdated(identityId, delegatorKey, delegator.stakeRewardIndexed); - } - - function getDelegatorStakeRewardIndexed(uint72 identityId, bytes32 delegatorKey) external view returns (uint96) { - return delegators[identityId][delegatorKey].stakeRewardIndexed; - } - - function getDelegatorTotalStake(uint72 identityId, bytes32 delegatorKey) external view returns (uint96) { - StakingLib.DelegatorData memory delegator = delegators[identityId][delegatorKey]; - return delegator.stakeBase + delegator.stakeRewardIndexed; - } - - function setDelegatorLastRewardIndex( - uint72 identityId, - bytes32 delegatorKey, - uint256 lastRewardIndex - ) external onlyContracts { - delegators[identityId][delegatorKey].lastRewardIndex = lastRewardIndex; - - emit DelegatorLastRewardIndexUpdated(identityId, delegatorKey, lastRewardIndex); - } - - function getDelegatorLastRewardIndex(uint72 identityId, bytes32 delegatorKey) external view returns (uint256) { - return delegators[identityId][delegatorKey].lastRewardIndex; - } - - function getDelegatorNodes(bytes32 delegatorKey) external view returns (uint72[] memory) { - EnumerableSetLib.Uint256Set storage nodesSet = delegatorNodes[delegatorKey]; - - uint256 length = nodesSet.length(); - uint72[] memory nodeList = new uint72[](length); - for (uint256 i = 0; i < length; i++) { - nodeList[i] = uint72(nodesSet.at(i)); - } - return nodeList; - } - - function getDelegatorNodesCount(bytes32 delegatorKey) external view returns (uint256) { - return delegatorNodes[delegatorKey].length(); - } - - function getDelegatorNodesIn( - bytes32 delegatorKey, - uint256 start, - uint256 end - ) external view returns (uint72[] memory) { - EnumerableSetLib.Uint256Set storage nodesSet = delegatorNodes[delegatorKey]; - - uint72[] memory nodeList = new uint72[](end - start); - for (uint256 i = start; i < end; i++) { - nodeList[i - start] = uint72(nodesSet.at(i)); - } - return nodeList; - } - - function isDelegatingToNode(uint72 identityId, bytes32 delegatorKey) external view returns (bool) { - return delegatorNodes[delegatorKey].contains(identityId); - } - - function addDelegatorCumulativeEarnedRewards( - uint72 identityId, - bytes32 delegatorKey, - uint96 amount - ) external onlyContracts { - delegators[identityId][delegatorKey].cumulativeEarnedRewards += amount; - - emit DelegatorCumulativeEarnedRewardsUpdated( - identityId, - delegatorKey, - delegators[identityId][delegatorKey].cumulativeEarnedRewards - ); - } - - function getDelegatorCumulativeEarnedRewards( - uint72 identityId, - bytes32 delegatorKey - ) external view returns (uint96) { - return delegators[identityId][delegatorKey].cumulativeEarnedRewards; - } - - function addDelegatorCumulativePaidOutRewards( - uint72 identityId, - bytes32 delegatorKey, - uint96 amount - ) external onlyContracts { - delegators[identityId][delegatorKey].cumulativePaidOutRewards += amount; - - emit DelegatorCumulativePaidOutRewardsUpdated( - identityId, - delegatorKey, - delegators[identityId][delegatorKey].cumulativePaidOutRewards - ); - } - - function getDelegatorCumulativePaidOutRewards( - uint72 identityId, - bytes32 delegatorKey - ) external view returns (uint96) { - return delegators[identityId][delegatorKey].cumulativePaidOutRewards; - } - - // ----------------------------------------------------------------------------------------------------------------- - // Delegators Stake Withdrawals Operations - // ----------------------------------------------------------------------------------------------------------------- - - function createDelegatorWithdrawalRequest( - uint72 identityId, - bytes32 delegatorKey, - uint96 amount, - uint96 indexedOutAmount, - uint256 timestamp - ) external onlyContracts { - withdrawals[identityId][delegatorKey] = StakingLib.StakeWithdrawalRequest(amount, indexedOutAmount, timestamp); - - emit DelegatorWithdrawalRequestCreated(identityId, delegatorKey, amount, indexedOutAmount, timestamp); - } - - function getDelegatorWithdrawalRequest( - uint72 identityId, - bytes32 delegatorKey - ) external view returns (uint96, uint96, uint256) { - StakingLib.StakeWithdrawalRequest memory wr = withdrawals[identityId][delegatorKey]; - return (wr.amount, wr.indexedOutAmount, wr.timestamp); - } - - function deleteDelegatorWithdrawalRequest(uint72 identityId, bytes32 delegatorKey) external onlyContracts { - delete withdrawals[identityId][delegatorKey]; - - emit DelegatorWithdrawalRequestDeleted(identityId, delegatorKey); - } - - function getDelegatorWithdrawalRequestAmount( - uint72 identityId, - bytes32 delegatorKey - ) external view returns (uint96) { - return withdrawals[identityId][delegatorKey].amount; - } - - function getDelegatorWithdrawalRequestIndexedOutAmount( - uint72 identityId, - bytes32 delegatorKey - ) external view returns (uint96) { - return withdrawals[identityId][delegatorKey].indexedOutAmount; - } - - function getDelegatorWithdrawalRequestTimestamp( - uint72 identityId, - bytes32 delegatorKey - ) external view returns (uint256) { - return withdrawals[identityId][delegatorKey].timestamp; - } - - function delegatorWithdrawalRequestExists(uint72 identityId, bytes32 delegatorKey) external view returns (bool) { - return withdrawals[identityId][delegatorKey].amount != 0; - } - - // ----------------------------------------------------------------------------------------------------------------- - // Node Operators Stake Withdrawals Operations - // ----------------------------------------------------------------------------------------------------------------- - - function createOperatorFeeWithdrawalRequest( - uint72 identityId, - uint96 amount, - uint96 indexedOutAmount, - uint256 timestamp - ) external onlyContracts { - operatorFeeWithdrawals[identityId] = StakingLib.StakeWithdrawalRequest(amount, indexedOutAmount, timestamp); - - emit OperatorFeeWithdrawalRequestCreated(identityId, amount, indexedOutAmount, timestamp); - } - - function deleteOperatorFeeWithdrawalRequest(uint72 identityId) external onlyContracts { - delete operatorFeeWithdrawals[identityId]; - - emit OperatorFeeWithdrawalRequestDeleted(identityId); - } - - function getOperatorFeeWithdrawalRequest(uint72 identityId) external view returns (uint96, uint96, uint256) { - StakingLib.StakeWithdrawalRequest memory wr = operatorFeeWithdrawals[identityId]; - return (wr.amount, wr.indexedOutAmount, wr.timestamp); - } - - function getOperatorFeeWithdrawalRequestAmount(uint72 identityId) external view returns (uint96) { - return operatorFeeWithdrawals[identityId].amount; - } - - function getOperatorFeeWithdrawalRequestIndexedOutAmount(uint72 identityId) external view returns (uint96) { - return operatorFeeWithdrawals[identityId].indexedOutAmount; - } - - function getOperatorFeeWithdrawalRequestTimestamp(uint72 identityId) external view returns (uint256) { - return operatorFeeWithdrawals[identityId].timestamp; - } - - function operatorFeeWithdrawalRequestExists(uint72 identityId) external view returns (bool) { - return operatorFeeWithdrawals[identityId].amount != 0; - } - - // ----------------------------------------------------------------------------------------------------------------- - // Token Related Operations - // ----------------------------------------------------------------------------------------------------------------- - - function transferStake(address receiver, uint96 stakeAmount) external onlyContracts { - tokenContract.transfer(receiver, stakeAmount); - - emit StakedTokensTransferred(receiver, stakeAmount); - } - - // ----------------------------------------------------------------------------------------------------------------- - // Internal Operations - // ----------------------------------------------------------------------------------------------------------------- - - function isDelegator(uint72 identityId, address delegator) external view returns (bool) { - return isDelegatorMap[identityId][delegator]; - } - - function _updateDelegatorActivity(uint72 identityId, bytes32 delegatorKey, bool wasActive, bool isActive) internal { - address delegator = address(uint160(uint256(delegatorKey))); - - if (!wasActive && isActive) { - delegatorNodes[delegatorKey].add(identityId); - nodeDelegators[identityId].add(delegatorKey); - isDelegatorMap[identityId][delegator] = true; - nodes[identityId].delegatorCount += 1; - - emit DelegatorCountUpdated(identityId, nodes[identityId].delegatorCount); - } else if (wasActive && !isActive) { - delegatorNodes[delegatorKey].remove(identityId); - nodeDelegators[identityId].remove(delegatorKey); - isDelegatorMap[identityId][delegator] = false; - nodes[identityId].delegatorCount -= 1; - - emit DelegatorCountUpdated(identityId, nodes[identityId].delegatorCount); - } - } -} From 59252c7f6378eb99f0cf35fe069a984d56a75e4d Mon Sep 17 00:00:00 2001 From: Mihajlo Pavlovic Date: Thu, 3 Apr 2025 12:00:08 +0200 Subject: [PATCH 012/106] Remove unneded code --- contracts/storage/StakingStorage.sol | 677 +++++++++++++++++++++++++++ 1 file changed, 677 insertions(+) diff --git a/contracts/storage/StakingStorage.sol b/contracts/storage/StakingStorage.sol index e69de29b..5845cabc 100644 --- a/contracts/storage/StakingStorage.sol +++ b/contracts/storage/StakingStorage.sol @@ -0,0 +1,677 @@ +// SPDX-License-Identifier: Apache-2.0 + +pragma solidity ^0.8.20; + +import {Guardian} from "../Guardian.sol"; +import {StakingLib} from "../libraries/StakingLib.sol"; +import {INamed} from "../interfaces/INamed.sol"; +import {IVersioned} from "../interfaces/IVersioned.sol"; +import {EnumerableSetLib} from "solady/src/utils/EnumerableSetLib.sol"; + +contract StakingStorage is INamed, IVersioned, Guardian { + using EnumerableSetLib for EnumerableSetLib.Uint256Set; + + string private constant _NAME = "StakingStorage"; + string private constant _VERSION = "1.0.0"; + + event TotalStakeUpdated(uint96 totalStake); + event NodeStakeUpdated(uint72 indexed identityId, uint96 stake); + event NodeRewardIndexUpdated(uint72 indexed identityId, uint256 rewardIndex); + event NodeCumulativeEarnedRewardsUpdated(uint72 indexed identityId, uint96 cumulativeEarnedRewards); + event NodeCumulativePaidOutRewardsUpdated(uint72 indexed identityId, uint96 cumulativePaidOutRewards); + event DelegatorCountUpdated(uint72 indexed identityId, uint256 delegatorsCount); + event OperatorFeeBalanceUpdated(uint72 indexed identityId, uint96 feeBalance); + event OperatorFeeCumulativeEarnedRewardsUpdated(uint72 indexed identityId, uint96 cumulativeFeeEarnedRewards); + event OperatorFeeCumulativePaidOutRewardsUpdated(uint72 indexed identityId, uint96 cumulativeFeePaidOutRewards); + event DelegatorBaseStakeUpdated(uint72 indexed identityId, bytes32 indexed delegatorKey, uint96 stakeBase); + event DelegatorIndexedStakeUpdated(uint72 indexed identityId, bytes32 indexed delegatorKey, uint96 stakeIndexed); + event DelegatorLastRewardIndexUpdated(uint72 indexed identityId, bytes32 indexed delegatorKey, uint256 lastIndex); + event DelegatorCumulativeEarnedRewardsUpdated( + uint72 indexed identityId, + bytes32 indexed delegatorKey, + uint96 cumulativeEarnedRewards + ); + event DelegatorCumulativePaidOutRewardsUpdated( + uint72 indexed identityId, + bytes32 indexed delegatorKey, + uint96 cumulativePaidOutRewards + ); + event DelegatorWithdrawalRequestCreated( + uint72 indexed identityId, + bytes32 indexed delegatorKey, + uint96 amount, + uint96 indexedOutAmount, + uint256 timestamp + ); + event DelegatorWithdrawalRequestDeleted(uint72 indexed identityId, bytes32 indexed delegatorKey); + event OperatorFeeWithdrawalRequestCreated( + uint72 indexed identityId, + uint96 amount, + uint96 indexedOutAmount, + uint256 timestamp + ); + event OperatorFeeWithdrawalRequestDeleted(uint72 indexed identityId); + event StakedTokensTransferred(address indexed receiver, uint96 amount); + + uint96 private _totalStake; + + mapping(uint72 => StakingLib.NodeData) public nodes; + mapping(uint72 => mapping(bytes32 => StakingLib.DelegatorData)) public delegators; + mapping(uint72 => mapping(bytes32 => StakingLib.StakeWithdrawalRequest)) public withdrawals; + mapping(uint72 => StakingLib.StakeWithdrawalRequest) public operatorFeeWithdrawals; + + mapping(bytes32 => EnumerableSetLib.Uint256Set) private delegatorNodes; + + // solhint-disable-next-line no-empty-blocks + constructor(address hubAddress) Guardian(hubAddress) {} + + function name() external pure virtual override returns (string memory) { + return _NAME; + } + + function version() external pure virtual override returns (string memory) { + return _VERSION; + } + + // ----------------------------------------------------------------------------------------------------------------- + // Global Stake Operations + // ----------------------------------------------------------------------------------------------------------------- + + function getTotalStake() external view returns (uint96) { + return _totalStake; + } + + function setTotalStake(uint96 newTotalStake) external onlyContracts { + _totalStake = newTotalStake; + + emit TotalStakeUpdated(newTotalStake); + } + + function increaseTotalStake(uint96 addedStake) external onlyContracts { + _totalStake += addedStake; + + emit TotalStakeUpdated(_totalStake); + } + + function decreaseTotalStake(uint96 removedStake) external onlyContracts { + _totalStake -= removedStake; + + emit TotalStakeUpdated(_totalStake); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Nodes Staking Data Operations + // ----------------------------------------------------------------------------------------------------------------- + + function setNodeStakeInfo(uint72 identityId, uint96 stake, uint256 rewardIndex) external onlyContracts { + StakingLib.NodeData storage node = nodes[identityId]; + + node.stake = stake; + node.rewardIndex = rewardIndex; + + emit NodeStakeUpdated(identityId, stake); + emit NodeRewardIndexUpdated(identityId, rewardIndex); + } + + function getNodeData( + uint72 identityId + ) external view returns (uint96, uint256, uint96, uint96, uint96, uint96, uint96, uint256) { + StakingLib.NodeData memory node = nodes[identityId]; + return ( + node.stake, + node.rewardIndex, + node.cumulativeEarnedRewards, + node.cumulativePaidOutRewards, + node.operatorFeeBalance, + node.operatorFeeCumulativeEarnedRewards, + node.operatorFeeCumulativePaidOutRewards, + node.delegatorCount + ); + } + + function getNodeStakeInfo(uint72 identityId) external view returns (uint96, uint256) { + StakingLib.NodeData memory node = nodes[identityId]; + return (node.stake, node.rewardIndex); + } + + function getNodeRewardsInfo(uint72 identityId) external view returns (uint96, uint96, uint96) { + StakingLib.NodeData memory node = nodes[identityId]; + return ( + node.stake, + node.cumulativeEarnedRewards - node.cumulativePaidOutRewards, + node.cumulativePaidOutRewards + ); + } + + function getNodeOperatorFeesInfo(uint72 identityId) external view returns (uint96, uint96, uint96) { + StakingLib.NodeData memory node = nodes[identityId]; + return ( + node.operatorFeeBalance, + node.operatorFeeCumulativeEarnedRewards - node.operatorFeeCumulativePaidOutRewards, + node.operatorFeeCumulativePaidOutRewards + ); + } + + function setNodeStake(uint72 identityId, uint96 newNodeStake) external onlyContracts { + nodes[identityId].stake = newNodeStake; + + emit NodeStakeUpdated(identityId, newNodeStake); + } + + function increaseNodeStake(uint72 identityId, uint96 addedNodeStake) external onlyContracts { + nodes[identityId].stake += addedNodeStake; + + emit NodeStakeUpdated(identityId, nodes[identityId].stake); + } + + function decreaseNodeStake(uint72 identityId, uint96 removedNodeStake) external onlyContracts { + nodes[identityId].stake -= removedNodeStake; + + emit NodeStakeUpdated(identityId, nodes[identityId].stake); + } + + function getNodeStake(uint72 identityId) external view returns (uint96) { + return nodes[identityId].stake; + } + + function setNodeRewardIndex(uint72 identityId, uint256 newIndex) external onlyContracts { + nodes[identityId].rewardIndex = newIndex; + + emit NodeRewardIndexUpdated(identityId, newIndex); + } + + function increaseNodeRewardIndex(uint72 identityId, uint256 addedIndex) external onlyContracts { + nodes[identityId].rewardIndex += addedIndex; + + emit NodeRewardIndexUpdated(identityId, nodes[identityId].rewardIndex); + } + + function getNodeRewardIndex(uint72 identityId) external view returns (uint256) { + return nodes[identityId].rewardIndex; + } + + function getNodeCumulativeEarnedRewards(uint72 identityId) external view returns (uint96) { + return nodes[identityId].cumulativeEarnedRewards; + } + + function setNodeCumulativeEarnedRewards(uint72 identityId, uint96 newEarnedRewards) external onlyContracts { + nodes[identityId].cumulativeEarnedRewards = newEarnedRewards; + + emit NodeCumulativeEarnedRewardsUpdated(identityId, newEarnedRewards); + } + + function addNodeCumulativeEarnedRewards(uint72 identityId, uint96 addedRewards) external onlyContracts { + nodes[identityId].cumulativeEarnedRewards += addedRewards; + + emit NodeCumulativeEarnedRewardsUpdated(identityId, nodes[identityId].cumulativeEarnedRewards); + } + + function getNodeCumulativePaidOutRewards(uint72 identityId) external view returns (uint96) { + return nodes[identityId].cumulativePaidOutRewards; + } + + function setNodeCumulativePaidOutRewards(uint72 identityId, uint96 newPaidOutRewards) external onlyContracts { + nodes[identityId].cumulativePaidOutRewards = newPaidOutRewards; + + emit NodeCumulativePaidOutRewardsUpdated(identityId, newPaidOutRewards); + } + + function addNodeCumulativePaidOutRewards(uint72 identityId, uint96 addedRewards) external onlyContracts { + nodes[identityId].cumulativePaidOutRewards += addedRewards; + + emit NodeCumulativePaidOutRewardsUpdated(identityId, nodes[identityId].cumulativePaidOutRewards); + } + + function setOperatorFeeBalance(uint72 identityId, uint96 newBalance) external onlyContracts { + nodes[identityId].operatorFeeBalance = newBalance; + + emit OperatorFeeBalanceUpdated(identityId, newBalance); + } + + function increaseOperatorFeeBalance(uint72 identityId, uint96 addedFee) external onlyContracts { + nodes[identityId].operatorFeeBalance += addedFee; + + emit OperatorFeeBalanceUpdated(identityId, nodes[identityId].operatorFeeBalance); + } + + function decreaseOperatorFeeBalance(uint72 identityId, uint96 removedFee) external onlyContracts { + nodes[identityId].operatorFeeBalance -= removedFee; + + emit OperatorFeeBalanceUpdated(identityId, nodes[identityId].operatorFeeBalance); + } + + function getOperatorFeeBalance(uint72 identityId) external view returns (uint96) { + return nodes[identityId].operatorFeeBalance; + } + + function setOperatorFeeCumulativeEarnedRewards(uint72 identityId, uint96 amount) external onlyContracts { + nodes[identityId].operatorFeeCumulativeEarnedRewards = amount; + + emit OperatorFeeCumulativeEarnedRewardsUpdated(identityId, amount); + } + + function addOperatorFeeCumulativeEarnedRewards(uint72 identityId, uint96 amount) external onlyContracts { + nodes[identityId].operatorFeeCumulativeEarnedRewards += amount; + + emit OperatorFeeCumulativeEarnedRewardsUpdated( + identityId, + nodes[identityId].operatorFeeCumulativeEarnedRewards + ); + } + + function getOperatorFeeCumulativeEarnedRewards(uint72 identityId) external view returns (uint96) { + return nodes[identityId].operatorFeeCumulativeEarnedRewards; + } + + function setOperatorFeeCumulativePaidOutRewards(uint72 identityId, uint96 amount) external onlyContracts { + nodes[identityId].operatorFeeCumulativePaidOutRewards = amount; + + emit OperatorFeeCumulativePaidOutRewardsUpdated(identityId, amount); + } + + function addOperatorFeeCumulativePaidOutRewards(uint72 identityId, uint96 amount) external onlyContracts { + nodes[identityId].operatorFeeCumulativePaidOutRewards += amount; + + emit OperatorFeeCumulativePaidOutRewardsUpdated( + identityId, + nodes[identityId].operatorFeeCumulativePaidOutRewards + ); + } + + function getOperatorFeeCumulativePaidOutRewards(uint72 identityId) external view returns (uint96) { + return nodes[identityId].operatorFeeCumulativePaidOutRewards; + } + + function setDelegatorCount(uint72 identityId, uint256 delegatorCount) external onlyContracts { + nodes[identityId].delegatorCount = delegatorCount; + + emit DelegatorCountUpdated(identityId, delegatorCount); + } + + function getDelegatorCount(uint72 identityId) external view returns (uint256) { + return nodes[identityId].delegatorCount; + } + + // ----------------------------------------------------------------------------------------------------------------- + // Delegators Stake Data Operations + // ----------------------------------------------------------------------------------------------------------------- + + function setDelegatorStakeInfo( + uint72 identityId, + bytes32 delegatorKey, + uint96 stakeBase, + uint96 stakeRewardIndexed + ) external onlyContracts { + StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; + + bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + delegator.stakeBase = stakeBase; + delegator.stakeRewardIndexed = stakeRewardIndexed; + + bool isActive = (stakeBase > 0 || stakeRewardIndexed > 0); + + _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); + + emit DelegatorBaseStakeUpdated(identityId, delegatorKey, stakeBase); + emit DelegatorIndexedStakeUpdated(identityId, delegatorKey, stakeRewardIndexed); + } + + function getDelegatorData( + uint72 identityId, + bytes32 delegatorKey + ) external view returns (uint96, uint96, uint256, uint96, uint96) { + StakingLib.DelegatorData memory delegator = delegators[identityId][delegatorKey]; + return ( + delegator.stakeBase, + delegator.stakeRewardIndexed, + delegator.lastRewardIndex, + delegator.cumulativeEarnedRewards, + delegator.cumulativePaidOutRewards + ); + } + + function getDelegatorStakeInfo( + uint72 identityId, + bytes32 delegatorKey + ) external view returns (uint96, uint96, uint256) { + StakingLib.DelegatorData memory delegator = delegators[identityId][delegatorKey]; + return (delegator.stakeBase, delegator.stakeRewardIndexed, delegator.lastRewardIndex); + } + + function getDelegatorRewardsInfo(uint72 identityId, bytes32 delegatorKey) external view returns (uint96, uint96) { + StakingLib.DelegatorData memory delegator = delegators[identityId][delegatorKey]; + return (delegator.cumulativeEarnedRewards, delegator.cumulativePaidOutRewards); + } + + function setDelegatorStakeBase(uint72 identityId, bytes32 delegatorKey, uint96 stakeBase) external onlyContracts { + StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; + + bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + delegator.stakeBase = stakeBase; + + bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); + + emit DelegatorBaseStakeUpdated(identityId, delegatorKey, stakeBase); + } + + function increaseDelegatorStakeBase( + uint72 identityId, + bytes32 delegatorKey, + uint96 addedStake + ) external onlyContracts { + StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; + + bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + delegator.stakeBase += addedStake; + + bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); + + emit DelegatorBaseStakeUpdated(identityId, delegatorKey, delegator.stakeBase); + } + + function decreaseDelegatorStakeBase( + uint72 identityId, + bytes32 delegatorKey, + uint96 removedStake + ) external onlyContracts { + StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; + + bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + delegator.stakeBase -= removedStake; + + bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); + + emit DelegatorBaseStakeUpdated(identityId, delegatorKey, delegator.stakeBase); + } + + function getDelegatorStakeBase(uint72 identityId, bytes32 delegatorKey) external view returns (uint96) { + return delegators[identityId][delegatorKey].stakeBase; + } + + function setDelegatorStakeRewardIndexed( + uint72 identityId, + bytes32 delegatorKey, + uint96 stakeRewardIndexed + ) external onlyContracts { + StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; + + bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + delegator.stakeRewardIndexed = stakeRewardIndexed; + + bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); + + emit DelegatorIndexedStakeUpdated(identityId, delegatorKey, stakeRewardIndexed); + } + + function increaseDelegatorStakeRewardIndexed( + uint72 identityId, + bytes32 delegatorKey, + uint96 addedStakeReward + ) external onlyContracts { + StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; + + bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + delegator.stakeRewardIndexed += addedStakeReward; + + bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); + + emit DelegatorIndexedStakeUpdated(identityId, delegatorKey, delegator.stakeRewardIndexed); + } + + function decreaseDelegatorStakeRewardIndexed( + uint72 identityId, + bytes32 delegatorKey, + uint96 removedStakeReward + ) external onlyContracts { + StakingLib.DelegatorData storage delegator = delegators[identityId][delegatorKey]; + + bool wasActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + delegator.stakeRewardIndexed -= removedStakeReward; + + bool isActive = (delegator.stakeBase > 0 || delegator.stakeRewardIndexed > 0); + + _updateDelegatorActivity(identityId, delegatorKey, wasActive, isActive); + + emit DelegatorIndexedStakeUpdated(identityId, delegatorKey, delegator.stakeRewardIndexed); + } + + function getDelegatorStakeRewardIndexed(uint72 identityId, bytes32 delegatorKey) external view returns (uint96) { + return delegators[identityId][delegatorKey].stakeRewardIndexed; + } + + function getDelegatorTotalStake(uint72 identityId, bytes32 delegatorKey) external view returns (uint96) { + StakingLib.DelegatorData memory delegator = delegators[identityId][delegatorKey]; + return delegator.stakeBase + delegator.stakeRewardIndexed; + } + + function setDelegatorLastRewardIndex( + uint72 identityId, + bytes32 delegatorKey, + uint256 lastRewardIndex + ) external onlyContracts { + delegators[identityId][delegatorKey].lastRewardIndex = lastRewardIndex; + + emit DelegatorLastRewardIndexUpdated(identityId, delegatorKey, lastRewardIndex); + } + + function getDelegatorLastRewardIndex(uint72 identityId, bytes32 delegatorKey) external view returns (uint256) { + return delegators[identityId][delegatorKey].lastRewardIndex; + } + + function getDelegatorNodes(bytes32 delegatorKey) external view returns (uint72[] memory) { + EnumerableSetLib.Uint256Set storage nodesSet = delegatorNodes[delegatorKey]; + + uint256 length = nodesSet.length(); + uint72[] memory nodeList = new uint72[](length); + for (uint256 i = 0; i < length; i++) { + nodeList[i] = uint72(nodesSet.at(i)); + } + return nodeList; + } + + function getDelegatorNodesCount(bytes32 delegatorKey) external view returns (uint256) { + return delegatorNodes[delegatorKey].length(); + } + + function getDelegatorNodesIn( + bytes32 delegatorKey, + uint256 start, + uint256 end + ) external view returns (uint72[] memory) { + EnumerableSetLib.Uint256Set storage nodesSet = delegatorNodes[delegatorKey]; + + uint72[] memory nodeList = new uint72[](end - start); + for (uint256 i = start; i < end; i++) { + nodeList[i - start] = uint72(nodesSet.at(i)); + } + return nodeList; + } + + function isDelegatingToNode(uint72 identityId, bytes32 delegatorKey) external view returns (bool) { + return delegatorNodes[delegatorKey].contains(identityId); + } + + function addDelegatorCumulativeEarnedRewards( + uint72 identityId, + bytes32 delegatorKey, + uint96 amount + ) external onlyContracts { + delegators[identityId][delegatorKey].cumulativeEarnedRewards += amount; + + emit DelegatorCumulativeEarnedRewardsUpdated( + identityId, + delegatorKey, + delegators[identityId][delegatorKey].cumulativeEarnedRewards + ); + } + + function getDelegatorCumulativeEarnedRewards( + uint72 identityId, + bytes32 delegatorKey + ) external view returns (uint96) { + return delegators[identityId][delegatorKey].cumulativeEarnedRewards; + } + + function addDelegatorCumulativePaidOutRewards( + uint72 identityId, + bytes32 delegatorKey, + uint96 amount + ) external onlyContracts { + delegators[identityId][delegatorKey].cumulativePaidOutRewards += amount; + + emit DelegatorCumulativePaidOutRewardsUpdated( + identityId, + delegatorKey, + delegators[identityId][delegatorKey].cumulativePaidOutRewards + ); + } + + function getDelegatorCumulativePaidOutRewards( + uint72 identityId, + bytes32 delegatorKey + ) external view returns (uint96) { + return delegators[identityId][delegatorKey].cumulativePaidOutRewards; + } + + // ----------------------------------------------------------------------------------------------------------------- + // Delegators Stake Withdrawals Operations + // ----------------------------------------------------------------------------------------------------------------- + + function createDelegatorWithdrawalRequest( + uint72 identityId, + bytes32 delegatorKey, + uint96 amount, + uint96 indexedOutAmount, + uint256 timestamp + ) external onlyContracts { + withdrawals[identityId][delegatorKey] = StakingLib.StakeWithdrawalRequest(amount, indexedOutAmount, timestamp); + + emit DelegatorWithdrawalRequestCreated(identityId, delegatorKey, amount, indexedOutAmount, timestamp); + } + + function getDelegatorWithdrawalRequest( + uint72 identityId, + bytes32 delegatorKey + ) external view returns (uint96, uint96, uint256) { + StakingLib.StakeWithdrawalRequest memory wr = withdrawals[identityId][delegatorKey]; + return (wr.amount, wr.indexedOutAmount, wr.timestamp); + } + + function deleteDelegatorWithdrawalRequest(uint72 identityId, bytes32 delegatorKey) external onlyContracts { + delete withdrawals[identityId][delegatorKey]; + + emit DelegatorWithdrawalRequestDeleted(identityId, delegatorKey); + } + + function getDelegatorWithdrawalRequestAmount( + uint72 identityId, + bytes32 delegatorKey + ) external view returns (uint96) { + return withdrawals[identityId][delegatorKey].amount; + } + + function getDelegatorWithdrawalRequestIndexedOutAmount( + uint72 identityId, + bytes32 delegatorKey + ) external view returns (uint96) { + return withdrawals[identityId][delegatorKey].indexedOutAmount; + } + + function getDelegatorWithdrawalRequestTimestamp( + uint72 identityId, + bytes32 delegatorKey + ) external view returns (uint256) { + return withdrawals[identityId][delegatorKey].timestamp; + } + + function delegatorWithdrawalRequestExists(uint72 identityId, bytes32 delegatorKey) external view returns (bool) { + return withdrawals[identityId][delegatorKey].amount != 0; + } + + // ----------------------------------------------------------------------------------------------------------------- + // Node Operators Stake Withdrawals Operations + // ----------------------------------------------------------------------------------------------------------------- + + function createOperatorFeeWithdrawalRequest( + uint72 identityId, + uint96 amount, + uint96 indexedOutAmount, + uint256 timestamp + ) external onlyContracts { + operatorFeeWithdrawals[identityId] = StakingLib.StakeWithdrawalRequest(amount, indexedOutAmount, timestamp); + + emit OperatorFeeWithdrawalRequestCreated(identityId, amount, indexedOutAmount, timestamp); + } + + function deleteOperatorFeeWithdrawalRequest(uint72 identityId) external onlyContracts { + delete operatorFeeWithdrawals[identityId]; + + emit OperatorFeeWithdrawalRequestDeleted(identityId); + } + + function getOperatorFeeWithdrawalRequest(uint72 identityId) external view returns (uint96, uint96, uint256) { + StakingLib.StakeWithdrawalRequest memory wr = operatorFeeWithdrawals[identityId]; + return (wr.amount, wr.indexedOutAmount, wr.timestamp); + } + + function getOperatorFeeWithdrawalRequestAmount(uint72 identityId) external view returns (uint96) { + return operatorFeeWithdrawals[identityId].amount; + } + + function getOperatorFeeWithdrawalRequestIndexedOutAmount(uint72 identityId) external view returns (uint96) { + return operatorFeeWithdrawals[identityId].indexedOutAmount; + } + + function getOperatorFeeWithdrawalRequestTimestamp(uint72 identityId) external view returns (uint256) { + return operatorFeeWithdrawals[identityId].timestamp; + } + + function operatorFeeWithdrawalRequestExists(uint72 identityId) external view returns (bool) { + return operatorFeeWithdrawals[identityId].amount != 0; + } + + // ----------------------------------------------------------------------------------------------------------------- + // Token Related Operations + // ----------------------------------------------------------------------------------------------------------------- + + function transferStake(address receiver, uint96 stakeAmount) external onlyContracts { + tokenContract.transfer(receiver, stakeAmount); + + emit StakedTokensTransferred(receiver, stakeAmount); + } + + // ----------------------------------------------------------------------------------------------------------------- + // Internal Operations + // ----------------------------------------------------------------------------------------------------------------- + + function _updateDelegatorActivity(uint72 identityId, bytes32 delegatorKey, bool wasActive, bool isActive) internal { + if (!wasActive && isActive) { + delegatorNodes[delegatorKey].add(identityId); + nodes[identityId].delegatorCount += 1; + + emit DelegatorCountUpdated(identityId, nodes[identityId].delegatorCount); + } else if (wasActive && !isActive) { + delegatorNodes[delegatorKey].remove(identityId); + nodes[identityId].delegatorCount -= 1; + + emit DelegatorCountUpdated(identityId, nodes[identityId].delegatorCount); + } + } +} From 6e198ab0e50a5e235c2ac9d88d55830372ac2298 Mon Sep 17 00:00:00 2001 From: Mihajlo Pavlovic Date: Thu, 3 Apr 2025 12:40:50 +0200 Subject: [PATCH 013/106] Add delegatorsInfo interaction to Staking.sol --- contracts/Staking.sol | 61 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/contracts/Staking.sol b/contracts/Staking.sol index b6f42598..e0302ca1 100644 --- a/contracts/Staking.sol +++ b/contracts/Staking.sol @@ -20,6 +20,7 @@ import {TokenLib} from "./libraries/TokenLib.sol"; import {IdentityLib} from "./libraries/IdentityLib.sol"; import {Permissions} from "./libraries/Permissions.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import {DelegatorsInfo} from "./storage/DelegatorsInfo.sol"; contract Staking is INamed, IVersioned, ContractStatus, IInitializable { string private constant _NAME = "Staking"; @@ -32,6 +33,7 @@ contract Staking is INamed, IVersioned, ContractStatus, IInitializable { ParametersStorage public parametersStorage; ProfileStorage public profileStorage; StakingStorage public stakingStorage; + DelegatorsInfo public delegatorsInfo; IERC20 public tokenContract; // solhint-disable-next-line no-empty-blocks @@ -55,6 +57,7 @@ contract Staking is INamed, IVersioned, ContractStatus, IInitializable { parametersStorage = ParametersStorage(hub.getContractAddress("ParametersStorage")); profileStorage = ProfileStorage(hub.getContractAddress("ProfileStorage")); stakingStorage = StakingStorage(hub.getContractAddress("StakingStorage")); + delegatorsInfo = DelegatorsInfo(hub.getContractAddress("DelegatorsInfo")); tokenContract = IERC20(hub.getContractAddress("Token")); } @@ -102,6 +105,15 @@ contract Staking is INamed, IVersioned, ContractStatus, IInitializable { askContract.recalculateActiveSet(); + // Check if this is first time staking + if ( + delegatorStakeBase == 0 && + delegatorStakeIndexed == 0 && + !delegatorsInfo.isNodeDelegator(identityId, msg.sender) + ) { + delegatorsInfo.addDelegator(identityId, msg.sender); + } + token.transferFrom(msg.sender, address(ss), addedStake); } @@ -121,27 +133,32 @@ contract Staking is INamed, IVersioned, ContractStatus, IInitializable { _updateStakeInfo(fromIdentityId, delegatorKey); _updateStakeInfo(toIdentityId, delegatorKey); - (uint96 delegatorStakeBase, uint96 delegatorStakeIndexed, ) = ss.getDelegatorStakeInfo( + (uint96 fromDelegatorStakeBase, uint96 fromDelegatorStakeIndexed, ) = ss.getDelegatorStakeInfo( fromIdentityId, delegatorKey ); - if (stakeAmount > delegatorStakeBase + delegatorStakeIndexed) { - revert StakingLib.WithdrawalExceedsStake(delegatorStakeBase + delegatorStakeIndexed, stakeAmount); + (uint96 toDelegatorStakeBase, uint96 toDelegatorStakeIndexed, ) = ss.getDelegatorStakeInfo( + toIdentityId, + delegatorKey + ); + + if (stakeAmount > fromDelegatorStakeBase + fromDelegatorStakeIndexed) { + revert StakingLib.WithdrawalExceedsStake(fromDelegatorStakeBase + fromDelegatorStakeIndexed, stakeAmount); } if (ss.getNodeStake(toIdentityId) + stakeAmount > parametersStorage.maximumStake()) { revert StakingLib.MaximumStakeExceeded(parametersStorage.maximumStake()); } - uint96 newDelegatorStakeBase = delegatorStakeBase; - uint96 newDelegatorStakeIndexed = delegatorStakeIndexed; + uint96 newFromDelegatorStakeBase = fromDelegatorStakeBase; + uint96 newFromDelegatorStakeIndexed = fromDelegatorStakeIndexed; - if (stakeAmount > delegatorStakeIndexed) { - newDelegatorStakeBase = delegatorStakeBase - (stakeAmount - delegatorStakeIndexed); - newDelegatorStakeIndexed = 0; + if (stakeAmount > fromDelegatorStakeIndexed) { + newFromDelegatorStakeBase = fromDelegatorStakeBase - (stakeAmount - fromDelegatorStakeIndexed); + newFromDelegatorStakeIndexed = 0; } else { - newDelegatorStakeIndexed = delegatorStakeIndexed - stakeAmount; + newFromDelegatorStakeIndexed = fromDelegatorStakeIndexed - stakeAmount; } uint96 totalFromNodeStakeBefore = ss.getNodeStake(fromIdentityId); @@ -150,26 +167,39 @@ contract Staking is INamed, IVersioned, ContractStatus, IInitializable { uint96 totalToNodeStakeBefore = ss.getNodeStake(toIdentityId); uint96 totalToNodeStakeAfter = totalToNodeStakeBefore + stakeAmount; - ss.setDelegatorStakeInfo(fromIdentityId, delegatorKey, newDelegatorStakeBase, newDelegatorStakeIndexed); + ss.setDelegatorStakeInfo(fromIdentityId, delegatorKey, newFromDelegatorStakeBase, newFromDelegatorStakeIndexed); ss.setNodeStake(fromIdentityId, totalFromNodeStakeAfter); _removeNodeFromShardingTable(fromIdentityId, totalFromNodeStakeAfter); ask.recalculateActiveSet(); - if (stakeAmount > delegatorStakeIndexed) { - ss.increaseDelegatorStakeBase(toIdentityId, delegatorKey, (delegatorStakeBase - newDelegatorStakeBase)); + if (stakeAmount > fromDelegatorStakeIndexed) { + ss.increaseDelegatorStakeBase( + toIdentityId, + delegatorKey, + (fromDelegatorStakeBase - newFromDelegatorStakeBase) + ); } ss.increaseDelegatorStakeRewardIndexed( toIdentityId, delegatorKey, - (delegatorStakeIndexed - newDelegatorStakeIndexed) + (fromDelegatorStakeIndexed - newFromDelegatorStakeIndexed) ); ss.setNodeStake(toIdentityId, totalToNodeStakeAfter); _addNodeToShardingTable(toIdentityId, totalToNodeStakeAfter); ask.recalculateActiveSet(); + + // Check if all stake is being removed from fromIdentityId + if (newFromDelegatorStakeIndexed == 0) { + delegatorsInfo.removeDelegator(fromIdentityId, msg.sender); + } + // Check if this is first time delegating to toIdentityId + if (toDelegatorStakeBase == 0 && toDelegatorStakeIndexed == 0) { + delegatorsInfo.addDelegator(toIdentityId, msg.sender); + } } function requestWithdrawal(uint72 identityId, uint96 removedStake) external profileExists(identityId) { @@ -212,6 +242,11 @@ contract Staking is INamed, IVersioned, ContractStatus, IInitializable { askContract.recalculateActiveSet(); + // Check if all stake is being removed + if (newDelegatorStakeBase == 0 && newDelegatorStakeIndexed == 0) { + delegatorsInfo.removeDelegator(identityId, msg.sender); + } + if (totalNodeStakeAfter >= parametersStorage.maximumStake()) { ss.addDelegatorCumulativePaidOutRewards( identityId, From ad8e57a76e4f0bc5e607438f7e1f9c0570e67b29 Mon Sep 17 00:00:00 2001 From: Mihajlo Pavlovic Date: Thu, 3 Apr 2025 14:06:10 +0200 Subject: [PATCH 014/106] Add tests --- abi/DelegatorsInfo.json | 289 ++++++++++++ abi/RandomSampling.json | 407 +++++++++++++++++ abi/RandomSamplingStorage.json | 425 ++++++++++++++++++ abi/Staking.json | 13 + contracts/Staking.sol | 4 +- deploy/021_deploy_delegatorsInfo.ts | 12 + ...eploy_staking.ts => 022_deploy_staking.ts} | 1 + ...eploy_profile.ts => 023_deploy_profile.ts} | 0 ....ts => 024_deploy_knowledge_collection.ts} | 0 ...=> 025_deploy_paranet_staging_registry.ts} | 0 ...eploy_paranet.ts => 026_deploy_paranet.ts} | 0 ...paranet_Incentives_pool_factory_helper.ts} | 0 ...deploy_paranet_incentives_pool_factory.ts} | 0 ...loy_migrator.ts => 029_deploy_migrator.ts} | 0 test/unit/DelegatorsInfo.test.ts | 259 +++++++++++ 15 files changed, 1408 insertions(+), 2 deletions(-) create mode 100644 abi/DelegatorsInfo.json create mode 100644 abi/RandomSampling.json create mode 100644 abi/RandomSamplingStorage.json create mode 100644 deploy/021_deploy_delegatorsInfo.ts rename deploy/{021_deploy_staking.ts => 022_deploy_staking.ts} (96%) rename deploy/{022_deploy_profile.ts => 023_deploy_profile.ts} (100%) rename deploy/{023_deploy_knowledge_collection.ts => 024_deploy_knowledge_collection.ts} (100%) rename deploy/{024_deploy_paranet_staging_registry.ts => 025_deploy_paranet_staging_registry.ts} (100%) rename deploy/{025_deploy_paranet.ts => 026_deploy_paranet.ts} (100%) rename deploy/{026_deploy_paranet_Incentives_pool_factory_helper.ts => 027_deploy_paranet_Incentives_pool_factory_helper.ts} (100%) rename deploy/{027_deploy_paranet_incentives_pool_factory.ts => 028_deploy_paranet_incentives_pool_factory.ts} (100%) rename deploy/{028_deploy_migrator.ts => 029_deploy_migrator.ts} (100%) create mode 100644 test/unit/DelegatorsInfo.test.ts diff --git a/abi/DelegatorsInfo.json b/abi/DelegatorsInfo.json new file mode 100644 index 00000000..15818f98 --- /dev/null +++ b/abi/DelegatorsInfo.json @@ -0,0 +1,289 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "hubAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msg", + "type": "string" + } + ], + "name": "UnauthorizedAccess", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressHub", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "addDelegator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "getDelegatorIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + } + ], + "name": "getDelegators", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "hub", + "outputs": [ + { + "internalType": "contract Hub", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "", + "type": "uint72" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isDelegatorMap", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "isNodeDelegator", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "newAddresses", + "type": "address[]" + } + ], + "name": "migrate", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "", + "type": "uint72" + }, + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "nodeDelegatorIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "", + "type": "uint72" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "nodeDelegators", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "removeDelegator", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_status", + "type": "bool" + } + ], + "name": "setStatus", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "status", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + } +] diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json new file mode 100644 index 00000000..3abc8f74 --- /dev/null +++ b/abi/RandomSampling.json @@ -0,0 +1,407 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "hubAddress", + "type": "address" + }, + { + "internalType": "uint8", + "name": "_avgBlockTimeInSeconds", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "msg", + "type": "string" + } + ], + "name": "UnauthorizedAccess", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressHub", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "chainId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint8", + "name": "avgBlockTimeInSeconds", + "type": "uint8" + } + ], + "name": "AvgBlockTimeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "knowledgeCollectionId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "chunkId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "activeProofPeriodBlock", + "type": "uint256" + } + ], + "name": "ChallengeCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "durationInBlocks", + "type": "uint8" + } + ], + "name": "ProofingPeriodDurationInBlocksUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "score", + "type": "uint256" + } + ], + "name": "ValidProofSubmitted", + "type": "event" + }, + { + "inputs": [], + "name": "askStorage", + "outputs": [ + { + "internalType": "contract AskStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "avgBlockTimeInSeconds", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "chronos", + "outputs": [ + { + "internalType": "contract Chronos", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "chunk", + "type": "bytes32" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "name": "computeMerkleRoot", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "createChallenge", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "knowledgeCollectionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "chunkId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "activeProofPeriodStartBlock", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "solved", + "type": "bool" + } + ], + "internalType": "struct RandomSamplingLib.Challenge", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "epochStorage", + "outputs": [ + { + "internalType": "contract EpochStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "hub", + "outputs": [ + { + "internalType": "contract Hub", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "identityStorage", + "outputs": [ + { + "internalType": "contract IdentityStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "_proofingPeriodDurationInBlocks", + "type": "uint8" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "kcs", + "outputs": [ + { + "internalType": "contract KnowledgeCollectionStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "profileStorage", + "outputs": [ + { + "internalType": "contract ProfileStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "rss", + "outputs": [ + { + "internalType": "contract RandomSamplingStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "blockTimeInSeconds", + "type": "uint8" + } + ], + "name": "setAvgBlockTimeInSeconds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_status", + "type": "bool" + } + ], + "name": "setStatus", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "stakingStorage", + "outputs": [ + { + "internalType": "contract StakingStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "status", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "chunk", + "type": "bytes32" + }, + { + "internalType": "bytes32[]", + "name": "merkleProof", + "type": "bytes32[]" + } + ], + "name": "submitProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + } +] diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json new file mode 100644 index 00000000..83befe44 --- /dev/null +++ b/abi/RandomSamplingStorage.json @@ -0,0 +1,425 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "hubAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "ZeroAddressHub", + "type": "error" + }, + { + "inputs": [], + "name": "CHUNK_BYTE_SIZE", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "activeProofPeriodStartBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "uint256", + "name": "score", + "type": "uint256" + } + ], + "name": "addToEpochNodeTotalScore", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "epochAllNodesTotalScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "", + "type": "uint72" + } + ], + "name": "epochNodeTotalScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "", + "type": "uint72" + } + ], + "name": "epochNodeValidProofsCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getActiveProofPeriodStartBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + } + ], + "name": "getEpochAllNodesTotalScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + } + ], + "name": "getEpochNodeTotalScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + } + ], + "name": "getEpochNodeValidProofsCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + } + ], + "name": "getNodeChallenge", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "knowledgeCollectionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "chunkId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "activeProofPeriodStartBlock", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "solved", + "type": "bool" + } + ], + "internalType": "struct RandomSamplingLib.Challenge", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProofingPeriodDurationInBlocks", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "hub", + "outputs": [ + { + "internalType": "contract Hub", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + } + ], + "name": "incrementEpochNodeValidProofsCount", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "", + "type": "uint72" + } + ], + "name": "nodesChallenges", + "outputs": [ + { + "internalType": "uint256", + "name": "knowledgeCollectionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "chunkId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "activeProofPeriodStartBlock", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "solved", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proofingPeriodDurationInBlocks", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "components": [ + { + "internalType": "uint256", + "name": "knowledgeCollectionId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "chunkId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "activeProofPeriodStartBlock", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "solved", + "type": "bool" + } + ], + "internalType": "struct RandomSamplingLib.Challenge", + "name": "challenge", + "type": "tuple" + } + ], + "name": "setNodeChallenge", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "durationInBlocks", + "type": "uint8" + } + ], + "name": "setProofingPeriodDurationInBlocks", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "version", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + } +] diff --git a/abi/Staking.json b/abi/Staking.json index 2e08d4d3..0a182dad 100644 --- a/abi/Staking.json +++ b/abi/Staking.json @@ -203,6 +203,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "delegatorsInfo", + "outputs": [ + { + "internalType": "contract DelegatorsInfo", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { diff --git a/contracts/Staking.sol b/contracts/Staking.sol index e0302ca1..40c11c15 100644 --- a/contracts/Staking.sol +++ b/contracts/Staking.sol @@ -9,6 +9,7 @@ import {ParametersStorage} from "./storage/ParametersStorage.sol"; import {ProfileStorage} from "./storage/ProfileStorage.sol"; import {ShardingTableStorage} from "./storage/ShardingTableStorage.sol"; import {StakingStorage} from "./storage/StakingStorage.sol"; +import {DelegatorsInfo} from "./storage/DelegatorsInfo.sol"; import {ContractStatus} from "./abstract/ContractStatus.sol"; import {IInitializable} from "./interfaces/IInitializable.sol"; import {INamed} from "./interfaces/INamed.sol"; @@ -20,11 +21,10 @@ import {TokenLib} from "./libraries/TokenLib.sol"; import {IdentityLib} from "./libraries/IdentityLib.sol"; import {Permissions} from "./libraries/Permissions.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import {DelegatorsInfo} from "./storage/DelegatorsInfo.sol"; contract Staking is INamed, IVersioned, ContractStatus, IInitializable { string private constant _NAME = "Staking"; - string private constant _VERSION = "1.0.0"; + string private constant _VERSION = "1.0.1"; Ask public askContract; ShardingTableStorage public shardingTableStorage; diff --git a/deploy/021_deploy_delegatorsInfo.ts b/deploy/021_deploy_delegatorsInfo.ts new file mode 100644 index 00000000..3bef68cf --- /dev/null +++ b/deploy/021_deploy_delegatorsInfo.ts @@ -0,0 +1,12 @@ +import { HardhatRuntimeEnvironment } from 'hardhat/types'; +import { DeployFunction } from 'hardhat-deploy/types'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + await hre.helpers.deploy({ + newContractName: 'DelegatorsInfo', + }); +}; + +export default func; +func.tags = ['DelegatorsInfo']; +func.dependencies = ['Hub']; diff --git a/deploy/021_deploy_staking.ts b/deploy/022_deploy_staking.ts similarity index 96% rename from deploy/021_deploy_staking.ts rename to deploy/022_deploy_staking.ts index 9cda57cd..e002d0ff 100644 --- a/deploy/021_deploy_staking.ts +++ b/deploy/022_deploy_staking.ts @@ -20,4 +20,5 @@ func.dependencies = [ 'StakingStorage', 'NodeOperatorFeesStorage', 'Ask', + 'DelegatorsInfo', ]; diff --git a/deploy/022_deploy_profile.ts b/deploy/023_deploy_profile.ts similarity index 100% rename from deploy/022_deploy_profile.ts rename to deploy/023_deploy_profile.ts diff --git a/deploy/023_deploy_knowledge_collection.ts b/deploy/024_deploy_knowledge_collection.ts similarity index 100% rename from deploy/023_deploy_knowledge_collection.ts rename to deploy/024_deploy_knowledge_collection.ts diff --git a/deploy/024_deploy_paranet_staging_registry.ts b/deploy/025_deploy_paranet_staging_registry.ts similarity index 100% rename from deploy/024_deploy_paranet_staging_registry.ts rename to deploy/025_deploy_paranet_staging_registry.ts diff --git a/deploy/025_deploy_paranet.ts b/deploy/026_deploy_paranet.ts similarity index 100% rename from deploy/025_deploy_paranet.ts rename to deploy/026_deploy_paranet.ts diff --git a/deploy/026_deploy_paranet_Incentives_pool_factory_helper.ts b/deploy/027_deploy_paranet_Incentives_pool_factory_helper.ts similarity index 100% rename from deploy/026_deploy_paranet_Incentives_pool_factory_helper.ts rename to deploy/027_deploy_paranet_Incentives_pool_factory_helper.ts diff --git a/deploy/027_deploy_paranet_incentives_pool_factory.ts b/deploy/028_deploy_paranet_incentives_pool_factory.ts similarity index 100% rename from deploy/027_deploy_paranet_incentives_pool_factory.ts rename to deploy/028_deploy_paranet_incentives_pool_factory.ts diff --git a/deploy/028_deploy_migrator.ts b/deploy/029_deploy_migrator.ts similarity index 100% rename from deploy/028_deploy_migrator.ts rename to deploy/029_deploy_migrator.ts diff --git a/test/unit/DelegatorsInfo.test.ts b/test/unit/DelegatorsInfo.test.ts new file mode 100644 index 00000000..d859f2a9 --- /dev/null +++ b/test/unit/DelegatorsInfo.test.ts @@ -0,0 +1,259 @@ +import { randomBytes } from 'crypto'; + +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; +import { expect } from 'chai'; +import hre from 'hardhat'; + +import { + Token, + Profile, + StakingStorage, + ParametersStorage, + ProfileStorage, + ShardingTable, + ShardingTableStorage, + AskStorage, + Hub, + Staking, + DelegatorsInfo, +} from '../../typechain'; + +type StakingFixture = { + accounts: SignerWithAddress[]; + Token: Token; + Profile: Profile; + Staking: Staking; + StakingStorage: StakingStorage; + ShardingTableStorage: ShardingTableStorage; + ShardingTable: ShardingTable; + ParametersStorage: ParametersStorage; + ProfileStorage: ProfileStorage; + AskStorage: AskStorage; + Hub: Hub; + DelegatorsInfo: DelegatorsInfo; +}; + +async function deployStakingFixture(): Promise { + await hre.deployments.fixture(['Profile', 'Staking']); + const Staking = await hre.ethers.getContract('Staking'); + const Profile = await hre.ethers.getContract('Profile'); + const Token = await hre.ethers.getContract('Token'); + const StakingStorage = + await hre.ethers.getContract('StakingStorage'); + const ShardingTableStorage = + await hre.ethers.getContract('ShardingTableStorage'); + const ShardingTable = + await hre.ethers.getContract('ShardingTable'); + const ParametersStorage = + await hre.ethers.getContract('ParametersStorage'); + const ProfileStorage = + await hre.ethers.getContract('ProfileStorage'); + const AskStorage = await hre.ethers.getContract('AskStorage'); + const Hub = await hre.ethers.getContract('Hub'); + const DelegatorsInfo = + await hre.ethers.getContract('DelegatorsInfo'); + const accounts = await hre.ethers.getSigners(); + + await Hub.setContractAddress('HubOwner', accounts[0].address); + + return { + accounts, + Token, + Profile, + Staking, + StakingStorage, + ShardingTableStorage, + ShardingTable, + ParametersStorage, + ProfileStorage, + AskStorage, + Hub, + DelegatorsInfo, + }; +} + +describe('DelegatorsInfo contract', function () { + let accounts: SignerWithAddress[]; + // let Token: Token; + let Profile: Profile; + // let Staking: Staking; + // let StakingStorage: StakingStorage; + // let ShardingTableStorage: ShardingTableStorage; + // let ParametersStorage: ParametersStorage; + // let ProfileStorage: ProfileStorage; + let DelegatorsInfo: DelegatorsInfo; + const createProfile = async ( + admin?: SignerWithAddress, + operational?: SignerWithAddress, + initialOperatorFee?: bigint, + ) => { + const node = '0x' + randomBytes(32).toString('hex'); + const tx = await Profile.connect(operational ?? accounts[1]).createProfile( + admin ? admin.address : accounts[0], + [], + `Node ${Math.floor(Math.random() * 1000)}`, + node, + (initialOperatorFee ?? 0n) * 100n, + ); + const receipt = await tx.wait(); + const identityId = Number(receipt?.logs[0].topics[1]); + return { nodeId: node, identityId }; + }; + + beforeEach(async () => { + ({ + accounts, + // Token, + Profile, + // Staking, + // StakingStorage, + // ShardingTableStorage, + // ParametersStorage, + // ProfileStorage, + DelegatorsInfo, + } = await loadFixture(deployStakingFixture)); + }); + + it('Should have correct name and version', async () => { + expect(await DelegatorsInfo.name()).to.equal('DelegatorsInfo'); + expect(await DelegatorsInfo.version()).to.equal('1.0.0'); + }); + + it('Should add delegator', async () => { + const { identityId } = await createProfile(); + await DelegatorsInfo.addDelegator(identityId, accounts[1].address); + const isDelegator = await DelegatorsInfo.isNodeDelegator( + identityId, + accounts[1].address, + ); + expect(isDelegator).to.equal(true); + }); + + it('Should remove delegator', async () => { + const { identityId } = await createProfile(); + await DelegatorsInfo.addDelegator(identityId, accounts[1].address); + await DelegatorsInfo.removeDelegator(identityId, accounts[1].address); + const isDelegator = await DelegatorsInfo.isNodeDelegator( + identityId, + accounts[1].address, + ); + expect(isDelegator).to.equal(false); + const nodeDelegators = await DelegatorsInfo.getDelegators(identityId); + expect(nodeDelegators.length).to.equal(0); + }); + it('Should remove delegator from end of array', async () => { + const { identityId } = await createProfile(); + await DelegatorsInfo.addDelegator(identityId, accounts[1].address); + await DelegatorsInfo.addDelegator(identityId, accounts[2].address); + await DelegatorsInfo.removeDelegator(identityId, accounts[2].address); + const isDelegator = await DelegatorsInfo.isNodeDelegator( + identityId, + accounts[2].address, + ); + expect(isDelegator).to.equal(false); + const nodeDelegators = await DelegatorsInfo.getDelegators(identityId); + expect(nodeDelegators.length).to.equal(1); + expect(nodeDelegators[0]).to.equal(accounts[1].address); + const removedDelegatorIndex = await DelegatorsInfo.getDelegatorIndex( + identityId, + accounts[2].address, + ); + expect(removedDelegatorIndex).to.equal(0); + const keptDelegatorIndex = await DelegatorsInfo.getDelegatorIndex( + identityId, + accounts[1].address, + ); + expect(keptDelegatorIndex).to.equal(0); + }); + it('Should remove delegator from middle of array', async () => { + const { identityId } = await createProfile(); + await DelegatorsInfo.addDelegator(identityId, accounts[1].address); + await DelegatorsInfo.addDelegator(identityId, accounts[2].address); + await DelegatorsInfo.addDelegator(identityId, accounts[3].address); + + const isDelegator1 = await DelegatorsInfo.isNodeDelegator( + identityId, + accounts[1].address, + ); + expect(isDelegator1).to.equal(true); + const isDelegator2 = await DelegatorsInfo.isNodeDelegator( + identityId, + accounts[2].address, + ); + expect(isDelegator2).to.equal(true); + const isDelegator3 = await DelegatorsInfo.isNodeDelegator( + identityId, + accounts[3].address, + ); + expect(isDelegator3).to.equal(true); + await DelegatorsInfo.removeDelegator(identityId, accounts[2].address); + + const isDelegator = await DelegatorsInfo.isNodeDelegator( + identityId, + accounts[2].address, + ); + expect(isDelegator).to.equal(false); + const nodeDelegators = await DelegatorsInfo.getDelegators(identityId); + expect(nodeDelegators.length).to.equal(2); + expect(nodeDelegators[0]).to.equal(accounts[1].address); + expect(nodeDelegators[1]).to.equal(accounts[3].address); + const removedDelegatorIndex = await DelegatorsInfo.getDelegatorIndex( + identityId, + accounts[2].address, + ); + expect(removedDelegatorIndex).to.equal(0); + const keptDelegatorIndex1 = await DelegatorsInfo.getDelegatorIndex( + identityId, + accounts[1].address, + ); + expect(keptDelegatorIndex1).to.equal(0); + const keptDelegatorIndex3 = await DelegatorsInfo.getDelegatorIndex( + identityId, + accounts[3].address, + ); + expect(keptDelegatorIndex3).to.equal(1); + }); + + it('Should revert when removing non-existent delegator', async () => { + const { identityId } = await createProfile(); + await expect( + DelegatorsInfo.removeDelegator(identityId, accounts[1].address), + ).to.be.revertedWith('Delegator not found'); + }); + + it('Should handle multiple operations on same identity', async () => { + const { identityId } = await createProfile(); + // Add multiple delegators + await DelegatorsInfo.addDelegator(identityId, accounts[1].address); + await DelegatorsInfo.addDelegator(identityId, accounts[2].address); + + // Remove and re-add + await DelegatorsInfo.removeDelegator(identityId, accounts[1].address); + await DelegatorsInfo.addDelegator(identityId, accounts[1].address); + + const delegators = await DelegatorsInfo.getDelegators(identityId); + expect(delegators.length).to.equal(2); + // Check if indices were updated correctly + expect( + await DelegatorsInfo.getDelegatorIndex(identityId, accounts[1].address), + ).to.equal(1); + }); + + it('Should return correct delegator list', async () => { + const { identityId } = await createProfile(); + await DelegatorsInfo.addDelegator(identityId, accounts[1].address); + await DelegatorsInfo.addDelegator(identityId, accounts[2].address); + + const delegators = await DelegatorsInfo.getDelegators(identityId); + expect(delegators).to.deep.equal([ + accounts[1].address, + accounts[2].address, + ]); + }); + + it('Should return empty array for non-existent identity', async () => { + const delegators = await DelegatorsInfo.getDelegators(999); + expect(delegators.length).to.equal(0); + }); +}); From 1b6efc7e2481dda505fc3c73cd7793123e606e47 Mon Sep 17 00:00:00 2001 From: Mihajlo Pavlovic Date: Thu, 3 Apr 2025 14:14:53 +0200 Subject: [PATCH 015/106] Rename nodeDelegators -> nodeDelegatorAddresses --- abi/DelegatorsInfo.json | 20 ++++++++++---------- contracts/storage/DelegatorsInfo.sol | 21 +++++++++++---------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/abi/DelegatorsInfo.json b/abi/DelegatorsInfo.json index 15818f98..27171de5 100644 --- a/abi/DelegatorsInfo.json +++ b/abi/DelegatorsInfo.json @@ -189,17 +189,17 @@ "type": "uint72" }, { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], - "name": "nodeDelegatorIndex", + "name": "nodeDelegatorAddresses", "outputs": [ { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], "stateMutability": "view", @@ -213,17 +213,17 @@ "type": "uint72" }, { - "internalType": "uint256", + "internalType": "address", "name": "", - "type": "uint256" + "type": "address" } ], - "name": "nodeDelegators", + "name": "nodeDelegatorIndex", "outputs": [ { - "internalType": "address", + "internalType": "uint256", "name": "", - "type": "address" + "type": "uint256" } ], "stateMutability": "view", diff --git a/contracts/storage/DelegatorsInfo.sol b/contracts/storage/DelegatorsInfo.sol index 29077ec2..0736a077 100644 --- a/contracts/storage/DelegatorsInfo.sol +++ b/contracts/storage/DelegatorsInfo.sol @@ -13,7 +13,7 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { string private constant _VERSION = "1.0.0"; // IdentityId => Delegators - mapping(uint72 => address[]) public nodeDelegators; + mapping(uint72 => address[]) public nodeDelegatorAddresses; // IdentityId => Delegator => Index mapping(uint72 => mapping(address => uint256)) public nodeDelegatorIndex; // IdentityId => Delegator => IsDelegator @@ -33,8 +33,8 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { } function addDelegator(uint72 identityId, address delegator) external onlyContracts { - nodeDelegatorIndex[identityId][delegator] = nodeDelegators[identityId].length; - nodeDelegators[identityId].push(delegator); + nodeDelegatorIndex[identityId][delegator] = nodeDelegatorAddresses[identityId].length; + nodeDelegatorAddresses[identityId].push(delegator); isDelegatorMap[identityId][delegator] = true; } @@ -44,21 +44,21 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { } uint256 indexToRemove = nodeDelegatorIndex[identityId][delegator]; - uint256 lastIndex = nodeDelegators[identityId].length - 1; + uint256 lastIndex = nodeDelegatorAddresses[identityId].length - 1; if (indexToRemove != lastIndex) { - address lastDelegator = nodeDelegators[identityId][lastIndex]; - nodeDelegators[identityId][indexToRemove] = lastDelegator; + address lastDelegator = nodeDelegatorAddresses[identityId][lastIndex]; + nodeDelegatorAddresses[identityId][indexToRemove] = lastDelegator; nodeDelegatorIndex[identityId][lastDelegator] = indexToRemove; } - nodeDelegators[identityId].pop(); + nodeDelegatorAddresses[identityId].pop(); delete nodeDelegatorIndex[identityId][delegator]; delete isDelegatorMap[identityId][delegator]; } function getDelegators(uint72 identityId) external view returns (address[] memory) { - return nodeDelegators[identityId]; + return nodeDelegatorAddresses[identityId]; } function getDelegatorIndex(uint72 identityId, address delegator) external view returns (uint256) { @@ -81,8 +81,9 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { } continue; } - nodeDelegatorIndex[delegatorNodes[j]][newAddresses[i]] = nodeDelegators[delegatorNodes[j]].length; - nodeDelegators[delegatorNodes[j]].push(newAddresses[i]); + nodeDelegatorIndex[delegatorNodes[j]][newAddresses[i]] = nodeDelegatorAddresses[delegatorNodes[j]] + .length; + nodeDelegatorAddresses[delegatorNodes[j]].push(newAddresses[i]); isDelegatorMap[delegatorNodes[j]][newAddresses[i]] = true; unchecked { j++; From ae715c4b8e816281c474d8742899579dc3e7e6ea Mon Sep 17 00:00:00 2001 From: Mihajlo Pavlovic Date: Thu, 3 Apr 2025 14:17:55 +0200 Subject: [PATCH 016/106] Add logic for returning delegator to nodeDelegtors when it cancels stake withdrawle --- contracts/Staking.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/Staking.sol b/contracts/Staking.sol index 40c11c15..18fc58ef 100644 --- a/contracts/Staking.sol +++ b/contracts/Staking.sol @@ -335,7 +335,6 @@ contract Staking is INamed, IVersioned, ContractStatus, IInitializable { } uint96 totalNodeStakeAfter = totalNodeStakeBefore + returnableStakeAmount; - ss.setDelegatorStakeInfo( identityId, delegatorKey, @@ -344,6 +343,10 @@ contract Staking is INamed, IVersioned, ContractStatus, IInitializable { ); ss.setNodeStake(identityId, totalNodeStakeAfter); ss.increaseTotalStake(delegatorWithdrawalAmount); + // Check if delegator had any stake before canceling withdrawal + if (delegatorStakeBase == 0 && delegatorStakeIndexed == 0) { + delegatorsInfo.addDelegator(identityId, msg.sender); + } _addNodeToShardingTable(identityId, totalNodeStakeAfter); From 48b89acfbe8ba88f1a32d7d40b5efd3b6f6ab038 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 3 Apr 2025 15:35:29 +0200 Subject: [PATCH 017/106] delegators score --- contracts/RandomSampling.sol | 131 ++++++++++++++------ contracts/storage/RandomSamplingStorage.sol | 40 ++++-- 2 files changed, 120 insertions(+), 51 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index efb453f5..40dc9285 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -15,10 +15,12 @@ import {ProfileStorage} from "./storage/ProfileStorage.sol"; import {EpochStorage} from "./storage/EpochStorage.sol"; import {Chronos} from "./storage/Chronos.sol"; import {AskStorage} from "./storage/AskStorage.sol"; +import {DelegatorsInfo} from "./storage/DelegatorsInfo.sol"; contract RandomSampling is INamed, IVersioned, ContractStatus { string private constant _NAME = "RandomSampling"; string private constant _VERSION = "1.0.0"; + uint256 SCALING_FACTOR = 1e18; uint8 public avgBlockTimeInSeconds; IdentityStorage public identityStorage; @@ -29,6 +31,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { EpochStorage public epochStorage; Chronos public chronos; AskStorage public askStorage; + // DelegatorsInfo public delegatorsInfo; event ChallengeCreated( uint256 indexed identityId, @@ -54,6 +57,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { epochStorage = EpochStorage(hub.getContractAddress("EpochStorage")); chronos = Chronos(hub.getContractAddress("Chronos")); askStorage = AskStorage(hub.getContractAddress("AskStorage")); + // delegatorsInfo = DelegatorsInfo(hub.getContractAddress("DelegatorsInfo")); } function name() external pure virtual override returns (string memory) { @@ -141,33 +145,12 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { uint256 epoch = chronos.getCurrentEpoch(); randomSamplingStorage.incrementEpochNodeValidProofsCount(epoch, identityId); - uint256 SCALING_FACTOR = 1e18; - - // Node stake factor - uint256 nodeStake = stakingStorage.getNodeStake(identityId); - uint256 nodeStakeFactor = (2 * ((nodeStake * SCALING_FACTOR) / 2000000) ** 2) / SCALING_FACTOR; - - // Node ask factor - uint256 nodeAsk = profileStorage.getAsk(identityId); - (uint256 askLowerBound, uint256 askUpperBound) = askStorage.getAskBounds(); - uint256 nodeAskFactor = (nodeStake * - (((askUpperBound - nodeAsk) * SCALING_FACTOR) / (askUpperBound - askLowerBound)) ** 2) / - 2 / - SCALING_FACTOR; - - // Node publishing factor - uint256 nodePubFactor = epochStorage.getNodeCurrentEpochProducedKnowledgeValue(identityId); - uint256 nodePublishingFactor = (nodeStakeFactor * - (nodePubFactor * epochStorage.getCurrentEpochNodeMaxProducedKnowledgeValue())) / SCALING_FACTOR; - - // Node score - uint256 score = nodeStakeFactor + nodePublishingFactor - nodeAskFactor; + // Calculate node score at this proof period and store it + uint256 score = _calculateNodeScore(identityId); randomSamplingStorage.addToNodeScore(epoch, activeProofPeriodStartBlock, identityId, score); - // uint256 delegatorCount = ; - - // iterate through all delegators - for (uint8 i = 0; i < stakingStorage.getDelegatorCount(identityId); i++) {} + // // Calculate delegators' scores for the previous proof period and store them + // _calculateDelegatorsScore(identityId, epoch, activeProofPeriodStartBlock); emit ValidProofSubmitted(identityId, epoch, score); @@ -177,6 +160,91 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { return false; } + function getAllExpectedEpochProofsCount() internal view returns (uint256) { + uint256 allNodesCount = identityStorage.lastIdentityId(); + uint256 epochLengthInSeconds = chronos.epochLength(); + uint256 maxPossibleNodeProofsInEpoch = epochLengthInSeconds / + (randomSamplingStorage.getProofingPeriodDurationInBlocks() * avgBlockTimeInSeconds); + return allNodesCount * maxPossibleNodeProofsInEpoch; + } + + function setAvgBlockTimeInSeconds(uint8 blockTimeInSeconds) external onlyHubOwner { + avgBlockTimeInSeconds = blockTimeInSeconds; + emit AvgBlockTimeUpdated(blockTimeInSeconds); + } + + function _calculateNodeScore(uint72 identityId) private view returns (uint256) { + // 1. Node stake factor calculation + // Formula: nodeStakeFactor = 2 * (nodeStake / 2,000,000)^2 + uint256 nodeStake = stakingStorage.getNodeStake(identityId); + uint256 stakeRatio = nodeStake / 2000000; + uint256 nodeStakeFactor = (2 * stakeRatio * stakeRatio) / SCALING_FACTOR; + + // 2. Node ask factor calculation + // Formula: nodeStake * ((upperAskBound - nodeAsk) / (upperAskBound - lowerAskBound))^2 / 2,000,000 + uint256 nodeAskScaled = profileStorage.getAsk(identityId) * 1e18; + (uint256 askLowerBound, uint256 askUpperBound) = askStorage.getAskBounds(); + uint256 nodeAskFactor = 0; + if (nodeAskScaled <= askUpperBound && nodeAskScaled >= askLowerBound) { + uint256 askBoundsDiff = askUpperBound - askLowerBound; + if (askBoundsDiff == 0) { + revert("Ask bounds difference is 0"); + } + uint256 askDiffRatio = ((askUpperBound - nodeAskScaled) * SCALING_FACTOR) / askBoundsDiff; + nodeAskFactor = (stakeRatio * (askDiffRatio ** 2)) / (SCALING_FACTOR ** 2); + } + + // 3. Node publishing factor calculation + // Original: nodeStakeFactor * (nodePublishingFactor / MAX(allNodesPublishingFactors)) + uint256 nodePubFactor = epochStorage.getNodeCurrentEpochProducedKnowledgeValue(identityId); + uint256 maxNodePubFactor = epochStorage.getCurrentEpochNodeMaxProducedKnowledgeValue(); + if (maxNodePubFactor == 0) { + revert("Max node publishing factor is 0"); + } + uint256 pubRatio = (nodePubFactor * SCALING_FACTOR) / maxNodePubFactor; + uint256 nodePublishingFactor = (nodeStakeFactor * pubRatio) / SCALING_FACTOR; + + return nodeStakeFactor + nodePublishingFactor - nodeAskFactor; + } + + function _calculateDelegatorsScore( + uint72 identityId, + uint256 epoch, + uint256 activeProofPeriodStartBlock + ) private view returns (uint256) { + uint256 lastProofPeriodStartBlock = randomSamplingStorage.getHistoricalProofPeriodStartBlock( + activeProofPeriodStartBlock, + 1 + ); + uint256 myNodeScore = randomSamplingStorage.getNodeEpochProofPeriodScore( + identityId, + epoch, + lastProofPeriodStartBlock + ); + uint256 allNodesScore = randomSamplingStorage.getEpochAllNodesProofPeriodScore( + epoch, + lastProofPeriodStartBlock + ); + uint256 lastProofPeriodScoreRatio = (myNodeScore * SCALING_FACTOR) / allNodesScore; + + // update all delegators' scores + address[] memory delegatorsAddresses = delegatorsInfo.getDelegators(identityId); + for (uint8 i = 0; i < delegatorsAddresses.length; ) { + bytes32 delegatorKey = keccak256(abi.encodePacked(delegatorsAddresses[i])); + + uint256 delegatorStake = stakingStorage.getDelegatorTotalStake(identityId, delegatorKey); + uint256 nodeStake = stakingStorage.getNodeStake(identityId); + // Need to divide by SCALING_FACTOR^2 to get the correct score + uint256 delegatorScore = (lastProofPeriodScoreRatio * delegatorStake * SCALING_FACTOR) / nodeStake; + + randomSamplingStorage.addToEpochNodeDelegatorScore(epoch, identityId, delegatorKey, delegatorScore); + + unchecked { + i++; + } + } + } + function _generateChallenge( uint72 identityId, address originalSender @@ -213,19 +281,6 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { return RandomSamplingLib.Challenge(knowledgeCollectionId, chunkId, activeProofPeriodStartBlock, false); } - function getAllExpectedEpochProofsCount() internal view returns (uint256) { - uint256 allNodesCount = identityStorage.lastIdentityId(); - uint256 epochLengthInSeconds = chronos.epochLength(); - uint256 maxPossibleNodeProofsInEpoch = epochLengthInSeconds / - (randomSamplingStorage.getProofingPeriodDurationInBlocks() * avgBlockTimeInSeconds); - return allNodesCount * maxPossibleNodeProofsInEpoch; - } - - function setAvgBlockTimeInSeconds(uint8 blockTimeInSeconds) external onlyHubOwner { - avgBlockTimeInSeconds = blockTimeInSeconds; - emit AvgBlockTimeUpdated(blockTimeInSeconds); - } - // get rewards amount // claim rewards diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index cb4568c7..9a147825 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -23,10 +23,8 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { mapping(uint72 => mapping(uint256 => mapping(uint256 => uint256))) public nodeEpochProofPeriodScore; // epoch => proofPeriodStartBlock => score mapping(uint256 => mapping(uint256 => uint256)) public allNodesEpochProofPeriodScore; - // // epoch => identityId => score - // mapping(uint256 => mapping(uint72 => uint256)) public epochNodeTotalScore; - // // epoch => score - // mapping(uint256 => uint256) public epochAllNodesTotalScore; + // epoch => identityId => delegatorKey => score + mapping(uint256 => mapping(uint72 => mapping(bytes32 => uint256))) public epochNodeDelegatorScore; constructor(address hubAddress, uint8 _proofingPeriodDurationInBlocks) HubDependent(hubAddress) { proofingPeriodDurationInBlocks = _proofingPeriodDurationInBlocks; @@ -49,6 +47,16 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { return activeProofPeriodStartBlock; } + function getHistoricalProofPeriodStartBlock( + uint256 proofPeriodStartBlock, + uint256 offset + ) external view returns (uint256) { + require(proofPeriodStartBlock > 0, "Proof period start block must be greater than 0"); + require(proofPeriodStartBlock % proofingPeriodDurationInBlocks == 0, "Proof period start block is not valid"); + require(offset > 0, "Offset must be greater than 0"); + return proofPeriodStartBlock - (offset * proofingPeriodDurationInBlocks); + } + function getProofingPeriodDurationInBlocks() external view returns (uint8) { return proofingPeriodDurationInBlocks; } @@ -89,10 +97,6 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { return epochNodeValidProofsCount[epoch][identityId]; } - // function getEpochNodeTotalScore(uint256 epoch, uint72 identityId) external view returns (uint256) { - // return epochNodeTotalScore[epoch][identityId]; - // } - function addToNodeScore( uint256 epoch, uint256 proofPeriodStartBlock, @@ -101,12 +105,22 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { ) external onlyContracts { nodeEpochProofPeriodScore[identityId][epoch][proofPeriodStartBlock] += score; allNodesEpochProofPeriodScore[epoch][proofPeriodStartBlock] += score; + } - // epochNodeTotalScore[epoch][identityId] += score; - // epochAllNodesTotalScore[epoch] += score; + function getEpochNodeDelegatorScore( + uint256 epoch, + uint72 identityId, + bytes32 delegatorKey + ) external view returns (uint256) { + return epochNodeDelegatorScore[epoch][identityId][delegatorKey]; } - // function getEpochAllNodesTotalScore(uint256 epoch) external view returns (uint256) { - // return epochAllNodesTotalScore[epoch]; - // } + function addToEpochNodeDelegatorScore( + uint256 epoch, + uint72 identityId, + bytes32 delegatorKey, + uint256 score + ) external onlyContracts { + epochNodeDelegatorScore[epoch][identityId][delegatorKey] += score; + } } From 61844bf57149f894cdc7c8f13b7c04867d3616a4 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 3 Apr 2025 15:36:40 +0200 Subject: [PATCH 018/106] uncomment code --- contracts/RandomSampling.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 40dc9285..0f53f2c1 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -31,7 +31,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { EpochStorage public epochStorage; Chronos public chronos; AskStorage public askStorage; - // DelegatorsInfo public delegatorsInfo; + DelegatorsInfo public delegatorsInfo; event ChallengeCreated( uint256 indexed identityId, @@ -57,7 +57,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { epochStorage = EpochStorage(hub.getContractAddress("EpochStorage")); chronos = Chronos(hub.getContractAddress("Chronos")); askStorage = AskStorage(hub.getContractAddress("AskStorage")); - // delegatorsInfo = DelegatorsInfo(hub.getContractAddress("DelegatorsInfo")); + delegatorsInfo = DelegatorsInfo(hub.getContractAddress("DelegatorsInfo")); } function name() external pure virtual override returns (string memory) { From dc035074a575e6fdfc8bea66f9cfe8dd3f6fc72b Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 3 Apr 2025 15:59:01 +0200 Subject: [PATCH 019/106] fix delegators score function --- contracts/RandomSampling.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 0f53f2c1..bd27770b 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -149,8 +149,8 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { uint256 score = _calculateNodeScore(identityId); randomSamplingStorage.addToNodeScore(epoch, activeProofPeriodStartBlock, identityId, score); - // // Calculate delegators' scores for the previous proof period and store them - // _calculateDelegatorsScore(identityId, epoch, activeProofPeriodStartBlock); + // Calculate delegators' scores for the previous proof period and store them + _calculateAndStoreDelegatorScores(identityId, epoch, activeProofPeriodStartBlock); emit ValidProofSubmitted(identityId, epoch, score); @@ -207,11 +207,11 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { return nodeStakeFactor + nodePublishingFactor - nodeAskFactor; } - function _calculateDelegatorsScore( + function _calculateAndStoreDelegatorScores( uint72 identityId, uint256 epoch, uint256 activeProofPeriodStartBlock - ) private view returns (uint256) { + ) private { uint256 lastProofPeriodStartBlock = randomSamplingStorage.getHistoricalProofPeriodStartBlock( activeProofPeriodStartBlock, 1 From 3c06b702d003b986cff059af87e6adc984a1d16d Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 3 Apr 2025 16:12:54 +0200 Subject: [PATCH 020/106] Add abis --- abi/RandomSampling.json | 45 ++++++--- abi/RandomSamplingStorage.json | 174 +++++++++++++++++++++++++++++---- 2 files changed, 185 insertions(+), 34 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index 3abc8f74..dada2971 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -34,12 +34,6 @@ { "anonymous": false, "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "chainId", - "type": "uint256" - }, { "indexed": false, "internalType": "uint8", @@ -53,6 +47,18 @@ { "anonymous": false, "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "identityId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", @@ -66,7 +72,7 @@ "type": "uint256" }, { - "indexed": false, + "indexed": true, "internalType": "uint256", "name": "activeProofPeriodBlock", "type": "uint256" @@ -211,6 +217,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "delegatorsInfo", + "outputs": [ + { + "internalType": "contract DelegatorsInfo", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "epochStorage", @@ -251,13 +270,7 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint8", - "name": "_proofingPeriodDurationInBlocks", - "type": "uint8" - } - ], + "inputs": [], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", @@ -265,7 +278,7 @@ }, { "inputs": [], - "name": "kcs", + "name": "knowledgeCollectionStorage", "outputs": [ { "internalType": "contract KnowledgeCollectionStorage", @@ -304,7 +317,7 @@ }, { "inputs": [], - "name": "rss", + "name": "randomSamplingStorage", "outputs": [ { "internalType": "contract RandomSamplingStorage", diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json index 83befe44..5afa8e8a 100644 --- a/abi/RandomSamplingStorage.json +++ b/abi/RandomSamplingStorage.json @@ -5,11 +5,27 @@ "internalType": "address", "name": "hubAddress", "type": "address" + }, + { + "internalType": "uint8", + "name": "_proofingPeriodDurationInBlocks", + "type": "uint8" } ], "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [ + { + "internalType": "string", + "name": "msg", + "type": "string" + } + ], + "name": "UnauthorizedAccess", + "type": "error" + }, { "inputs": [], "name": "ZeroAddressHub", @@ -29,16 +45,31 @@ "type": "function" }, { - "inputs": [], - "name": "activeProofPeriodStartBlock", - "outputs": [ + "inputs": [ { "internalType": "uint256", - "name": "", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "bytes32", + "name": "delegatorKey", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "score", "type": "uint256" } ], - "stateMutability": "view", + "name": "addToEpochNodeDelegatorScore", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { @@ -48,6 +79,11 @@ "name": "epoch", "type": "uint256" }, + { + "internalType": "uint256", + "name": "proofPeriodStartBlock", + "type": "uint256" + }, { "internalType": "uint72", "name": "identityId", @@ -59,20 +95,25 @@ "type": "uint256" } ], - "name": "addToEpochNodeTotalScore", + "name": "addToNodeScore", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, { "internalType": "uint256", "name": "", "type": "uint256" } ], - "name": "epochAllNodesTotalScore", + "name": "allNodesEpochProofPeriodScore", "outputs": [ { "internalType": "uint256", @@ -94,9 +135,14 @@ "internalType": "uint72", "name": "", "type": "uint72" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" } ], - "name": "epochNodeTotalScore", + "name": "epochNodeDelegatorScore", "outputs": [ { "internalType": "uint256", @@ -132,8 +178,19 @@ "type": "function" }, { - "inputs": [], - "name": "getActiveProofPeriodStartBlock", + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "proofPeriodStartBlock", + "type": "uint256" + } + ], + "name": "getEpochAllNodesProofPeriodScore", "outputs": [ { "internalType": "uint256", @@ -141,7 +198,7 @@ "type": "uint256" } ], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -150,9 +207,19 @@ "internalType": "uint256", "name": "epoch", "type": "uint256" + }, + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "bytes32", + "name": "delegatorKey", + "type": "bytes32" } ], - "name": "getEpochAllNodesTotalScore", + "name": "getEpochNodeDelegatorScore", "outputs": [ { "internalType": "uint256", @@ -176,7 +243,7 @@ "type": "uint72" } ], - "name": "getEpochNodeTotalScore", + "name": "getEpochNodeValidProofsCount", "outputs": [ { "internalType": "uint256", @@ -191,16 +258,16 @@ "inputs": [ { "internalType": "uint256", - "name": "epoch", + "name": "proofPeriodStartBlock", "type": "uint256" }, { - "internalType": "uint72", - "name": "identityId", - "type": "uint72" + "internalType": "uint256", + "name": "offset", + "type": "uint256" } ], - "name": "getEpochNodeValidProofsCount", + "name": "getHistoricalProofPeriodStartBlock", "outputs": [ { "internalType": "uint256", @@ -252,6 +319,35 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "proofPeriodStartBlock", + "type": "uint256" + } + ], + "name": "getNodeEpochProofPeriodScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "getProofingPeriodDurationInBlocks", @@ -309,6 +405,35 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "", + "type": "uint72" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "nodeEpochProofPeriodScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -409,6 +534,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "updateAndGetActiveProofPeriodStartBlock", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "version", From fcc11a7b437f331641a6dffd915ef26720e39474 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 3 Apr 2025 16:23:10 +0200 Subject: [PATCH 021/106] change computeMerkleRoot to internal --- contracts/RandomSampling.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index bd27770b..5caa81c1 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -97,7 +97,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { return challenge; } - function computeMerkleRoot(bytes32 chunk, bytes32[] memory merkleProof) public pure returns (bytes32) { + function _computeMerkleRoot(bytes32 chunk, bytes32[] memory merkleProof) internal pure returns (bytes32) { bytes32 computedHash = keccak256(abi.encodePacked(chunk)); for (uint256 i = 0; i < merkleProof.length; ) { @@ -131,7 +131,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { } // Construct the merkle root from chunk and merkleProof - bytes32 computedMerkleRoot = computeMerkleRoot(chunk, merkleProof); + bytes32 computedMerkleRoot = _computeMerkleRoot(chunk, merkleProof); // Get the expected merkle root for this challenge bytes32 expectedMerkleRoot = knowledgeCollectionStorage.getLatestMerkleRoot(challenge.knowledgeCollectionId); From b13a39d5e4ad974be9e287a88504bb3dc424ee0c Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 3 Apr 2025 16:52:50 +0200 Subject: [PATCH 022/106] Add isActiveProofPeriodStillValid and abis --- abi/RandomSampling.json | 24 --------------------- abi/RandomSamplingStorage.json | 13 +++++++++++ contracts/storage/RandomSamplingStorage.sol | 6 +++++- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index dada2971..4e84c421 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -158,30 +158,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "chunk", - "type": "bytes32" - }, - { - "internalType": "bytes32[]", - "name": "merkleProof", - "type": "bytes32[]" - } - ], - "name": "computeMerkleRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "pure", - "type": "function" - }, { "inputs": [], "name": "createChallenge", diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json index 5afa8e8a..a681661c 100644 --- a/abi/RandomSamplingStorage.json +++ b/abi/RandomSamplingStorage.json @@ -392,6 +392,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "isActiveProofPeriodStillValid", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "name", diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 9a147825..2089a292 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -40,13 +40,17 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { function updateAndGetActiveProofPeriodStartBlock() external returns (uint256) { if (block.number > activeProofPeriodStartBlock + proofingPeriodDurationInBlocks) { - uint256 newActiveBlock = block.number - (block.number % proofingPeriodDurationInBlocks); + uint256 newActiveBlock = block.number - (block.number % proofingPeriodDurationInBlocks) + 1; activeProofPeriodStartBlock = newActiveBlock; } return activeProofPeriodStartBlock; } + function isActiveProofPeriodStillValid() external view returns (bool) { + return block.number <= activeProofPeriodStartBlock + proofingPeriodDurationInBlocks; + } + function getHistoricalProofPeriodStartBlock( uint256 proofPeriodStartBlock, uint256 offset From 0f4b78e6416f06d4cc3ee13e5979b9fbd074c9d5 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 3 Apr 2025 17:06:20 +0200 Subject: [PATCH 023/106] Update Challenge struct --- abi/RandomSampling.json | 16 ++++++++++++++++ contracts/RandomSampling.sol | 18 ++++++++++++++---- contracts/libraries/RandomSamplingLib.sol | 2 ++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index 4e84c421..ad18b92a 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -76,6 +76,12 @@ "internalType": "uint256", "name": "activeProofPeriodBlock", "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "proofingPeriodDurationInBlocks", + "type": "uint256" } ], "name": "ChallengeCreated", @@ -174,11 +180,21 @@ "name": "chunkId", "type": "uint256" }, + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, { "internalType": "uint256", "name": "activeProofPeriodStartBlock", "type": "uint256" }, + { + "internalType": "uint256", + "name": "proofingPeriodDurationInBlocks", + "type": "uint256" + }, { "internalType": "bool", "name": "solved", diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 5caa81c1..9aef3916 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -38,7 +38,8 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { uint256 indexed epoch, uint256 knowledgeCollectionId, uint256 chunkId, - uint256 indexed activeProofPeriodBlock + uint256 indexed activeProofPeriodBlock, + uint256 proofingPeriodDurationInBlocks ); event ValidProofSubmitted(uint72 indexed identityId, uint256 indexed epoch, uint256 score); event AvgBlockTimeUpdated(uint8 avgBlockTimeInSeconds); @@ -79,7 +80,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { ) { // If node has already solved the challenge for this period, return an empty challenge if (nodeChallenge.solved == true) { - return RandomSamplingLib.Challenge(0, 0, 0, false); + return RandomSamplingLib.Challenge(0, 0, 0, 0, 0, false); } // If the challenge for this node exists but has not been solved yet, return the existing challenge @@ -275,10 +276,19 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { chronos.getCurrentEpoch(), knowledgeCollectionId, chunkId, - activeProofPeriodStartBlock + activeProofPeriodStartBlock, + randomSamplingStorage.getProofingPeriodDurationInBlocks() ); - return RandomSamplingLib.Challenge(knowledgeCollectionId, chunkId, activeProofPeriodStartBlock, false); + return + RandomSamplingLib.Challenge( + knowledgeCollectionId, + chunkId, + chronos.getCurrentEpoch(), + activeProofPeriodStartBlock, + randomSamplingStorage.getProofingPeriodDurationInBlocks(), + false + ); } // get rewards amount diff --git a/contracts/libraries/RandomSamplingLib.sol b/contracts/libraries/RandomSamplingLib.sol index dac8e059..894c3e2f 100644 --- a/contracts/libraries/RandomSamplingLib.sol +++ b/contracts/libraries/RandomSamplingLib.sol @@ -6,7 +6,9 @@ library RandomSamplingLib { struct Challenge { uint256 knowledgeCollectionId; uint256 chunkId; // TODO:Smaller data structure + uint256 epoch; uint256 activeProofPeriodStartBlock; + uint256 proofingPeriodDurationInBlocks; bool solved; } } From ad09adc27815321fb85270ad5b5150631e3da1d4 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 3 Apr 2025 17:06:42 +0200 Subject: [PATCH 024/106] Update proofingPeriodDurationInBlocks data type --- abi/RandomSamplingStorage.json | 46 +++++++++++++++++---- contracts/storage/RandomSamplingStorage.sol | 8 ++-- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json index a681661c..223d3a29 100644 --- a/abi/RandomSamplingStorage.json +++ b/abi/RandomSamplingStorage.json @@ -7,9 +7,9 @@ "type": "address" }, { - "internalType": "uint8", + "internalType": "uint16", "name": "_proofingPeriodDurationInBlocks", - "type": "uint8" + "type": "uint16" } ], "stateMutability": "nonpayable", @@ -300,11 +300,21 @@ "name": "chunkId", "type": "uint256" }, + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, { "internalType": "uint256", "name": "activeProofPeriodStartBlock", "type": "uint256" }, + { + "internalType": "uint256", + "name": "proofingPeriodDurationInBlocks", + "type": "uint256" + }, { "internalType": "bool", "name": "solved", @@ -353,9 +363,9 @@ "name": "getProofingPeriodDurationInBlocks", "outputs": [ { - "internalType": "uint8", + "internalType": "uint16", "name": "", - "type": "uint8" + "type": "uint16" } ], "stateMutability": "view", @@ -467,11 +477,21 @@ "name": "chunkId", "type": "uint256" }, + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, { "internalType": "uint256", "name": "activeProofPeriodStartBlock", "type": "uint256" }, + { + "internalType": "uint256", + "name": "proofingPeriodDurationInBlocks", + "type": "uint256" + }, { "internalType": "bool", "name": "solved", @@ -486,9 +506,9 @@ "name": "proofingPeriodDurationInBlocks", "outputs": [ { - "internalType": "uint8", + "internalType": "uint16", "name": "", - "type": "uint8" + "type": "uint16" } ], "stateMutability": "view", @@ -513,11 +533,21 @@ "name": "chunkId", "type": "uint256" }, + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, { "internalType": "uint256", "name": "activeProofPeriodStartBlock", "type": "uint256" }, + { + "internalType": "uint256", + "name": "proofingPeriodDurationInBlocks", + "type": "uint256" + }, { "internalType": "bool", "name": "solved", @@ -537,9 +567,9 @@ { "inputs": [ { - "internalType": "uint8", + "internalType": "uint16", "name": "durationInBlocks", - "type": "uint8" + "type": "uint16" } ], "name": "setProofingPeriodDurationInBlocks", diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 2089a292..128f613f 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -12,7 +12,7 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { string private constant _VERSION = "1.0.0"; uint8 public constant CHUNK_BYTE_SIZE = 32; - uint8 public proofingPeriodDurationInBlocks; + uint16 public proofingPeriodDurationInBlocks; uint256 private activeProofPeriodStartBlock; // identityId => Challenge - used in proof to verify the challenge is within proofing period @@ -26,7 +26,7 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { // epoch => identityId => delegatorKey => score mapping(uint256 => mapping(uint72 => mapping(bytes32 => uint256))) public epochNodeDelegatorScore; - constructor(address hubAddress, uint8 _proofingPeriodDurationInBlocks) HubDependent(hubAddress) { + constructor(address hubAddress, uint16 _proofingPeriodDurationInBlocks) HubDependent(hubAddress) { proofingPeriodDurationInBlocks = _proofingPeriodDurationInBlocks; } @@ -61,11 +61,11 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { return proofPeriodStartBlock - (offset * proofingPeriodDurationInBlocks); } - function getProofingPeriodDurationInBlocks() external view returns (uint8) { + function getProofingPeriodDurationInBlocks() external view returns (uint16) { return proofingPeriodDurationInBlocks; } - function setProofingPeriodDurationInBlocks(uint8 durationInBlocks) external onlyContracts { + function setProofingPeriodDurationInBlocks(uint16 durationInBlocks) external onlyContracts { require(durationInBlocks > 0, "Duration in blocks must be greater than 0"); proofingPeriodDurationInBlocks = durationInBlocks; } From da94a6f71ef2c948e1c8146cfbec032fb5d17e79 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 3 Apr 2025 17:19:49 +0200 Subject: [PATCH 025/106] Add ProofPeriodStatus struct --- contracts/libraries/RandomSamplingLib.sol | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contracts/libraries/RandomSamplingLib.sol b/contracts/libraries/RandomSamplingLib.sol index 894c3e2f..fdb10097 100644 --- a/contracts/libraries/RandomSamplingLib.sol +++ b/contracts/libraries/RandomSamplingLib.sol @@ -11,4 +11,9 @@ library RandomSamplingLib { uint256 proofingPeriodDurationInBlocks; bool solved; } + + struct ProofPeriodStatus { + uint256 activeProofPeriodStartBlock; + bool isValid; + } } From bd2a5bcecfbd962700a151b62c5b88acca603cf9 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 3 Apr 2025 17:20:20 +0200 Subject: [PATCH 026/106] Add getActiveProofPeriodStatus --- abi/RandomSamplingStorage.json | 38 ++++++++++++++------- contracts/storage/RandomSamplingStorage.sol | 8 +++-- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json index 223d3a29..548f61ce 100644 --- a/abi/RandomSamplingStorage.json +++ b/abi/RandomSamplingStorage.json @@ -177,6 +177,31 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getActiveProofPeriodStatus", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "activeProofPeriodStartBlock", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isValid", + "type": "bool" + } + ], + "internalType": "struct RandomSamplingLib.ProofPeriodStatus", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -402,19 +427,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "isActiveProofPeriodStillValid", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "name", diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 128f613f..f841fddc 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -47,8 +47,12 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { return activeProofPeriodStartBlock; } - function isActiveProofPeriodStillValid() external view returns (bool) { - return block.number <= activeProofPeriodStartBlock + proofingPeriodDurationInBlocks; + function getActiveProofPeriodStatus() external view returns (RandomSamplingLib.ProofPeriodStatus memory) { + return + RandomSamplingLib.ProofPeriodStatus( + activeProofPeriodStartBlock, + block.number <= activeProofPeriodStartBlock + proofingPeriodDurationInBlocks + ); } function getHistoricalProofPeriodStartBlock( From 67aaf41747bda1ff40a0cf89ba221b805febdc0e Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 4 Apr 2025 09:49:05 +0200 Subject: [PATCH 027/106] fix nodeAskFactor prefix in rewards calculation --- contracts/RandomSampling.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 9aef3916..d7d27b82 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -205,7 +205,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { uint256 pubRatio = (nodePubFactor * SCALING_FACTOR) / maxNodePubFactor; uint256 nodePublishingFactor = (nodeStakeFactor * pubRatio) / SCALING_FACTOR; - return nodeStakeFactor + nodePublishingFactor - nodeAskFactor; + return nodeStakeFactor + nodePublishingFactor + nodeAskFactor; } function _calculateAndStoreDelegatorScores( From af463840fb916bbfbeba4382e319f1f76d65f51d Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 4 Apr 2025 12:19:54 +0200 Subject: [PATCH 028/106] fix getting kcStorage and epochStorage --- contracts/RandomSampling.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index d7d27b82..9bd1afa3 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -52,10 +52,12 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { function initialize() external { identityStorage = IdentityStorage(hub.getContractAddress("IdentityStorage")); randomSamplingStorage = RandomSamplingStorage(hub.getContractAddress("RandomSamplingStorage")); - knowledgeCollectionStorage = KnowledgeCollectionStorage(hub.getContractAddress("KnowledgeCollectionStorage")); + knowledgeCollectionStorage = KnowledgeCollectionStorage( + hub.getAssetStorageAddress("KnowledgeCollectionStorage") + ); stakingStorage = StakingStorage(hub.getContractAddress("StakingStorage")); profileStorage = ProfileStorage(hub.getContractAddress("ProfileStorage")); - epochStorage = EpochStorage(hub.getContractAddress("EpochStorage")); + epochStorage = EpochStorage(hub.getContractAddress("EpochStorageV8")); chronos = Chronos(hub.getContractAddress("Chronos")); askStorage = AskStorage(hub.getContractAddress("AskStorage")); delegatorsInfo = DelegatorsInfo(hub.getContractAddress("DelegatorsInfo")); From a36c99366cb119683fdae2fb3e656427f7d399da Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 4 Apr 2025 12:20:21 +0200 Subject: [PATCH 029/106] fix activeProofPeriodStartBlock calculation in updateAndGetActiveProofPeriodStartBlock --- contracts/storage/RandomSamplingStorage.sol | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index f841fddc..baec1ccb 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -40,8 +40,15 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { function updateAndGetActiveProofPeriodStartBlock() external returns (uint256) { if (block.number > activeProofPeriodStartBlock + proofingPeriodDurationInBlocks) { - uint256 newActiveBlock = block.number - (block.number % proofingPeriodDurationInBlocks) + 1; - activeProofPeriodStartBlock = newActiveBlock; + // Calculate how many complete periods have passed since the last active period started + uint256 blocksSinceLastStart = block.number - activeProofPeriodStartBlock; + uint256 completePeriodsPassed = blocksSinceLastStart / (proofingPeriodDurationInBlocks + 1); + + // The +1 ensures there's always a block gap between periods + activeProofPeriodStartBlock = + activeProofPeriodStartBlock + + completePeriodsPassed * + (proofingPeriodDurationInBlocks + 1); } return activeProofPeriodStartBlock; From 465f0adbada6d15e9d008bd4a1c750c1dd3ce913 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 4 Apr 2025 12:20:41 +0200 Subject: [PATCH 030/106] Add deployment scripts --- deploy/030_deploy_random_sampling_storage.ts | 19 ++++++++++++++ deploy/031_deploy_random_sampling.ts | 27 ++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 deploy/030_deploy_random_sampling_storage.ts create mode 100644 deploy/031_deploy_random_sampling.ts diff --git a/deploy/030_deploy_random_sampling_storage.ts b/deploy/030_deploy_random_sampling_storage.ts new file mode 100644 index 00000000..06f9108b --- /dev/null +++ b/deploy/030_deploy_random_sampling_storage.ts @@ -0,0 +1,19 @@ +import { HardhatRuntimeEnvironment } from 'hardhat/types'; +import { DeployFunction } from 'hardhat-deploy/types'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const randomSamplingStorageParametersConfig = + hre.helpers.parametersConfig[hre.network.config.environment] + .RandomSamplingStorage; + + await hre.helpers.deploy({ + newContractName: 'RandomSamplingStorage', + additionalArgs: [ + randomSamplingStorageParametersConfig.proofingPeriodDurationInBlocks, + ], + }); +}; + +export default func; +func.tags = ['RandomSamplingStorage']; +func.dependencies = ['Hub']; diff --git a/deploy/031_deploy_random_sampling.ts b/deploy/031_deploy_random_sampling.ts new file mode 100644 index 00000000..543b3d00 --- /dev/null +++ b/deploy/031_deploy_random_sampling.ts @@ -0,0 +1,27 @@ +import { HardhatRuntimeEnvironment } from 'hardhat/types'; +import { DeployFunction } from 'hardhat-deploy/types'; + +const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { + const randomSamplingParametersConfig = + hre.helpers.parametersConfig[hre.network.config.environment].RandomSampling; + + await hre.helpers.deploy({ + newContractName: 'RandomSampling', + additionalArgs: [randomSamplingParametersConfig.avgBlockTimeInSeconds], + }); +}; + +export default func; +func.tags = ['RandomSampling']; +func.dependencies = [ + 'Hub', + 'Chronos', + 'RandomSamplingStorage', + 'StakingStorage', + 'ProfileStorage', + 'EpochStorageV8', + 'AskStorage', + 'DelegatorsInfo', + 'KnowledgeCollectionStorage', + 'IdentityStorage', +]; From 918674277c7f664b7338a45d76f57c6a422ce2e2 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 4 Apr 2025 12:20:57 +0200 Subject: [PATCH 031/106] Add development params --- deployments/parameters.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/deployments/parameters.json b/deployments/parameters.json index ca9cdb6c..41aa2156 100644 --- a/deployments/parameters.json +++ b/deployments/parameters.json @@ -17,6 +17,12 @@ "KnowledgeCollectionStorage": { "knowledgeCollectionSize": "1000000", "uriBase": "did:dkg" + }, + "RandomSampling": { + "avgBlockTimeInSeconds": "1" + }, + "RandomSamplingStorage": { + "proofingPeriodDurationInBlocks": "100" } }, "devnet": { From 16314f82b6cca69dbf03b802c4a849eaac8d2d70 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 4 Apr 2025 14:41:43 +0200 Subject: [PATCH 032/106] fix knowledgeCollectionId calculation --- contracts/RandomSampling.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 9bd1afa3..2b8d01db 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -265,8 +265,8 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { ) ); - uint256 knowledgeCollectionId = uint256(pseudoRandomVariable) % - knowledgeCollectionStorage.getLatestKnowledgeCollectionId(); + uint256 knowledgeCollectionId = (uint256(pseudoRandomVariable) % + knowledgeCollectionStorage.getLatestKnowledgeCollectionId()) + 1; uint88 chunksCount = knowledgeCollectionStorage.getKnowledgeCollection(knowledgeCollectionId).byteSize / randomSamplingStorage.CHUNK_BYTE_SIZE(); From abc26580c4447457df2b4f0b655ef5eca62384ec Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 4 Apr 2025 14:58:59 +0200 Subject: [PATCH 033/106] Allow only active KCs to be included in a challenge --- contracts/RandomSampling.sol | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 2b8d01db..0e2cd8fd 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -264,9 +264,26 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { uint8(1) // sector = 1 by default ) ); + uint256 knowledgeCollectionId = 0; + for (uint8 i = 0; i < 50; ) { + knowledgeCollectionId = + (uint256(pseudoRandomVariable) % knowledgeCollectionStorage.getLatestKnowledgeCollectionId()) + + 1; + + if (chronos.getCurrentEpoch() <= knowledgeCollectionStorage.getEndEpoch(knowledgeCollectionId)) { + break; + } + + if (i == 49) { + revert("Failed to find a knowledge collection that is active in the current epoch"); + } + + pseudoRandomVariable = keccak256(abi.encodePacked(pseudoRandomVariable)); - uint256 knowledgeCollectionId = (uint256(pseudoRandomVariable) % - knowledgeCollectionStorage.getLatestKnowledgeCollectionId()) + 1; + unchecked { + i++; + } + } uint88 chunksCount = knowledgeCollectionStorage.getKnowledgeCollection(knowledgeCollectionId).byteSize / randomSamplingStorage.CHUNK_BYTE_SIZE(); From 0d0370625ce62df49f6db1721ede55d750952ad3 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 4 Apr 2025 15:16:49 +0200 Subject: [PATCH 034/106] Add max stake limiter --- abi/RandomSampling.json | 13 +++++++++++++ contracts/RandomSampling.sol | 6 +++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index ad18b92a..2eae6a42 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -294,6 +294,19 @@ "stateMutability": "pure", "type": "function" }, + { + "inputs": [], + "name": "parametersStorage", + "outputs": [ + { + "internalType": "contract ParametersStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "profileStorage", diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 0e2cd8fd..ab974eb2 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -16,6 +16,7 @@ import {EpochStorage} from "./storage/EpochStorage.sol"; import {Chronos} from "./storage/Chronos.sol"; import {AskStorage} from "./storage/AskStorage.sol"; import {DelegatorsInfo} from "./storage/DelegatorsInfo.sol"; +import {ParametersStorage} from "./storage/ParametersStorage.sol"; contract RandomSampling is INamed, IVersioned, ContractStatus { string private constant _NAME = "RandomSampling"; @@ -32,7 +33,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { Chronos public chronos; AskStorage public askStorage; DelegatorsInfo public delegatorsInfo; - + ParametersStorage public parametersStorage; event ChallengeCreated( uint256 indexed identityId, uint256 indexed epoch, @@ -61,6 +62,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { chronos = Chronos(hub.getContractAddress("Chronos")); askStorage = AskStorage(hub.getContractAddress("AskStorage")); delegatorsInfo = DelegatorsInfo(hub.getContractAddress("DelegatorsInfo")); + parametersStorage = ParametersStorage(hub.getContractAddress("ParametersStorage")); } function name() external pure virtual override returns (string memory) { @@ -179,7 +181,9 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { function _calculateNodeScore(uint72 identityId) private view returns (uint256) { // 1. Node stake factor calculation // Formula: nodeStakeFactor = 2 * (nodeStake / 2,000,000)^2 + uint96 maximumStake = parametersStorage.maximumStake(); uint256 nodeStake = stakingStorage.getNodeStake(identityId); + nodeStake = nodeStake > maximumStake ? maximumStake : nodeStake; uint256 stakeRatio = nodeStake / 2000000; uint256 nodeStakeFactor = (2 * stakeRatio * stakeRatio) / SCALING_FACTOR; From c85fbbbc618c8846d2016ea76ba501beaeddf972 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 4 Apr 2025 15:24:03 +0200 Subject: [PATCH 035/106] fix getHistoricalProofPeriodStartBlock --- contracts/storage/RandomSamplingStorage.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index baec1ccb..26063551 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -69,7 +69,7 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { require(proofPeriodStartBlock > 0, "Proof period start block must be greater than 0"); require(proofPeriodStartBlock % proofingPeriodDurationInBlocks == 0, "Proof period start block is not valid"); require(offset > 0, "Offset must be greater than 0"); - return proofPeriodStartBlock - (offset * proofingPeriodDurationInBlocks); + return proofPeriodStartBlock - (offset * (proofingPeriodDurationInBlocks + 1)); } function getProofingPeriodDurationInBlocks() external view returns (uint16) { From 19d7c98e0c6c769451886f8449771bd9748e3cd6 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 4 Apr 2025 15:41:15 +0200 Subject: [PATCH 036/106] Gas optimizations in _generateChallenge --- contracts/RandomSampling.sol | 8 ++++---- contracts/storage/RandomSamplingStorage.sol | 5 ++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index ab974eb2..c84af204 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -269,12 +269,12 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { ) ); uint256 knowledgeCollectionId = 0; + uint256 knowledgeCollectionsCount = knowledgeCollectionStorage.getLatestKnowledgeCollectionId(); + uint256 currentEpoch = chronos.getCurrentEpoch(); for (uint8 i = 0; i < 50; ) { - knowledgeCollectionId = - (uint256(pseudoRandomVariable) % knowledgeCollectionStorage.getLatestKnowledgeCollectionId()) + - 1; + knowledgeCollectionId = (uint256(pseudoRandomVariable) % knowledgeCollectionsCount) + 1; - if (chronos.getCurrentEpoch() <= knowledgeCollectionStorage.getEndEpoch(knowledgeCollectionId)) { + if (currentEpoch <= knowledgeCollectionStorage.getEndEpoch(knowledgeCollectionId)) { break; } diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 26063551..b8956d57 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -67,7 +67,10 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { uint256 offset ) external view returns (uint256) { require(proofPeriodStartBlock > 0, "Proof period start block must be greater than 0"); - require(proofPeriodStartBlock % proofingPeriodDurationInBlocks == 0, "Proof period start block is not valid"); + require( + proofPeriodStartBlock % (proofingPeriodDurationInBlocks + 1) == 0, + "Proof period start block is not valid" + ); require(offset > 0, "Offset must be greater than 0"); return proofPeriodStartBlock - (offset * (proofingPeriodDurationInBlocks + 1)); } From b7c7826a6635f69f3af47b9e7a6f7b7185236011 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 4 Apr 2025 15:45:55 +0200 Subject: [PATCH 037/106] Add initial RS integration tests --- test/integration/RandomSampling.test.ts | 429 ++++++++++++++++++++++++ 1 file changed, 429 insertions(+) create mode 100644 test/integration/RandomSampling.test.ts diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts new file mode 100644 index 00000000..07b9df53 --- /dev/null +++ b/test/integration/RandomSampling.test.ts @@ -0,0 +1,429 @@ +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; +import { expect } from 'chai'; +import hre from 'hardhat'; + +import { + RandomSampling, + RandomSamplingStorage, + IdentityStorage, + StakingStorage, + KnowledgeCollectionStorage, + ProfileStorage, + EpochStorage, + Chronos, + AskStorage, + DelegatorsInfo, + Profile, + Hub, + Token, + KnowledgeCollection, + ParanetKnowledgeMinersRegistry, + ParanetKnowledgeCollectionsRegistry, +} from '../../typechain'; +import { createProfilesAndKC } from '../helpers/kc-helpers'; +import { createProfile } from '../helpers/profile-helpers'; +import { + getDefaultKCCreator, + getDefaultReceivingNodes, + getDefaultPublishingNode, +} from '../helpers/setup-helpers'; + +// Type definition for a Challenge +type Challenge = { + knowledgeCollectionId: bigint; + chunkId: bigint; + epoch: bigint; + activeProofPeriodStartBlock: bigint; + proofingPeriodDurationInBlocks: bigint; + solved: boolean; +}; + +// Fixture containing all contracts and accounts needed to test RandomSampling +type RandomSamplingFixture = { + accounts: SignerWithAddress[]; + RandomSampling: RandomSampling; + RandomSamplingStorage: RandomSamplingStorage; + IdentityStorage: IdentityStorage; + StakingStorage: StakingStorage; + KnowledgeCollectionStorage: KnowledgeCollectionStorage; + ProfileStorage: ProfileStorage; + EpochStorage: EpochStorage; + Chronos: Chronos; + AskStorage: AskStorage; + DelegatorsInfo: DelegatorsInfo; + Profile: Profile; + Hub: Hub; + KnowledgeCollection: KnowledgeCollection; + Token: Token; + ParanetKnowledgeMinersRegistry: ParanetKnowledgeMinersRegistry; + ParanetKnowledgeCollectionsRegistry: ParanetKnowledgeCollectionsRegistry; +}; + +describe('@integration RandomSampling', () => { + let accounts: SignerWithAddress[]; + let RandomSampling: RandomSampling; + let RandomSamplingStorage: RandomSamplingStorage; + let IdentityStorage: IdentityStorage; + let StakingStorage: StakingStorage; + let KnowledgeCollectionStorage: KnowledgeCollectionStorage; + let ProfileStorage: ProfileStorage; + let EpochStorage: EpochStorage; + let Chronos: Chronos; + let AskStorage: AskStorage; + let DelegatorsInfo: DelegatorsInfo; + let Profile: Profile; + let Hub: Hub; + let KnowledgeCollection: KnowledgeCollection; + let Token: Token; + let ParanetKnowledgeMinersRegistry: ParanetKnowledgeMinersRegistry; + let ParanetKnowledgeCollectionsRegistry: ParanetKnowledgeCollectionsRegistry; + + // Sample values for tests + const avgBlockTimeInSeconds = 1; // Average block time + + // Deploy all contracts, set the HubOwner and necessary accounts. Returns the RandomSamplingFixture + async function deployRandomSamplingFixture(): Promise { + await hre.deployments.fixture([ + 'KnowledgeCollection', + 'Token', + 'IdentityStorage', + 'StakingStorage', + 'ProfileStorage', + 'EpochStorage', + 'Chronos', + 'AskStorage', + 'DelegatorsInfo', + 'Profile', + 'RandomSamplingStorage', + 'RandomSampling', + 'ParanetKnowledgeMinersRegistry', + 'ParanetKnowledgeCollectionsRegistry', + ]); + + accounts = await hre.ethers.getSigners(); + Hub = await hre.ethers.getContract('Hub'); + + // Set hub owner + await Hub.setContractAddress('HubOwner', accounts[0].address); + + // Get contract instances + KnowledgeCollection = await hre.ethers.getContract( + 'KnowledgeCollection', + ); + Token = await hre.ethers.getContract('Token'); + ParanetKnowledgeMinersRegistry = + await hre.ethers.getContract( + 'ParanetKnowledgeMinersRegistry', + ); + ParanetKnowledgeCollectionsRegistry = + await hre.ethers.getContract( + 'ParanetKnowledgeCollectionsRegistry', + ); + IdentityStorage = + await hre.ethers.getContract('IdentityStorage'); + StakingStorage = + await hre.ethers.getContract('StakingStorage'); + KnowledgeCollectionStorage = + await hre.ethers.getContract( + 'KnowledgeCollectionStorage', + ); + ProfileStorage = + await hre.ethers.getContract('ProfileStorage'); + EpochStorage = await hre.ethers.getContract('EpochStorageV8'); + Chronos = await hre.ethers.getContract('Chronos'); + AskStorage = await hre.ethers.getContract('AskStorage'); + DelegatorsInfo = + await hre.ethers.getContract('DelegatorsInfo'); + Profile = await hre.ethers.getContract('Profile'); + + // Get RandomSampling contract after all others are registered + RandomSampling = + await hre.ethers.getContract('RandomSampling'); + RandomSamplingStorage = await hre.ethers.getContract( + 'RandomSamplingStorage', + ); + + // Now initialize RandomSampling manually if needed + // This might not be necessary if initialization happens automatically in the deployment + + return { + accounts, + RandomSampling, + RandomSamplingStorage, + IdentityStorage, + StakingStorage, + KnowledgeCollectionStorage, + ProfileStorage, + EpochStorage, + Chronos, + AskStorage, + DelegatorsInfo, + Profile, + Hub, + KnowledgeCollection, + Token, + ParanetKnowledgeMinersRegistry, + ParanetKnowledgeCollectionsRegistry, + }; + } + + // Before each test, deploy all contracts and necessary accounts. These variables can be used in the tests + beforeEach(async () => { + ({ + accounts, + IdentityStorage, + StakingStorage, + KnowledgeCollectionStorage, + ProfileStorage, + EpochStorage, + Chronos, + AskStorage, + DelegatorsInfo, + Profile, + Hub, + RandomSampling, + RandomSamplingStorage, + ParanetKnowledgeMinersRegistry, + ParanetKnowledgeCollectionsRegistry, + } = await loadFixture(deployRandomSamplingFixture)); + }); + + // Helper function to create a mock challenge + async function createMockChallenge(): Promise { + // Get all values as BigNumberish + const activeBlockTx = + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + await activeBlockTx.wait(); + + const activeBlockStatus = + await RandomSamplingStorage.getActiveProofPeriodStatus(); + const activeBlock = activeBlockStatus.activeProofPeriodStartBlock; + + const currentEpochTx = await Chronos.getCurrentEpoch(); + const currentEpoch = BigInt(currentEpochTx.toString()); + + const proofingPeriodDurationTx = + await RandomSamplingStorage.getProofingPeriodDurationInBlocks(); + const proofingPeriodDuration = BigInt(proofingPeriodDurationTx.toString()); + + const challenge: Challenge = { + knowledgeCollectionId: 1n, + chunkId: 1n, + epoch: currentEpoch, + activeProofPeriodStartBlock: activeBlock, + proofingPeriodDurationInBlocks: proofingPeriodDuration, + solved: true, + }; + + return challenge; + } + + describe('Contract Initialization', () => { + it('Should return the correct name and version of the RandomSampling contract', async () => { + const name = await RandomSampling.name(); + const version = await RandomSampling.version(); + expect(name).to.equal('RandomSampling'); + expect(version).to.equal('1.0.0'); + }); + + it('Should have the correct avgBlockTimeInSeconds after initialization', async () => { + const avgBlockTime = await RandomSampling.avgBlockTimeInSeconds(); + expect(avgBlockTime).to.equal(avgBlockTimeInSeconds); + }); + + it('Should successfully initialize with all dependent contracts', async () => { + // Verify that all contract references are set correctly + expect(await RandomSampling.identityStorage()).to.equal( + await IdentityStorage.getAddress(), + ); + expect(await RandomSampling.randomSamplingStorage()).to.equal( + await RandomSamplingStorage.getAddress(), + ); + expect(await RandomSampling.knowledgeCollectionStorage()).to.equal( + await KnowledgeCollectionStorage.getAddress(), + ); + expect(await RandomSampling.stakingStorage()).to.equal( + await StakingStorage.getAddress(), + ); + expect(await RandomSampling.profileStorage()).to.equal( + await ProfileStorage.getAddress(), + ); + expect(await RandomSampling.epochStorage()).to.equal( + await EpochStorage.getAddress(), + ); + expect(await RandomSampling.chronos()).to.equal( + await Chronos.getAddress(), + ); + expect(await RandomSampling.askStorage()).to.equal( + await AskStorage.getAddress(), + ); + expect(await RandomSampling.delegatorsInfo()).to.equal( + await DelegatorsInfo.getAddress(), + ); + }); + }); + + describe('Proofing Period Management', () => { + it('Should return the correct proofing period status', async () => { + const status = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(status.activeProofPeriodStartBlock).to.be.a('bigint'); + expect(status.isValid).to.be.a('boolean'); + }); + + it('Should update activeProofPeriodStartBlock when period expires', async () => { + // Get initial active proof period using a view function + const initialTx = + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + await initialTx.wait(); + + const initialStatus = + await RandomSamplingStorage.getActiveProofPeriodStatus(); + const initialPeriodStartBlock = initialStatus.activeProofPeriodStartBlock; + + const currentBlock = await hre.ethers.provider.getBlockNumber(); + const diff = currentBlock - Number(initialPeriodStartBlock); + + // Mine blocks to pass the proofing period + const proofingPeriodDuration = + await RandomSamplingStorage.getProofingPeriodDurationInBlocks(); + const blocksToMine = Number(proofingPeriodDuration) + 1 - diff; + + for (let i = 0; i < blocksToMine; i++) { + await hre.network.provider.send('evm_mine'); + } + + // Update and get the new active proof period + const tx = + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + await tx.wait(); + + const statusAfterUpdate = + await RandomSamplingStorage.getActiveProofPeriodStatus(); + const newPeriodStartBlock = statusAfterUpdate.activeProofPeriodStartBlock; + + // The new period should be different from the initial one + expect(newPeriodStartBlock).to.be.greaterThan(initialPeriodStartBlock); + expect(newPeriodStartBlock).to.be.equal( + initialPeriodStartBlock + BigInt(proofingPeriodDuration) + 1n, + ); + }); + }); + + describe('Challenge Creation and Proof Submission', () => { + it('Should create a challenge for a node', async () => { + const kcCreator = getDefaultKCCreator(accounts); + const publishingNode = getDefaultPublishingNode(accounts); + const receivingNodes = getDefaultReceivingNodes(accounts); + + // Create profiles and KC first + const { publishingNodeIdentityId } = await createProfilesAndKC( + kcCreator, + publishingNode, + receivingNodes, + { + Profile, + KnowledgeCollection, + Token, + }, + ); + + // Update and get the new active proof period + const tx = + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + await tx.wait(); + + const proofPeriodStatus = + await RandomSamplingStorage.getActiveProofPeriodStatus(); + const proofPeriodStartBlock = + proofPeriodStatus.activeProofPeriodStartBlock; + // Create challenge + const challengeTx = await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + await challengeTx.wait(); + + // Get the challenge from storage to verify it + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + const proofPeriodDuration = + await RandomSamplingStorage.getProofingPeriodDurationInBlocks(); + + // Verify challenge properties + expect(challenge.knowledgeCollectionId).to.be.a('bigint'); + expect(challenge.chunkId).to.be.a('bigint'); + expect(challenge.epoch).to.be.a('bigint'); + expect(challenge.activeProofPeriodStartBlock).to.be.a('bigint'); + expect(challenge.proofingPeriodDurationInBlocks).to.be.a('bigint'); + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(challenge.solved).to.be.false; + + expect(challenge.knowledgeCollectionId).to.be.equal(1n); + expect(challenge.epoch).to.be.equal(1n); + expect(challenge.activeProofPeriodStartBlock).to.be.equal( + proofPeriodStartBlock, + ); + expect(challenge.proofingPeriodDurationInBlocks).to.be.equal( + proofPeriodDuration, + ); + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(challenge.solved).to.be.false; + }); + + it('Should return an empty challenge if already solved for current period', async () => { + // Create profile and identity first + const publishingNode = getDefaultPublishingNode(accounts); + const { identityId } = await createProfile(Profile, publishingNode); + + // Create a mock challenge that's marked as solved + const mockChallenge = await createMockChallenge(); + + // Store the mock challenge in the storage contract + await RandomSamplingStorage.setNodeChallenge(identityId, mockChallenge); + + // Try to create a new challenge for the same period + const challengeTx = await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + await challengeTx.wait(); + + // Get the challenge from the transaction return value + const challenge = + await RandomSamplingStorage.getNodeChallenge(identityId); + + // Since the challenge was solved, the challenge should still be marked as solved + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(challenge.solved).to.be.true; + }); + + // TODO: Should submit a valid proof successfully + }); + + describe('Score Calculation', () => { + // TODO: Should calculate node scores correctly upon valid proof submission + // TODO: Should calculate delegator scores correctly + }); + + describe('Admin Functions', () => { + it('Should allow only hub owner to update average block time', async () => { + const newAvgBlockTime = 15; + + // Non-hub owner should fail + await expect( + RandomSampling.connect(accounts[1]).setAvgBlockTimeInSeconds( + newAvgBlockTime, + ), + ).to.be.reverted; + + // Hub owner should succeed + await RandomSampling.connect(accounts[0]).setAvgBlockTimeInSeconds( + newAvgBlockTime, + ); + expect(await RandomSampling.avgBlockTimeInSeconds()).to.equal( + newAvgBlockTime, + ); + }); + }); +}); From afc85fc6875c64ea5973c630628db40fab36f74a Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 8 Apr 2025 12:36:36 +0200 Subject: [PATCH 038/106] Add delay when setting new getActiveProofingPeriodDurationInBlocks --- contracts/RandomSampling.sol | 69 +++++++++++--- contracts/libraries/RandomSamplingLib.sol | 5 ++ contracts/storage/RandomSamplingStorage.sol | 99 ++++++++++++++++++--- 3 files changed, 148 insertions(+), 25 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index c84af204..7a625e64 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -17,12 +17,15 @@ import {Chronos} from "./storage/Chronos.sol"; import {AskStorage} from "./storage/AskStorage.sol"; import {DelegatorsInfo} from "./storage/DelegatorsInfo.sol"; import {ParametersStorage} from "./storage/ParametersStorage.sol"; +import {ShardingTableStorage} from "./storage/ShardingTableStorage.sol"; contract RandomSampling is INamed, IVersioned, ContractStatus { string private constant _NAME = "RandomSampling"; string private constant _VERSION = "1.0.0"; uint256 SCALING_FACTOR = 1e18; uint8 public avgBlockTimeInSeconds; + uint256 public W1; + uint256 public W2; IdentityStorage public identityStorage; RandomSamplingStorage public randomSamplingStorage; @@ -34,6 +37,8 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { AskStorage public askStorage; DelegatorsInfo public delegatorsInfo; ParametersStorage public parametersStorage; + ShardingTableStorage public shardingTableStorage; + event ChallengeCreated( uint256 indexed identityId, uint256 indexed epoch, @@ -46,8 +51,10 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { event AvgBlockTimeUpdated(uint8 avgBlockTimeInSeconds); event ProofingPeriodDurationInBlocksUpdated(uint8 durationInBlocks); - constructor(address hubAddress, uint8 _avgBlockTimeInSeconds) ContractStatus(hubAddress) { + constructor(address hubAddress, uint8 _avgBlockTimeInSeconds, uint256 _W1, uint256 _W2) ContractStatus(hubAddress) { avgBlockTimeInSeconds = _avgBlockTimeInSeconds; + W1 = _W1; + W2 = _W2; } function initialize() external { @@ -63,6 +70,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { askStorage = AskStorage(hub.getContractAddress("AskStorage")); delegatorsInfo = DelegatorsInfo(hub.getContractAddress("DelegatorsInfo")); parametersStorage = ParametersStorage(hub.getContractAddress("ParametersStorage")); + shardingTableStorage = ShardingTableStorage(hub.getContractAddress("ShardingTableStorage")); } function name() external pure virtual override returns (string memory) { @@ -73,6 +81,28 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { return _VERSION; } + function setW1(uint256 _W1) external onlyHubOwner { + W1 = _W1; + } + + function setW2(uint256 _W2) external onlyHubOwner { + W2 = _W2; + } + + function setProofingPeriodDurationInBlocks(uint16 durationInBlocks) external onlyContracts { + require(durationInBlocks > 0, "Duration in blocks must be greater than 0"); + + // Calculate the effective epoch (current epoch + delay) + uint256 effectiveEpoch = chronos.getCurrentEpoch() + 1; + + // Check if there's a pending change + if (randomSamplingStorage.isPendingProofingPeriodDuration()) { + randomSamplingStorage.replacePendingProofingPeriodDuration(durationInBlocks, effectiveEpoch); + } else { + randomSamplingStorage.addProofingPeriodDuration(durationInBlocks, effectiveEpoch); + } + } + function createChallenge() external returns (RandomSamplingLib.Challenge memory) { // identityId uint72 identityId = identityStorage.getIdentityId(msg.sender); @@ -165,14 +195,6 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { return false; } - function getAllExpectedEpochProofsCount() internal view returns (uint256) { - uint256 allNodesCount = identityStorage.lastIdentityId(); - uint256 epochLengthInSeconds = chronos.epochLength(); - uint256 maxPossibleNodeProofsInEpoch = epochLengthInSeconds / - (randomSamplingStorage.getProofingPeriodDurationInBlocks() * avgBlockTimeInSeconds); - return allNodesCount * maxPossibleNodeProofsInEpoch; - } - function setAvgBlockTimeInSeconds(uint8 blockTimeInSeconds) external onlyHubOwner { avgBlockTimeInSeconds = blockTimeInSeconds; emit AvgBlockTimeUpdated(blockTimeInSeconds); @@ -300,7 +322,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { knowledgeCollectionId, chunkId, activeProofPeriodStartBlock, - randomSamplingStorage.getProofingPeriodDurationInBlocks() + randomSamplingStorage.getActiveProofingPeriodDurationInBlocks() ); return @@ -309,12 +331,37 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { chunkId, chronos.getCurrentEpoch(), activeProofPeriodStartBlock, - randomSamplingStorage.getProofingPeriodDurationInBlocks(), + randomSamplingStorage.getActiveProofingPeriodDurationInBlocks(), false ); } // get rewards amount + function getDelegatorEpochRewardsAmount(uint72 identityId, uint256 epoch) public view returns (uint256) { + require(chronos.getCurrentEpoch() > epoch, "Epoch is not over yet"); + + uint256 epochNodeValidProofsCount = randomSamplingStorage.getEpochNodeValidProofsCount(epoch, identityId); + + uint256 proofingPeriodDurationInBlocks = randomSamplingStorage.getEpochProofingPeriodDurationInBlocks(epoch); + uint256 maxNodeProofsInEpoch = chronos.epochLength() / (proofingPeriodDurationInBlocks * avgBlockTimeInSeconds); + + uint256 allExpectedEpochProofsCount = shardingTableStorage.nodesCount() * maxNodeProofsInEpoch; + + bytes32 delegatorKey = keccak256(abi.encodePacked(msg.sender)); + uint256 epochNodeDelegatorScore = randomSamplingStorage.getEpochNodeDelegatorScore( + epoch, + identityId, + delegatorKey + ); + + uint256 totalEpochTracFees = epochStorage.getEpochPool(1, epoch); + + uint256 reward = ((totalEpochTracFees / 2) * + (W1 * (epochNodeValidProofsCount / allExpectedEpochProofsCount) + W2 * epochNodeDelegatorScore)) / + SCALING_FACTOR ** 2; + + return reward; + } // claim rewards } diff --git a/contracts/libraries/RandomSamplingLib.sol b/contracts/libraries/RandomSamplingLib.sol index fdb10097..a3a14db2 100644 --- a/contracts/libraries/RandomSamplingLib.sol +++ b/contracts/libraries/RandomSamplingLib.sol @@ -16,4 +16,9 @@ library RandomSamplingLib { uint256 activeProofPeriodStartBlock; bool isValid; } + + struct ProofingPeriodDuration { + uint16 durationInBlocks; + uint256 effectiveEpoch; // When this duration takes effect (by epoch instead of timestamp) + } } diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index b8956d57..c87512ee 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -4,15 +4,18 @@ pragma solidity ^0.8.20; import {INamed} from "../interfaces/INamed.sol"; import {IVersioned} from "../interfaces/IVersioned.sol"; +import {IInitializable} from "../interfaces/IInitializable.sol"; import {RandomSamplingLib} from "../libraries/RandomSamplingLib.sol"; import {HubDependent} from "../abstract/HubDependent.sol"; +import {Chronos} from "../storage/Chronos.sol"; -contract RandomSamplingStorage is INamed, IVersioned, HubDependent { +contract RandomSamplingStorage is INamed, IVersioned, IInitializable, HubDependent { string private constant _NAME = "RandomSamplingStorage"; string private constant _VERSION = "1.0.0"; uint8 public constant CHUNK_BYTE_SIZE = 32; + Chronos public chronos; - uint16 public proofingPeriodDurationInBlocks; + RandomSamplingLib.ProofingPeriodDuration[] public proofingPeriodDurations; uint256 private activeProofPeriodStartBlock; // identityId => Challenge - used in proof to verify the challenge is within proofing period @@ -26,8 +29,29 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { // epoch => identityId => delegatorKey => score mapping(uint256 => mapping(uint72 => mapping(bytes32 => uint256))) public epochNodeDelegatorScore; + event ProofingPeriodDurationAdded(uint16 durationInBlocks, uint256 effectiveEpoch); + event PendingProofingPeriodDurationReplaced( + uint16 oldDurationInBlocks, + uint16 newDurationInBlocks, + uint256 effectiveEpoch + ); + constructor(address hubAddress, uint16 _proofingPeriodDurationInBlocks) HubDependent(hubAddress) { - proofingPeriodDurationInBlocks = _proofingPeriodDurationInBlocks; + proofingPeriodDurations.push( + RandomSamplingLib.ProofingPeriodDuration({ + durationInBlocks: _proofingPeriodDurationInBlocks, + effectiveEpoch: 0 + }) + ); + } + + function initialize() public onlyHub { + chronos = Chronos(hub.getContractAddress("Chronos")); + // update the last proofing period duration with the current epoch + proofingPeriodDurations[proofingPeriodDurations.length - 1] = RandomSamplingLib.ProofingPeriodDuration({ + durationInBlocks: proofingPeriodDurations[proofingPeriodDurations.length - 1].durationInBlocks, + effectiveEpoch: chronos.getCurrentEpoch() + }); } function name() external pure virtual override returns (string memory) { @@ -39,16 +63,18 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { } function updateAndGetActiveProofPeriodStartBlock() external returns (uint256) { - if (block.number > activeProofPeriodStartBlock + proofingPeriodDurationInBlocks) { + uint256 activeProofingPeriodDurationInBlocks = getActiveProofingPeriodDurationInBlocks(); + + if (block.number > activeProofPeriodStartBlock + activeProofingPeriodDurationInBlocks) { // Calculate how many complete periods have passed since the last active period started uint256 blocksSinceLastStart = block.number - activeProofPeriodStartBlock; - uint256 completePeriodsPassed = blocksSinceLastStart / (proofingPeriodDurationInBlocks + 1); + uint256 completePeriodsPassed = blocksSinceLastStart / (activeProofingPeriodDurationInBlocks + 1); // The +1 ensures there's always a block gap between periods activeProofPeriodStartBlock = activeProofPeriodStartBlock + completePeriodsPassed * - (proofingPeriodDurationInBlocks + 1); + (activeProofingPeriodDurationInBlocks + 1); } return activeProofPeriodStartBlock; @@ -58,7 +84,7 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { return RandomSamplingLib.ProofPeriodStatus( activeProofPeriodStartBlock, - block.number <= activeProofPeriodStartBlock + proofingPeriodDurationInBlocks + block.number <= activeProofPeriodStartBlock + getActiveProofingPeriodDurationInBlocks() ); } @@ -68,20 +94,65 @@ contract RandomSamplingStorage is INamed, IVersioned, HubDependent { ) external view returns (uint256) { require(proofPeriodStartBlock > 0, "Proof period start block must be greater than 0"); require( - proofPeriodStartBlock % (proofingPeriodDurationInBlocks + 1) == 0, + proofPeriodStartBlock % (getActiveProofingPeriodDurationInBlocks() + 1) == 0, "Proof period start block is not valid" ); require(offset > 0, "Offset must be greater than 0"); - return proofPeriodStartBlock - (offset * (proofingPeriodDurationInBlocks + 1)); + return proofPeriodStartBlock - (offset * (getActiveProofingPeriodDurationInBlocks() + 1)); } - function getProofingPeriodDurationInBlocks() external view returns (uint16) { - return proofingPeriodDurationInBlocks; + function isPendingProofingPeriodDuration() public view returns (bool) { + return chronos.getCurrentEpoch() < proofingPeriodDurations[proofingPeriodDurations.length - 1].effectiveEpoch; } - function setProofingPeriodDurationInBlocks(uint16 durationInBlocks) external onlyContracts { - require(durationInBlocks > 0, "Duration in blocks must be greater than 0"); - proofingPeriodDurationInBlocks = durationInBlocks; + function replacePendingProofingPeriodDuration( + uint16 durationInBlocks, + uint256 effectiveEpoch + ) external onlyContracts { + uint16 oldDurationInBlocks = proofingPeriodDurations[proofingPeriodDurations.length - 1].durationInBlocks; + proofingPeriodDurations[proofingPeriodDurations.length - 1] = RandomSamplingLib.ProofingPeriodDuration({ + durationInBlocks: durationInBlocks, + effectiveEpoch: effectiveEpoch + }); + + emit PendingProofingPeriodDurationReplaced(oldDurationInBlocks, durationInBlocks, effectiveEpoch); + } + + function addProofingPeriodDuration(uint16 durationInBlocks, uint256 effectiveEpoch) external onlyContracts { + proofingPeriodDurations.push( + RandomSamplingLib.ProofingPeriodDuration({ + durationInBlocks: durationInBlocks, + effectiveEpoch: effectiveEpoch + }) + ); + + emit ProofingPeriodDurationAdded(durationInBlocks, effectiveEpoch); + } + + function getActiveProofingPeriodDurationInBlocks() public view returns (uint16) { + uint256 currentEpoch = chronos.getCurrentEpoch(); + + if (currentEpoch >= proofingPeriodDurations[proofingPeriodDurations.length - 1].effectiveEpoch) { + return proofingPeriodDurations[proofingPeriodDurations.length - 1].durationInBlocks; + } + + return proofingPeriodDurations[proofingPeriodDurations.length - 2].durationInBlocks; + } + + function getEpochProofingPeriodDurationInBlocks(uint256 epoch) external view returns (uint16) { + // Find the most recent duration that was effective before or at the specified epoch + for (uint256 i = proofingPeriodDurations.length; i > 0; ) { + if (epoch >= proofingPeriodDurations[i - 1].effectiveEpoch) { + return proofingPeriodDurations[i - 1].durationInBlocks; + } + + unchecked { + i--; + } + } + + // If no applicable duration found, revert + revert("No applicable duration found"); } function getNodeChallenge(uint72 identityId) external view returns (RandomSamplingLib.Challenge memory) { From 72c1798146fb552842b52a8d80e5d1af10bc7236 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 8 Apr 2025 12:37:18 +0200 Subject: [PATCH 039/106] Update RS deployment script and parameters.json --- deploy/031_deploy_random_sampling.ts | 6 +++++- deployments/parameters.json | 4 +++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/deploy/031_deploy_random_sampling.ts b/deploy/031_deploy_random_sampling.ts index 543b3d00..f63a2cc1 100644 --- a/deploy/031_deploy_random_sampling.ts +++ b/deploy/031_deploy_random_sampling.ts @@ -7,7 +7,11 @@ const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { await hre.helpers.deploy({ newContractName: 'RandomSampling', - additionalArgs: [randomSamplingParametersConfig.avgBlockTimeInSeconds], + additionalArgs: [ + randomSamplingParametersConfig.avgBlockTimeInSeconds, + randomSamplingParametersConfig.W1, + randomSamplingParametersConfig.W2, + ], }); }; diff --git a/deployments/parameters.json b/deployments/parameters.json index 41aa2156..8136ab5a 100644 --- a/deployments/parameters.json +++ b/deployments/parameters.json @@ -19,7 +19,9 @@ "uriBase": "did:dkg" }, "RandomSampling": { - "avgBlockTimeInSeconds": "1" + "avgBlockTimeInSeconds": "1", + "W1": "0", + "W2": "2" }, "RandomSamplingStorage": { "proofingPeriodDurationInBlocks": "100" From b7a70e62c5426850ec047e19781d28e36accf571 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 8 Apr 2025 12:45:45 +0200 Subject: [PATCH 040/106] Update abi --- abi/RandomSampling.json | 112 ++++++++++++++++++++ abi/RandomSamplingStorage.json | 188 ++++++++++++++++++++++++++++----- 2 files changed, 271 insertions(+), 29 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index 2eae6a42..0d1c0473 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -10,6 +10,16 @@ "internalType": "uint8", "name": "_avgBlockTimeInSeconds", "type": "uint8" + }, + { + "internalType": "uint256", + "name": "_W1", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_W2", + "type": "uint256" } ], "stateMutability": "nonpayable", @@ -125,6 +135,32 @@ "name": "ValidProofSubmitted", "type": "event" }, + { + "inputs": [], + "name": "W1", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "W2", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "askStorage", @@ -235,6 +271,30 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + } + ], + "name": "getDelegatorEpochRewardsAmount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "hub", @@ -346,6 +406,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "durationInBlocks", + "type": "uint16" + } + ], + "name": "setProofingPeriodDurationInBlocks", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -359,6 +432,45 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_W1", + "type": "uint256" + } + ], + "name": "setW1", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_W2", + "type": "uint256" + } + ], + "name": "setW2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "shardingTableStorage", + "outputs": [ + { + "internalType": "contract ShardingTableStorage", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "stakingStorage", diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json index 548f61ce..1672a8fe 100644 --- a/abi/RandomSamplingStorage.json +++ b/abi/RandomSamplingStorage.json @@ -31,6 +31,50 @@ "name": "ZeroAddressHub", "type": "error" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "oldDurationInBlocks", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint16", + "name": "newDurationInBlocks", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "effectiveEpoch", + "type": "uint256" + } + ], + "name": "PendingProofingPeriodDurationReplaced", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint16", + "name": "durationInBlocks", + "type": "uint16" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "effectiveEpoch", + "type": "uint256" + } + ], + "name": "ProofingPeriodDurationAdded", + "type": "event" + }, { "inputs": [], "name": "CHUNK_BYTE_SIZE", @@ -44,6 +88,24 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "durationInBlocks", + "type": "uint16" + }, + { + "internalType": "uint256", + "name": "effectiveEpoch", + "type": "uint256" + } + ], + "name": "addProofingPeriodDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -124,6 +186,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "chronos", + "outputs": [ + { + "internalType": "contract Chronos", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -202,6 +277,19 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "getActiveProofingPeriodDurationInBlocks", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -279,6 +367,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + } + ], + "name": "getEpochProofingPeriodDurationInBlocks", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -383,19 +490,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "getProofingPeriodDurationInBlocks", - "outputs": [ - { - "internalType": "uint16", - "name": "", - "type": "uint16" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "hub", @@ -427,6 +521,26 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isPendingProofingPeriodDuration", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "name", @@ -514,18 +628,47 @@ "type": "function" }, { - "inputs": [], - "name": "proofingPeriodDurationInBlocks", + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "proofingPeriodDurations", "outputs": [ { "internalType": "uint16", - "name": "", + "name": "durationInBlocks", "type": "uint16" + }, + { + "internalType": "uint256", + "name": "effectiveEpoch", + "type": "uint256" } ], "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint16", + "name": "durationInBlocks", + "type": "uint16" + }, + { + "internalType": "uint256", + "name": "effectiveEpoch", + "type": "uint256" + } + ], + "name": "replacePendingProofingPeriodDuration", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -576,19 +719,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [ - { - "internalType": "uint16", - "name": "durationInBlocks", - "type": "uint16" - } - ], - "name": "setProofingPeriodDurationInBlocks", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, { "inputs": [], "name": "updateAndGetActiveProofPeriodStartBlock", From 2fcf70adbaba86e37a9e11fbfe8a9b358ffd5b13 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 9 Apr 2025 10:07:21 +0200 Subject: [PATCH 041/106] update tests with latest changes --- test/integration/RandomSampling.test.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index 07b9df53..3822b162 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -204,7 +204,7 @@ describe('@integration RandomSampling', () => { const currentEpoch = BigInt(currentEpochTx.toString()); const proofingPeriodDurationTx = - await RandomSamplingStorage.getProofingPeriodDurationInBlocks(); + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); const proofingPeriodDuration = BigInt(proofingPeriodDurationTx.toString()); const challenge: Challenge = { @@ -232,6 +232,16 @@ describe('@integration RandomSampling', () => { expect(avgBlockTime).to.equal(avgBlockTimeInSeconds); }); + it('Should have the correct W1 after initialization', async () => { + const W1 = await RandomSampling.W1(); + expect(W1).to.equal(0); + }); + + it('Should have the correct W2 after initialization', async () => { + const W2 = await RandomSampling.W2(); + expect(W2).to.equal(2); + }); + it('Should successfully initialize with all dependent contracts', async () => { // Verify that all contract references are set correctly expect(await RandomSampling.identityStorage()).to.equal( @@ -286,7 +296,7 @@ describe('@integration RandomSampling', () => { // Mine blocks to pass the proofing period const proofingPeriodDuration = - await RandomSamplingStorage.getProofingPeriodDurationInBlocks(); + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); const blocksToMine = Number(proofingPeriodDuration) + 1 - diff; for (let i = 0; i < blocksToMine; i++) { @@ -349,7 +359,7 @@ describe('@integration RandomSampling', () => { ); const proofPeriodDuration = - await RandomSamplingStorage.getProofingPeriodDurationInBlocks(); + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); // Verify challenge properties expect(challenge.knowledgeCollectionId).to.be.a('bigint'); @@ -397,8 +407,6 @@ describe('@integration RandomSampling', () => { // eslint-disable-next-line @typescript-eslint/no-unused-expressions expect(challenge.solved).to.be.true; }); - - // TODO: Should submit a valid proof successfully }); describe('Score Calculation', () => { From afbd6086cb256228f2a19d83f2a2c86d5e1974a4 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 9 Apr 2025 11:27:13 +0200 Subject: [PATCH 042/106] fix merkle root calculation and reorg code --- contracts/RandomSampling.sol | 200 ++++++++++++++++++----------------- 1 file changed, 101 insertions(+), 99 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 7a625e64..c44a1a6d 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -89,6 +89,11 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { W2 = _W2; } + function setAvgBlockTimeInSeconds(uint8 blockTimeInSeconds) external onlyHubOwner { + avgBlockTimeInSeconds = blockTimeInSeconds; + emit AvgBlockTimeUpdated(blockTimeInSeconds); + } + function setProofingPeriodDurationInBlocks(uint16 durationInBlocks) external onlyContracts { require(durationInBlocks > 0, "Duration in blocks must be greater than 0"); @@ -132,24 +137,6 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { return challenge; } - function _computeMerkleRoot(bytes32 chunk, bytes32[] memory merkleProof) internal pure returns (bytes32) { - bytes32 computedHash = keccak256(abi.encodePacked(chunk)); - - for (uint256 i = 0; i < merkleProof.length; ) { - if (computedHash < merkleProof[i]) { - computedHash = keccak256(abi.encodePacked(computedHash, merkleProof[i])); - } else { - computedHash = keccak256(abi.encodePacked(merkleProof[i], computedHash)); - } - - unchecked { - i++; - } - } - - return computedHash; - } - function submitProof(bytes32 chunk, bytes32[] calldata merkleProof) public returns (bool) { // Get node identityId uint72 identityId = identityStorage.getIdentityId(msg.sender); @@ -166,7 +153,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { } // Construct the merkle root from chunk and merkleProof - bytes32 computedMerkleRoot = _computeMerkleRoot(chunk, merkleProof); + bytes32 computedMerkleRoot = _computeMerkleRootFromProof(chunk, challenge.chunkId, merkleProof); // Get the expected merkle root for this challenge bytes32 expectedMerkleRoot = knowledgeCollectionStorage.getLatestMerkleRoot(challenge.knowledgeCollectionId); @@ -195,83 +182,52 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { return false; } - function setAvgBlockTimeInSeconds(uint8 blockTimeInSeconds) external onlyHubOwner { - avgBlockTimeInSeconds = blockTimeInSeconds; - emit AvgBlockTimeUpdated(blockTimeInSeconds); - } - - function _calculateNodeScore(uint72 identityId) private view returns (uint256) { - // 1. Node stake factor calculation - // Formula: nodeStakeFactor = 2 * (nodeStake / 2,000,000)^2 - uint96 maximumStake = parametersStorage.maximumStake(); - uint256 nodeStake = stakingStorage.getNodeStake(identityId); - nodeStake = nodeStake > maximumStake ? maximumStake : nodeStake; - uint256 stakeRatio = nodeStake / 2000000; - uint256 nodeStakeFactor = (2 * stakeRatio * stakeRatio) / SCALING_FACTOR; + function getDelegatorEpochRewardsAmount(uint72 identityId, uint256 epoch) public view returns (uint256) { + require(chronos.getCurrentEpoch() > epoch, "Epoch is not over yet"); - // 2. Node ask factor calculation - // Formula: nodeStake * ((upperAskBound - nodeAsk) / (upperAskBound - lowerAskBound))^2 / 2,000,000 - uint256 nodeAskScaled = profileStorage.getAsk(identityId) * 1e18; - (uint256 askLowerBound, uint256 askUpperBound) = askStorage.getAskBounds(); - uint256 nodeAskFactor = 0; - if (nodeAskScaled <= askUpperBound && nodeAskScaled >= askLowerBound) { - uint256 askBoundsDiff = askUpperBound - askLowerBound; - if (askBoundsDiff == 0) { - revert("Ask bounds difference is 0"); - } - uint256 askDiffRatio = ((askUpperBound - nodeAskScaled) * SCALING_FACTOR) / askBoundsDiff; - nodeAskFactor = (stakeRatio * (askDiffRatio ** 2)) / (SCALING_FACTOR ** 2); - } + uint256 epochNodeValidProofsCount = randomSamplingStorage.getEpochNodeValidProofsCount(epoch, identityId); - // 3. Node publishing factor calculation - // Original: nodeStakeFactor * (nodePublishingFactor / MAX(allNodesPublishingFactors)) - uint256 nodePubFactor = epochStorage.getNodeCurrentEpochProducedKnowledgeValue(identityId); - uint256 maxNodePubFactor = epochStorage.getCurrentEpochNodeMaxProducedKnowledgeValue(); - if (maxNodePubFactor == 0) { - revert("Max node publishing factor is 0"); - } - uint256 pubRatio = (nodePubFactor * SCALING_FACTOR) / maxNodePubFactor; - uint256 nodePublishingFactor = (nodeStakeFactor * pubRatio) / SCALING_FACTOR; + uint256 proofingPeriodDurationInBlocks = randomSamplingStorage.getEpochProofingPeriodDurationInBlocks(epoch); + uint256 maxNodeProofsInEpoch = chronos.epochLength() / (proofingPeriodDurationInBlocks * avgBlockTimeInSeconds); - return nodeStakeFactor + nodePublishingFactor + nodeAskFactor; - } + uint256 allExpectedEpochProofsCount = shardingTableStorage.nodesCount() * maxNodeProofsInEpoch; - function _calculateAndStoreDelegatorScores( - uint72 identityId, - uint256 epoch, - uint256 activeProofPeriodStartBlock - ) private { - uint256 lastProofPeriodStartBlock = randomSamplingStorage.getHistoricalProofPeriodStartBlock( - activeProofPeriodStartBlock, - 1 - ); - uint256 myNodeScore = randomSamplingStorage.getNodeEpochProofPeriodScore( - identityId, - epoch, - lastProofPeriodStartBlock - ); - uint256 allNodesScore = randomSamplingStorage.getEpochAllNodesProofPeriodScore( + bytes32 delegatorKey = keccak256(abi.encodePacked(msg.sender)); + uint256 epochNodeDelegatorScore = randomSamplingStorage.getEpochNodeDelegatorScore( epoch, - lastProofPeriodStartBlock + identityId, + delegatorKey ); - uint256 lastProofPeriodScoreRatio = (myNodeScore * SCALING_FACTOR) / allNodesScore; - // update all delegators' scores - address[] memory delegatorsAddresses = delegatorsInfo.getDelegators(identityId); - for (uint8 i = 0; i < delegatorsAddresses.length; ) { - bytes32 delegatorKey = keccak256(abi.encodePacked(delegatorsAddresses[i])); + uint256 totalEpochTracFees = epochStorage.getEpochPool(1, epoch); - uint256 delegatorStake = stakingStorage.getDelegatorTotalStake(identityId, delegatorKey); - uint256 nodeStake = stakingStorage.getNodeStake(identityId); - // Need to divide by SCALING_FACTOR^2 to get the correct score - uint256 delegatorScore = (lastProofPeriodScoreRatio * delegatorStake * SCALING_FACTOR) / nodeStake; + uint256 reward = ((totalEpochTracFees / 2) * + (W1 * (epochNodeValidProofsCount / allExpectedEpochProofsCount) + W2 * epochNodeDelegatorScore)) / + SCALING_FACTOR ** 2; - randomSamplingStorage.addToEpochNodeDelegatorScore(epoch, identityId, delegatorKey, delegatorScore); + return reward; + } + + function _computeMerkleRootFromProof( + bytes32 chunk, + uint256 chunkId, + bytes32[] memory merkleProof + ) internal pure returns (bytes32) { + bytes32 computedHash = keccak256(abi.encodePacked(chunk, chunkId)); + + for (uint256 i = 0; i < merkleProof.length; ) { + if (computedHash < merkleProof[i]) { + computedHash = keccak256(abi.encodePacked(computedHash, merkleProof[i])); + } else { + computedHash = keccak256(abi.encodePacked(merkleProof[i], computedHash)); + } unchecked { i++; } } + + return computedHash; } function _generateChallenge( @@ -336,32 +292,78 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { ); } - // get rewards amount - function getDelegatorEpochRewardsAmount(uint72 identityId, uint256 epoch) public view returns (uint256) { - require(chronos.getCurrentEpoch() > epoch, "Epoch is not over yet"); + function _calculateNodeScore(uint72 identityId) private view returns (uint256) { + // 1. Node stake factor calculation + // Formula: nodeStakeFactor = 2 * (nodeStake / 2,000,000)^2 + uint96 maximumStake = parametersStorage.maximumStake(); + uint256 nodeStake = stakingStorage.getNodeStake(identityId); + nodeStake = nodeStake > maximumStake ? maximumStake : nodeStake; + uint256 stakeRatio = nodeStake / 2000000; + uint256 nodeStakeFactor = (2 * stakeRatio * stakeRatio) / SCALING_FACTOR; - uint256 epochNodeValidProofsCount = randomSamplingStorage.getEpochNodeValidProofsCount(epoch, identityId); + // 2. Node ask factor calculation + // Formula: nodeStake * ((upperAskBound - nodeAsk) / (upperAskBound - lowerAskBound))^2 / 2,000,000 + uint256 nodeAskScaled = profileStorage.getAsk(identityId) * 1e18; + (uint256 askLowerBound, uint256 askUpperBound) = askStorage.getAskBounds(); + uint256 nodeAskFactor = 0; + if (nodeAskScaled <= askUpperBound && nodeAskScaled >= askLowerBound) { + uint256 askBoundsDiff = askUpperBound - askLowerBound; + if (askBoundsDiff == 0) { + revert("Ask bounds difference is 0"); + } + uint256 askDiffRatio = ((askUpperBound - nodeAskScaled) * SCALING_FACTOR) / askBoundsDiff; + nodeAskFactor = (stakeRatio * (askDiffRatio ** 2)) / (SCALING_FACTOR ** 2); + } - uint256 proofingPeriodDurationInBlocks = randomSamplingStorage.getEpochProofingPeriodDurationInBlocks(epoch); - uint256 maxNodeProofsInEpoch = chronos.epochLength() / (proofingPeriodDurationInBlocks * avgBlockTimeInSeconds); + // 3. Node publishing factor calculation + // Original: nodeStakeFactor * (nodePublishingFactor / MAX(allNodesPublishingFactors)) + uint256 nodePubFactor = epochStorage.getNodeCurrentEpochProducedKnowledgeValue(identityId); + uint256 maxNodePubFactor = epochStorage.getCurrentEpochNodeMaxProducedKnowledgeValue(); + if (maxNodePubFactor == 0) { + revert("Max node publishing factor is 0"); + } + uint256 pubRatio = (nodePubFactor * SCALING_FACTOR) / maxNodePubFactor; + uint256 nodePublishingFactor = (nodeStakeFactor * pubRatio) / SCALING_FACTOR; - uint256 allExpectedEpochProofsCount = shardingTableStorage.nodesCount() * maxNodeProofsInEpoch; + return nodeStakeFactor + nodePublishingFactor + nodeAskFactor; + } - bytes32 delegatorKey = keccak256(abi.encodePacked(msg.sender)); - uint256 epochNodeDelegatorScore = randomSamplingStorage.getEpochNodeDelegatorScore( - epoch, + function _calculateAndStoreDelegatorScores( + uint72 identityId, + uint256 epoch, + uint256 activeProofPeriodStartBlock + ) private { + uint256 lastProofPeriodStartBlock = randomSamplingStorage.getHistoricalProofPeriodStartBlock( + activeProofPeriodStartBlock, + 1 + ); + uint256 myNodeScore = randomSamplingStorage.getNodeEpochProofPeriodScore( identityId, - delegatorKey + epoch, + lastProofPeriodStartBlock ); + uint256 allNodesScore = randomSamplingStorage.getEpochAllNodesProofPeriodScore( + epoch, + lastProofPeriodStartBlock + ); + uint256 lastProofPeriodScoreRatio = (myNodeScore * SCALING_FACTOR) / allNodesScore; - uint256 totalEpochTracFees = epochStorage.getEpochPool(1, epoch); + // update all delegators' scores + address[] memory delegatorsAddresses = delegatorsInfo.getDelegators(identityId); + for (uint8 i = 0; i < delegatorsAddresses.length; ) { + bytes32 delegatorKey = keccak256(abi.encodePacked(delegatorsAddresses[i])); - uint256 reward = ((totalEpochTracFees / 2) * - (W1 * (epochNodeValidProofsCount / allExpectedEpochProofsCount) + W2 * epochNodeDelegatorScore)) / - SCALING_FACTOR ** 2; + uint256 delegatorStake = stakingStorage.getDelegatorTotalStake(identityId, delegatorKey); + uint256 nodeStake = stakingStorage.getNodeStake(identityId); + // Need to divide by SCALING_FACTOR^2 to get the correct score + uint256 delegatorScore = (lastProofPeriodScoreRatio * delegatorStake * SCALING_FACTOR) / nodeStake; - return reward; - } + randomSamplingStorage.addToEpochNodeDelegatorScore(epoch, identityId, delegatorKey, delegatorScore); + unchecked { + i++; + } + } + } // claim rewards } From d4a5106a7ed4cb5ecbe15e89ca7fb6b100ffc3da Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 9 Apr 2025 15:20:00 +0200 Subject: [PATCH 043/106] fix submitProof chunk data type --- abi/RandomSampling.json | 4 ++-- contracts/RandomSampling.sol | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index 0d1c0473..240b1d68 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -500,9 +500,9 @@ { "inputs": [ { - "internalType": "bytes32", + "internalType": "string", "name": "chunk", - "type": "bytes32" + "type": "string" }, { "internalType": "bytes32[]", diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index c44a1a6d..f3ec8434 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -137,7 +137,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { return challenge; } - function submitProof(bytes32 chunk, bytes32[] calldata merkleProof) public returns (bool) { + function submitProof(string memory chunk, bytes32[] calldata merkleProof) public returns (bool) { // Get node identityId uint72 identityId = identityStorage.getIdentityId(msg.sender); @@ -209,7 +209,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { } function _computeMerkleRootFromProof( - bytes32 chunk, + string memory chunk, uint256 chunkId, bytes32[] memory merkleProof ) internal pure returns (bytes32) { From 954e0552e1607721ea63dd5b6e2ed2c72c768e3d Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 10 Apr 2025 10:49:35 +0200 Subject: [PATCH 044/106] Fix division by zero in _calculateAndStoreDelegatorScores --- contracts/RandomSampling.sol | 41 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index f3ec8434..2da60fba 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -337,31 +337,32 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { activeProofPeriodStartBlock, 1 ); - uint256 myNodeScore = randomSamplingStorage.getNodeEpochProofPeriodScore( + uint256 nodeScore = randomSamplingStorage.getNodeEpochProofPeriodScore( identityId, epoch, lastProofPeriodStartBlock ); - uint256 allNodesScore = randomSamplingStorage.getEpochAllNodesProofPeriodScore( - epoch, - lastProofPeriodStartBlock - ); - uint256 lastProofPeriodScoreRatio = (myNodeScore * SCALING_FACTOR) / allNodesScore; - - // update all delegators' scores - address[] memory delegatorsAddresses = delegatorsInfo.getDelegators(identityId); - for (uint8 i = 0; i < delegatorsAddresses.length; ) { - bytes32 delegatorKey = keccak256(abi.encodePacked(delegatorsAddresses[i])); - - uint256 delegatorStake = stakingStorage.getDelegatorTotalStake(identityId, delegatorKey); - uint256 nodeStake = stakingStorage.getNodeStake(identityId); - // Need to divide by SCALING_FACTOR^2 to get the correct score - uint256 delegatorScore = (lastProofPeriodScoreRatio * delegatorStake * SCALING_FACTOR) / nodeStake; - - randomSamplingStorage.addToEpochNodeDelegatorScore(epoch, identityId, delegatorKey, delegatorScore); + uint256 nodeStake = stakingStorage.getNodeStake(identityId); - unchecked { - i++; + if (nodeScore > 0 && nodeStake > 0) { + uint256 allNodesScore = randomSamplingStorage.getEpochAllNodesProofPeriodScore( + epoch, + lastProofPeriodStartBlock + ); + uint256 lastProofPeriodScoreRatio = (nodeScore * SCALING_FACTOR) / allNodesScore; + + // update all delegators' scores + address[] memory delegatorsAddresses = delegatorsInfo.getDelegators(identityId); + for (uint8 i = 0; i < delegatorsAddresses.length; ) { + bytes32 delegatorKey = keccak256(abi.encodePacked(delegatorsAddresses[i])); + uint256 delegatorStake = stakingStorage.getDelegatorTotalStake(identityId, delegatorKey); + // Need to divide by SCALING_FACTOR^2 to get the correct score + uint256 delegatorScore = (lastProofPeriodScoreRatio * delegatorStake * SCALING_FACTOR) / nodeStake; + randomSamplingStorage.addToEpochNodeDelegatorScore(epoch, identityId, delegatorKey, delegatorScore); + + unchecked { + i++; + } } } } From c6bd0fdf425bb79049b93de9970783b19d378bfa Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 10 Apr 2025 10:57:59 +0200 Subject: [PATCH 045/106] Add storage contract address to Challenge struct --- abi/RandomSampling.json | 5 +++++ abi/RandomSamplingStorage.json | 15 +++++++++++++++ contracts/RandomSampling.sol | 3 ++- contracts/libraries/RandomSamplingLib.sol | 1 + 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index 240b1d68..2aa52477 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -216,6 +216,11 @@ "name": "chunkId", "type": "uint256" }, + { + "internalType": "address", + "name": "knowledgeCollectionStorageContract", + "type": "address" + }, { "internalType": "uint256", "name": "epoch", diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json index 1672a8fe..4be8ee25 100644 --- a/abi/RandomSamplingStorage.json +++ b/abi/RandomSamplingStorage.json @@ -432,6 +432,11 @@ "name": "chunkId", "type": "uint256" }, + { + "internalType": "address", + "name": "knowledgeCollectionStorageContract", + "type": "address" + }, { "internalType": "uint256", "name": "epoch", @@ -603,6 +608,11 @@ "name": "chunkId", "type": "uint256" }, + { + "internalType": "address", + "name": "knowledgeCollectionStorageContract", + "type": "address" + }, { "internalType": "uint256", "name": "epoch", @@ -688,6 +698,11 @@ "name": "chunkId", "type": "uint256" }, + { + "internalType": "address", + "name": "knowledgeCollectionStorageContract", + "type": "address" + }, { "internalType": "uint256", "name": "epoch", diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 2da60fba..28db2b35 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -119,7 +119,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { ) { // If node has already solved the challenge for this period, return an empty challenge if (nodeChallenge.solved == true) { - return RandomSamplingLib.Challenge(0, 0, 0, 0, 0, false); + return RandomSamplingLib.Challenge(0, 0, address(0), 0, 0, 0, false); } // If the challenge for this node exists but has not been solved yet, return the existing challenge @@ -285,6 +285,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { RandomSamplingLib.Challenge( knowledgeCollectionId, chunkId, + address(knowledgeCollectionStorage), chronos.getCurrentEpoch(), activeProofPeriodStartBlock, randomSamplingStorage.getActiveProofingPeriodDurationInBlocks(), diff --git a/contracts/libraries/RandomSamplingLib.sol b/contracts/libraries/RandomSamplingLib.sol index a3a14db2..7c370886 100644 --- a/contracts/libraries/RandomSamplingLib.sol +++ b/contracts/libraries/RandomSamplingLib.sol @@ -6,6 +6,7 @@ library RandomSamplingLib { struct Challenge { uint256 knowledgeCollectionId; uint256 chunkId; // TODO:Smaller data structure + address knowledgeCollectionStorageContract; uint256 epoch; uint256 activeProofPeriodStartBlock; uint256 proofingPeriodDurationInBlocks; From 1f7b19930a5732c2317b6927ecaea3c7c3c9f1e0 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 10 Apr 2025 11:38:14 +0200 Subject: [PATCH 046/106] fix activeProofPeriodStartBlock calculation --- contracts/storage/RandomSamplingStorage.sol | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index c87512ee..71dce3b5 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -65,16 +65,15 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, HubDepende function updateAndGetActiveProofPeriodStartBlock() external returns (uint256) { uint256 activeProofingPeriodDurationInBlocks = getActiveProofingPeriodDurationInBlocks(); - if (block.number > activeProofPeriodStartBlock + activeProofingPeriodDurationInBlocks) { + if (block.number > activeProofPeriodStartBlock + activeProofingPeriodDurationInBlocks - 1) { // Calculate how many complete periods have passed since the last active period started uint256 blocksSinceLastStart = block.number - activeProofPeriodStartBlock; - uint256 completePeriodsPassed = blocksSinceLastStart / (activeProofingPeriodDurationInBlocks + 1); + uint256 completePeriodsPassed = blocksSinceLastStart / activeProofingPeriodDurationInBlocks; - // The +1 ensures there's always a block gap between periods activeProofPeriodStartBlock = activeProofPeriodStartBlock + completePeriodsPassed * - (activeProofingPeriodDurationInBlocks + 1); + activeProofingPeriodDurationInBlocks; } return activeProofPeriodStartBlock; @@ -84,7 +83,7 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, HubDepende return RandomSamplingLib.ProofPeriodStatus( activeProofPeriodStartBlock, - block.number <= activeProofPeriodStartBlock + getActiveProofingPeriodDurationInBlocks() + block.number < activeProofPeriodStartBlock + getActiveProofingPeriodDurationInBlocks() ); } @@ -94,11 +93,11 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, HubDepende ) external view returns (uint256) { require(proofPeriodStartBlock > 0, "Proof period start block must be greater than 0"); require( - proofPeriodStartBlock % (getActiveProofingPeriodDurationInBlocks() + 1) == 0, + proofPeriodStartBlock % getActiveProofingPeriodDurationInBlocks() == 0, "Proof period start block is not valid" ); require(offset > 0, "Offset must be greater than 0"); - return proofPeriodStartBlock - (offset * (getActiveProofingPeriodDurationInBlocks() + 1)); + return proofPeriodStartBlock - offset * getActiveProofingPeriodDurationInBlocks(); } function isPendingProofingPeriodDuration() public view returns (bool) { From 5d847b103272b4b8e2a500d0299c6983f9c4b698 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 10 Apr 2025 11:40:58 +0200 Subject: [PATCH 047/106] Add Should submit a valid proof successfully test --- package-lock.json | 15557 +++++++--------------- package.json | 2 +- test/helpers/kc-helpers.ts | 5 +- test/integration/RandomSampling.test.ts | 178 +- 4 files changed, 4824 insertions(+), 10918 deletions(-) diff --git a/package-lock.json b/package-lock.json index 06ab018c..099a84b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "dkg-evm-module", - "version": "8.0.1", - "lockfileVersion": 2, + "version": "8.0.4", + "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dkg-evm-module", - "version": "8.0.1", + "version": "8.0.4", "license": "Apache-2.0", "dependencies": { "@openzeppelin/contracts": "^5.1.0", @@ -34,7 +34,7 @@ "@types/node": "^22.10.2", "@typescript-eslint/eslint-plugin": "^8.18.1", "@typescript-eslint/parser": "^8.18.1", - "assertion-tools": "^2.2.1", + "assertion-tools": "^8.0.1", "chai": "^4.5.0", "cross-env": "^7.0.3", "eslint": "^8.17.0", @@ -59,10 +59,9 @@ } }, "node_modules/@adraffy/ens-normalize": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", - "dev": true, + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", "license": "MIT" }, "node_modules/@babel/code-frame": { @@ -95,6 +94,7 @@ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=0.1.90" @@ -104,6 +104,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -112,23 +113,58 @@ } }, "node_modules/@digitalbazaar/http-client": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.2.0.tgz", - "integrity": "sha512-NhYXcWE/JDE7AnJikNX7q0S6zNuUPA2NuIoRdUpmvHlarjmRqyr6hIO3Awu2FxlUzbdiI1uzuWrZyB9mD1tTvw==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.4.1.tgz", + "integrity": "sha512-Ahk1N+s7urkgj7WvvUND5f8GiWEPfUw0D41hdElaqLgu8wZScI8gdI0q+qWw5N1d35x7GCRH2uk9mi+Uzo9M3g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "ky": "^0.30.0", - "ky-universal": "^0.10.1", - "undici": "^5.2.0" + "ky": "^0.33.3", + "ky-universal": "^0.11.0", + "undici": "^5.21.2" }, "engines": { "node": ">=14.0" } }, + "node_modules/@emnapi/core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.0.tgz", + "integrity": "sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.0.tgz", + "integrity": "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", "dev": true, "license": "MIT", "dependencies": { @@ -178,17 +214,28 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "*" } }, "node_modules/@eslint/js": { @@ -201,10 +248,116 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "dev": true, + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util/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": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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/@ethereumjs/util/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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/@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/@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, + "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/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz", + "integrity": "sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==", "funding": [ { "type": "individual", @@ -215,22 +368,23 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz", + "integrity": "sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==", "funding": [ { "type": "individual", @@ -241,20 +395,21 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/networks": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/web": "^5.8.0" } }, "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz", + "integrity": "sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==", "funding": [ { "type": "individual", @@ -265,18 +420,19 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0" } }, "node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz", + "integrity": "sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==", "funding": [ { "type": "individual", @@ -287,18 +443,19 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/rlp": "^5.8.0" } }, "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz", + "integrity": "sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==", "funding": [ { "type": "individual", @@ -309,14 +466,15 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0" + "@ethersproject/bytes": "^5.8.0" } }, "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.8.0.tgz", + "integrity": "sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==", "funding": [ { "type": "individual", @@ -327,15 +485,16 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/properties": "^5.8.0" } }, "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz", + "integrity": "sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==", "funding": [ { "type": "individual", @@ -346,16 +505,17 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", "bn.js": "^5.2.1" } }, "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz", + "integrity": "sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==", "funding": [ { "type": "individual", @@ -366,14 +526,15 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz", + "integrity": "sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==", "funding": [ { "type": "individual", @@ -384,14 +545,15 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.7.0" + "@ethersproject/bignumber": "^5.8.0" } }, "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.8.0.tgz", + "integrity": "sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==", "funding": [ { "type": "individual", @@ -402,23 +564,24 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" + "@ethersproject/abi": "^5.8.0", + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/transactions": "^5.8.0" } }, "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz", + "integrity": "sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==", "funding": [ { "type": "individual", @@ -429,22 +592,23 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/base64": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.8.0.tgz", + "integrity": "sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==", "funding": [ { "type": "individual", @@ -455,25 +619,26 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" } }, "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.8.0.tgz", + "integrity": "sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==", "funding": [ { "type": "individual", @@ -484,26 +649,33 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/pbkdf2": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", "aes-js": "3.0.0", "scrypt-js": "3.0.1" } }, + "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "license": "MIT" + }, "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz", + "integrity": "sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==", "funding": [ { "type": "individual", @@ -514,15 +686,16 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", + "@ethersproject/bytes": "^5.8.0", "js-sha3": "0.8.0" } }, "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz", + "integrity": "sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==", "funding": [ { "type": "individual", @@ -532,12 +705,13 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ] + ], + "license": "MIT" }, "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz", + "integrity": "sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==", "funding": [ { "type": "individual", @@ -548,14 +722,15 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.8.0.tgz", + "integrity": "sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==", "funding": [ { "type": "individual", @@ -566,15 +741,16 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/sha2": "^5.8.0" } }, "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz", + "integrity": "sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==", "funding": [ { "type": "individual", @@ -585,14 +761,15 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.8.0.tgz", + "integrity": "sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==", "funding": [ { "type": "individual", @@ -603,39 +780,41 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/base64": "^5.8.0", + "@ethersproject/basex": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/networks": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/rlp": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/web": "^5.8.0", "bech32": "1.1.4", - "ws": "7.4.6" + "ws": "8.18.0" } }, "node_modules/@ethersproject/providers/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -647,9 +826,9 @@ } }, "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.8.0.tgz", + "integrity": "sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==", "funding": [ { "type": "individual", @@ -660,15 +839,16 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz", + "integrity": "sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==", "funding": [ { "type": "individual", @@ -679,15 +859,16 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.8.0.tgz", + "integrity": "sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==", "funding": [ { "type": "individual", @@ -698,16 +879,17 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", "hash.js": "1.1.7" } }, "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz", + "integrity": "sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==", "funding": [ { "type": "individual", @@ -718,19 +900,20 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", "bn.js": "^5.2.1", - "elliptic": "6.5.4", + "elliptic": "6.6.1", "hash.js": "1.1.7" } }, "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.8.0.tgz", + "integrity": "sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==", "funding": [ { "type": "individual", @@ -741,19 +924,20 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/sha2": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz", + "integrity": "sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==", "funding": [ { "type": "individual", @@ -764,16 +948,17 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz", + "integrity": "sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==", "funding": [ { "type": "individual", @@ -784,22 +969,23 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/rlp": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0" } }, "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.8.0.tgz", + "integrity": "sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==", "funding": [ { "type": "individual", @@ -810,16 +996,17 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/constants": "^5.8.0", + "@ethersproject/logger": "^5.8.0" } }, "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.8.0.tgz", + "integrity": "sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==", "funding": [ { "type": "individual", @@ -830,28 +1017,29 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" + "@ethersproject/abstract-provider": "^5.8.0", + "@ethersproject/abstract-signer": "^5.8.0", + "@ethersproject/address": "^5.8.0", + "@ethersproject/bignumber": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/hdnode": "^5.8.0", + "@ethersproject/json-wallets": "^5.8.0", + "@ethersproject/keccak256": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/random": "^5.8.0", + "@ethersproject/signing-key": "^5.8.0", + "@ethersproject/transactions": "^5.8.0", + "@ethersproject/wordlists": "^5.8.0" } }, "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz", + "integrity": "sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==", "funding": [ { "type": "individual", @@ -862,18 +1050,19 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/base64": "^5.8.0", + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.8.0.tgz", + "integrity": "sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==", "funding": [ { "type": "individual", @@ -884,18 +1073,20 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/bytes": "^5.8.0", + "@ethersproject/hash": "^5.8.0", + "@ethersproject/logger": "^5.8.0", + "@ethersproject/properties": "^5.8.0", + "@ethersproject/strings": "^5.8.0" } }, "node_modules/@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "license": "MIT", "engines": { "node": ">=14" } @@ -916,11 +1107,36 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1041,9 +1257,10 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1058,6 +1275,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1067,6 +1285,7 @@ "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==", + "license": "ISC", "dependencies": { "ethereumjs-abi": "^0.6.8", "ethereumjs-util": "^6.2.1", @@ -1082,41 +1301,22 @@ "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==", + "license": "MIT", "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==" - }, - "node_modules/@metamask/eth-sig-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT" }, "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==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -1127,55 +1327,64 @@ "rlp": "^2.2.3" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.8.tgz", + "integrity": "sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@tybys/wasm-util": "^0.9.0" + } + }, "node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", + "license": "MIT", "dependencies": { - "@noble/hashes": "1.4.0" + "@noble/hashes": "1.7.1" + }, + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "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==", + "node_modules/@noble/hashes": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", + "license": "MIT", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, "node_modules/@noble/secp256k1": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", - "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1189,6 +1398,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -1198,6 +1408,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1217,81 +1428,81 @@ } }, "node_modules/@nomicfoundation/edr": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.5.tgz", - "integrity": "sha512-tAqMslLP+/2b2sZP4qe9AuGxG3OkQ5gGgHE4isUuq6dUVjwCRPFhAOhpdFl+OjY5P3yEv3hmq9HjUGRa2VNjng==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.8.0.tgz", + "integrity": "sha512-dwWRrghSVBQDpt0wP+6RXD8BMz2i/9TI34TcmZqeEAZuCLei3U9KZRgGTKVAM1rMRvrpf5ROfPqrWNetKVUTag==", "license": "MIT", "dependencies": { - "@nomicfoundation/edr-darwin-arm64": "0.6.5", - "@nomicfoundation/edr-darwin-x64": "0.6.5", - "@nomicfoundation/edr-linux-arm64-gnu": "0.6.5", - "@nomicfoundation/edr-linux-arm64-musl": "0.6.5", - "@nomicfoundation/edr-linux-x64-gnu": "0.6.5", - "@nomicfoundation/edr-linux-x64-musl": "0.6.5", - "@nomicfoundation/edr-win32-x64-msvc": "0.6.5" + "@nomicfoundation/edr-darwin-arm64": "0.8.0", + "@nomicfoundation/edr-darwin-x64": "0.8.0", + "@nomicfoundation/edr-linux-arm64-gnu": "0.8.0", + "@nomicfoundation/edr-linux-arm64-musl": "0.8.0", + "@nomicfoundation/edr-linux-x64-gnu": "0.8.0", + "@nomicfoundation/edr-linux-x64-musl": "0.8.0", + "@nomicfoundation/edr-win32-x64-msvc": "0.8.0" }, "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-darwin-arm64": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.5.tgz", - "integrity": "sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.8.0.tgz", + "integrity": "sha512-sKTmOu/P5YYhxT0ThN2Pe3hmCE/5Ag6K/eYoiavjLWbR7HEb5ZwPu2rC3DpuUk1H+UKJqt7o4/xIgJxqw9wu6A==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-darwin-x64": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.5.tgz", - "integrity": "sha512-x3zBY/v3R0modR5CzlL6qMfFMdgwd6oHrWpTkuuXnPFOX8SU31qq87/230f4szM+ukGK8Hi+mNq7Ro2VF4Fj+w==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.8.0.tgz", + "integrity": "sha512-8ymEtWw1xf1Id1cc42XIeE+9wyo3Dpn9OD/X8GiaMz9R70Ebmj2g+FrbETu8o6UM+aL28sBZQCiCzjlft2yWAg==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.5.tgz", - "integrity": "sha512-HGpB8f1h8ogqPHTyUpyPRKZxUk2lu061g97dOQ/W4CxevI0s/qiw5DB3U3smLvSnBHKOzYS1jkxlMeGN01ky7A==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.8.0.tgz", + "integrity": "sha512-h/wWzS2EyQuycz+x/SjMRbyA+QMCCVmotRsgM1WycPARvVZWIVfwRRsKoXKdCftsb3S8NTprqBdJlOmsFyETFA==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-arm64-musl": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.5.tgz", - "integrity": "sha512-ESvJM5Y9XC03fZg9KaQg3Hl+mbx7dsSkTIAndoJS7X2SyakpL9KZpOSYrDk135o8s9P9lYJdPOyiq+Sh+XoCbQ==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.8.0.tgz", + "integrity": "sha512-gnWxDgdkka0O9GpPX/gZT3REeKYV28Guyg13+Vj/bbLpmK1HmGh6Kx+fMhWv+Ht/wEmGDBGMCW1wdyT/CftJaQ==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-x64-gnu": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.5.tgz", - "integrity": "sha512-HCM1usyAR1Ew6RYf5AkMYGvHBy64cPA5NMbaeY72r0mpKaH3txiMyydcHibByOGdQ8iFLWpyUdpl1egotw+Tgg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.8.0.tgz", + "integrity": "sha512-DTMiAkgAx+nyxcxKyxFZk1HPakXXUCgrmei7r5G7kngiggiGp/AUuBBWFHi8xvl2y04GYhro5Wp+KprnLVoAPA==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-x64-musl": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.5.tgz", - "integrity": "sha512-nB2uFRyczhAvWUH7NjCsIO6rHnQrof3xcCe6Mpmnzfl2PYcGyxN7iO4ZMmRcQS7R1Y670VH6+8ZBiRn8k43m7A==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.8.0.tgz", + "integrity": "sha512-iTITWe0Zj8cNqS0xTblmxPbHVWwEtMiDC+Yxwr64d7QBn/1W0ilFQ16J8gB6RVVFU3GpfNyoeg3tUoMpSnrm6Q==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-win32-x64-msvc": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.5.tgz", - "integrity": "sha512-B9QD/4DSSCFtWicO8A3BrsnitO1FPv7axB62wq5Q+qeJ50yJlTmyeGY3cw62gWItdvy2mh3fRM6L1LpnHiB77A==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.8.0.tgz", + "integrity": "sha512-mNRDyd/C3j7RMcwapifzv2K57sfA5xOw8g2U84ZDvgSrXVXLC99ZPxn9kmolb+dz8VMm9FONTZz9ESS6v8DTnA==", "license": "MIT", "engines": { "node": ">= 18" @@ -1301,6 +1512,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", + "license": "MIT", "dependencies": { "@nomicfoundation/ethereumjs-util": "9.0.4" } @@ -1309,6 +1521,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", + "license": "MPL-2.0", "bin": { "rlp": "bin/rlp.cjs" }, @@ -1320,6 +1533,7 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz", "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==", + "license": "MPL-2.0", "dependencies": { "@nomicfoundation/ethereumjs-common": "4.0.4", "@nomicfoundation/ethereumjs-rlp": "5.0.4", @@ -1338,32 +1552,11 @@ } } }, - "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@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==", + "license": "MPL-2.0", "dependencies": { "@nomicfoundation/ethereumjs-rlp": "5.0.4", "ethereum-cryptography": "0.1.3" @@ -1380,28 +1573,6 @@ } } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.8.tgz", @@ -1450,173 +1621,91 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz", - "integrity": "sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.2.tgz", + "integrity": "sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==", + "license": "MIT", "engines": { "node": ">= 12" }, "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.0", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.0", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.0", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.0", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.0", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.0" + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.2", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.2", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.2", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.2" } }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz", - "integrity": "sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw==", - "cpu": [ - "arm64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.2.tgz", + "integrity": "sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==", + "license": "MIT", "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz", - "integrity": "sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz", - "integrity": "sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg==", - "cpu": [ - "x64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.2.tgz", + "integrity": "sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==", + "license": "MIT", "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz", - "integrity": "sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ==", - "cpu": [ - "arm64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.2.tgz", + "integrity": "sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz", - "integrity": "sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w==", - "cpu": [ - "arm64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.2.tgz", + "integrity": "sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz", - "integrity": "sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw==", - "cpu": [ - "x64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.2.tgz", + "integrity": "sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==", + "license": "MIT", "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz", - "integrity": "sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz", - "integrity": "sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz", - "integrity": "sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw==", - "cpu": [ - "ia32" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.2.tgz", + "integrity": "sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==", + "license": "MIT", "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz", - "integrity": "sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA==", - "cpu": [ - "x64" - ], + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.2.tgz", + "integrity": "sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==", + "license": "MIT", "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/@nomiclabs/hardhat-solhint": { @@ -1633,9 +1722,9 @@ } }, "node_modules/@openzeppelin/contracts": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.1.0.tgz", - "integrity": "sha512-p1ULhl7BXzjjbha5aqst+QMLY+4/LCWADXOCsmLHRM77AqiPjnd9vvUN9sosUfhL9JGKpZ0TjEGxgvnizmWGSA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.2.0.tgz", + "integrity": "sha512-bxjNie5z89W1Ea0NZLZluFh8PrFNn9DH8DQlujEok2yjsOlraUPKID5p1Wk3qdNbf6XkQ1Os2RvfiHrrXLHWKA==", "license": "MIT" }, "node_modules/@pkgjs/parseargs": { @@ -1650,9 +1739,9 @@ } }, "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.1.tgz", + "integrity": "sha512-VzgHzGblFmUeBmmrk55zPyrQIArQN4vujc9shWytaPdB3P7qhi0cpaiKIr7tlCmFv2lYUwnLospIqjL9ZSAhhg==", "dev": true, "license": "MIT", "engines": { @@ -1685,6 +1774,13 @@ "node": ">=12.22.0" } }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true, + "license": "ISC" + }, "node_modules/@pnpm/npm-conf": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", @@ -1754,19 +1850,6 @@ "scale-ts": "^1.6.0" } }, - "node_modules/@polkadot-api/substrate-bindings/node_modules/@noble/hashes": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", - "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", - "license": "MIT", - "optional": true, - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@polkadot-api/substrate-client": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@polkadot-api/substrate-client/-/substrate-client-0.1.4.tgz", @@ -1786,113 +1869,113 @@ "optional": true }, "node_modules/@polkadot/api": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-15.0.2.tgz", - "integrity": "sha512-CA8Pq2Gsz2MJvpkpIVNzaBs2eJGCr0sEodAb0vTOZW/ZlIDHcBWyWq3KXE+lBMWVzYBEC4Vz6MafNgq6Bsshlw==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-15.9.1.tgz", + "integrity": "sha512-VpS7ymL0kzUOXTocJa0AvrnAGUMgT2niyBa5oplItZf3nqF+gSyvdKkP1T9i9Tpp2sbvmwzcMBKUF4G/d+Q02w==", "license": "Apache-2.0", "dependencies": { - "@polkadot/api-augment": "15.0.2", - "@polkadot/api-base": "15.0.2", - "@polkadot/api-derive": "15.0.2", - "@polkadot/keyring": "^13.2.3", - "@polkadot/rpc-augment": "15.0.2", - "@polkadot/rpc-core": "15.0.2", - "@polkadot/rpc-provider": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/types-augment": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/types-create": "15.0.2", - "@polkadot/types-known": "15.0.2", - "@polkadot/util": "^13.2.3", - "@polkadot/util-crypto": "^13.2.3", + "@polkadot/api-augment": "15.9.1", + "@polkadot/api-base": "15.9.1", + "@polkadot/api-derive": "15.9.1", + "@polkadot/keyring": "^13.4.3", + "@polkadot/rpc-augment": "15.9.1", + "@polkadot/rpc-core": "15.9.1", + "@polkadot/rpc-provider": "15.9.1", + "@polkadot/types": "15.9.1", + "@polkadot/types-augment": "15.9.1", + "@polkadot/types-codec": "15.9.1", + "@polkadot/types-create": "15.9.1", + "@polkadot/types-known": "15.9.1", + "@polkadot/util": "^13.4.3", + "@polkadot/util-crypto": "^13.4.3", "eventemitter3": "^5.0.1", "rxjs": "^7.8.1", - "tslib": "^2.8.0" + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/api-augment": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-15.0.2.tgz", - "integrity": "sha512-7qtfTihLKS7cT2kEsd8Y1+MJ+2n4Sl0y9BHuPhdNfKcDbGwCxIB7JzXNujww4Is4bF7w1lXcM2U0E/XwJi1BbQ==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-15.9.1.tgz", + "integrity": "sha512-LAA21O5AW1hlVaqPxEONAcU0PGcA3iUtFqgQSomH7eDkl3QwqNWgB/G2MfcI5/auXjXcN7Sd7SxAEnx0XQDf2g==", "license": "Apache-2.0", "dependencies": { - "@polkadot/api-base": "15.0.2", - "@polkadot/rpc-augment": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/types-augment": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" + "@polkadot/api-base": "15.9.1", + "@polkadot/rpc-augment": "15.9.1", + "@polkadot/types": "15.9.1", + "@polkadot/types-augment": "15.9.1", + "@polkadot/types-codec": "15.9.1", + "@polkadot/util": "^13.4.3", + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/api-base": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-15.0.2.tgz", - "integrity": "sha512-5++EjpuCxzmrL2JJj511RrPK+IovuIQa8DJhyOp62VDMXPkqS/O6Df5wjYzQh/ftT1ZysftXqJAUA/LSUsH+2g==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-15.9.1.tgz", + "integrity": "sha512-nIfM+txk/HH9N6w2b3dQ8LDBoxoJCGrcCUpJ1v0fGfeOccz7ioxGS4DG8JbH7r0RRZruT1SAXFEQIn/d40xz5A==", "license": "Apache-2.0", "dependencies": { - "@polkadot/rpc-core": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/util": "^13.2.3", + "@polkadot/rpc-core": "15.9.1", + "@polkadot/types": "15.9.1", + "@polkadot/util": "^13.4.3", "rxjs": "^7.8.1", - "tslib": "^2.8.0" + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/api-derive": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-15.0.2.tgz", - "integrity": "sha512-nD8hXZxEv2/wuhjMmVP09lTAYd8inNgrLpLGUR+7hBQeVEQQTdNatkqMKpNIOk2MO46mtUK35NepvDBK9DWZzA==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-15.9.1.tgz", + "integrity": "sha512-BXQudyPET/neHwgjoLBt7apCO7HvYj0ZNHHSOeCgrzVIwfQ/NEOou3oIyPU4+ENEH+kdfwKTXNx2KYFu9M7X2Q==", "license": "Apache-2.0", "dependencies": { - "@polkadot/api": "15.0.2", - "@polkadot/api-augment": "15.0.2", - "@polkadot/api-base": "15.0.2", - "@polkadot/rpc-core": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/util": "^13.2.3", - "@polkadot/util-crypto": "^13.2.3", + "@polkadot/api": "15.9.1", + "@polkadot/api-augment": "15.9.1", + "@polkadot/api-base": "15.9.1", + "@polkadot/rpc-core": "15.9.1", + "@polkadot/types": "15.9.1", + "@polkadot/types-codec": "15.9.1", + "@polkadot/util": "^13.4.3", + "@polkadot/util-crypto": "^13.4.3", "rxjs": "^7.8.1", - "tslib": "^2.8.0" + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/keyring": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-13.2.3.tgz", - "integrity": "sha512-pgTo6DXNXub0wGD+MnVHYhKxf80Jl+QMOCb818ioGdXz++Uw4mTueFAwtB+N7TGo0HafhChUiNJDxFdlDkcAng==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-13.4.3.tgz", + "integrity": "sha512-2ePNcvBTznDN2luKbZM5fdxgAnj7V8m276qSTgrHlqKVvg9FsQpRCR6CAU+AjhnHzpe7uiZO+UH+jlXWefI3AA==", "license": "Apache-2.0", "dependencies": { - "@polkadot/util": "13.2.3", - "@polkadot/util-crypto": "13.2.3", + "@polkadot/util": "13.4.3", + "@polkadot/util-crypto": "13.4.3", "tslib": "^2.8.0" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@polkadot/util": "13.2.3", - "@polkadot/util-crypto": "13.2.3" + "@polkadot/util": "13.4.3", + "@polkadot/util-crypto": "13.4.3" } }, "node_modules/@polkadot/networks": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-13.2.3.tgz", - "integrity": "sha512-mG+zkXg/33AyPrkv2xBbAo3LBUwOwBn6qznBU/4jxiZPnVvCwMaxE7xHM22B5riItbNJ169FXv3wy0v6ZmkFbw==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-13.4.3.tgz", + "integrity": "sha512-Z+YZkltBt//CtkVH8ZYJ1z66qYxdI0yPamzkzZAqw6gj3gjgSxKtxB4baA/rcAw05QTvN2R3dLkkmKr2mnHovQ==", "license": "Apache-2.0", "dependencies": { - "@polkadot/util": "13.2.3", + "@polkadot/util": "13.4.3", "@substrate/ss58-registry": "^1.51.0", "tslib": "^2.8.0" }, @@ -1901,56 +1984,56 @@ } }, "node_modules/@polkadot/rpc-augment": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-15.0.2.tgz", - "integrity": "sha512-of88GdzsOs15HP+Gowh4G/iKKFkCNIeF0Wes8LiONfn+j2TmWt8blbyGhrIZZeApzbFUDFjnxUPGT40uWJcMpw==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-15.9.1.tgz", + "integrity": "sha512-+hQHQpUGoE3syT6jTfRAJ/Brt5eO8ma4zD/CRL2vrgcE9Jdfpg3kskCDnYfCr5qMDCI1Sa380xxxbNQJFCdRjA==", "license": "Apache-2.0", "dependencies": { - "@polkadot/rpc-core": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" + "@polkadot/rpc-core": "15.9.1", + "@polkadot/types": "15.9.1", + "@polkadot/types-codec": "15.9.1", + "@polkadot/util": "^13.4.3", + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/rpc-core": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-15.0.2.tgz", - "integrity": "sha512-KOUnfXOAFCN0N23sEbS+FzXhX88JCvJst/nKzO9+q67NgYBEqgcaoG4tqt/VVedgkNi0kA7WAA3wyjt5UYMnrg==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-15.9.1.tgz", + "integrity": "sha512-Wat4Qkw6USBzUpGCqIMH3uebOb3orUmaczIxVvKrV6VhFsm4QfQwkSgOROiJdOjIiS2sZxvtwzK8+l1U4c5MgA==", "license": "Apache-2.0", "dependencies": { - "@polkadot/rpc-augment": "15.0.2", - "@polkadot/rpc-provider": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/util": "^13.2.3", + "@polkadot/rpc-augment": "15.9.1", + "@polkadot/rpc-provider": "15.9.1", + "@polkadot/types": "15.9.1", + "@polkadot/util": "^13.4.3", "rxjs": "^7.8.1", - "tslib": "^2.8.0" + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/rpc-provider": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-15.0.2.tgz", - "integrity": "sha512-BwLP8gNskzqtQ2kMk+EX6WK4d9TU0XJ/nJg0TKC2dX5sSTpTF2JQIYp1wuOik4rKNXIU/1hKaDSSylMJj7AHeQ==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-15.9.1.tgz", + "integrity": "sha512-FlWVI0q4RmQbLnB9O36WY/4zyMdpK4YyQyiskK06SyhfuKMwaXJdphKWz6wkKspvinW9duGJcittrC3wMKj6Ug==", "license": "Apache-2.0", "dependencies": { - "@polkadot/keyring": "^13.2.3", - "@polkadot/types": "15.0.2", - "@polkadot/types-support": "15.0.2", - "@polkadot/util": "^13.2.3", - "@polkadot/util-crypto": "^13.2.3", - "@polkadot/x-fetch": "^13.2.3", - "@polkadot/x-global": "^13.2.3", - "@polkadot/x-ws": "^13.2.3", + "@polkadot/keyring": "^13.4.3", + "@polkadot/types": "15.9.1", + "@polkadot/types-support": "15.9.1", + "@polkadot/util": "^13.4.3", + "@polkadot/util-crypto": "^13.4.3", + "@polkadot/x-fetch": "^13.4.3", + "@polkadot/x-global": "^13.4.3", + "@polkadot/x-ws": "^13.4.3", "eventemitter3": "^5.0.1", "mock-socket": "^9.3.1", "nock": "^13.5.5", - "tslib": "^2.8.0" + "tslib": "^2.8.1" }, "engines": { "node": ">=18" @@ -1960,107 +2043,107 @@ } }, "node_modules/@polkadot/types": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-15.0.2.tgz", - "integrity": "sha512-6gZBnuXU58hQAXWI2daED2OaQwFMxbQdkE8HVGMovMobEf0PxPfIqf+GdnVmWbe09EU9mv2gCWBcdnvHSRBlQg==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-15.9.1.tgz", + "integrity": "sha512-F1cbpQeGaoBXm40re6idspqXeKQ/MVnC3Y2zGeJW6huXCz1QDfl+pMbFBCBTvU8uSoV2ii+F28vpmIOO9aDkQQ==", "license": "Apache-2.0", "dependencies": { - "@polkadot/keyring": "^13.2.3", - "@polkadot/types-augment": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/types-create": "15.0.2", - "@polkadot/util": "^13.2.3", - "@polkadot/util-crypto": "^13.2.3", + "@polkadot/keyring": "^13.4.3", + "@polkadot/types-augment": "15.9.1", + "@polkadot/types-codec": "15.9.1", + "@polkadot/types-create": "15.9.1", + "@polkadot/util": "^13.4.3", + "@polkadot/util-crypto": "^13.4.3", "rxjs": "^7.8.1", - "tslib": "^2.8.0" + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/types-augment": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-15.0.2.tgz", - "integrity": "sha512-UiFJVEYML30+V9GdFAHPbA3s4MVQTL1CevsZMnX0+ApvlgEHJMZnVFfYF7jL2bl9BcUYM/zoxEAhj2MpqFFfxw==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-15.9.1.tgz", + "integrity": "sha512-jEyDECSC6ww+5RLeVl32CZdtAQpWqgOv1HneXhvF15b0fRxSZgzHJ11hdYBw6I6aWJroPSgj32BNBG4qW1R2jw==", "license": "Apache-2.0", "dependencies": { - "@polkadot/types": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" + "@polkadot/types": "15.9.1", + "@polkadot/types-codec": "15.9.1", + "@polkadot/util": "^13.4.3", + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/types-codec": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-15.0.2.tgz", - "integrity": "sha512-44Q40p1rl0t7Bl1QUamewqXNVPway9xgqByyifv6ODSGhtt+lFoarb3U4JzqRUuuK0PP57ePB0L8q81Totxeew==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-15.9.1.tgz", + "integrity": "sha512-HtfbTSRualmOZQnil2+8Ff6OHJXv67ndN8f92+cbL1VhnesKbbgDK3TE64YqKlZfZkOTNy4q/2a1P9E1LTCBNA==", "license": "Apache-2.0", "dependencies": { - "@polkadot/util": "^13.2.3", - "@polkadot/x-bigint": "^13.2.3", - "tslib": "^2.8.0" + "@polkadot/util": "^13.4.3", + "@polkadot/x-bigint": "^13.4.3", + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/types-create": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-15.0.2.tgz", - "integrity": "sha512-YhpcqbH3oI87PkgrV6Fez9jWDqFIep0KcS1YWQcwc9gsBNnuour80t2AAK41/tqAYwOZi6tpJwIevnEhVkxFYA==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-15.9.1.tgz", + "integrity": "sha512-qL3SDZpwlzjD5obBBjMapOTtEV34z+OC66jHL+DoOcUeecZ4e5j1fVZMyRmsWe32ER/MuHWhxVWRCTzdpUwtOg==", "license": "Apache-2.0", "dependencies": { - "@polkadot/types-codec": "15.0.2", - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" + "@polkadot/types-codec": "15.9.1", + "@polkadot/util": "^13.4.3", + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/types-known": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-15.0.2.tgz", - "integrity": "sha512-SyBo4xBoesHYiEfdW/nOgaftKgM7+puBWqQXq1Euz0MM5LDLjxBw22Srgk9ulGM6l9MsekIwCyX8geJ6/6J3Cg==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-15.9.1.tgz", + "integrity": "sha512-9w+ycPJKLiKpcmXACeiRKK43PBuK11ZBOUkmRTwyQuK9OHW2XImHecOASAZaAuRzSA675wZaJ8ntvvVeMQ5+vw==", "license": "Apache-2.0", "dependencies": { - "@polkadot/networks": "^13.2.3", - "@polkadot/types": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/types-create": "15.0.2", - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" + "@polkadot/networks": "^13.4.3", + "@polkadot/types": "15.9.1", + "@polkadot/types-codec": "15.9.1", + "@polkadot/types-create": "15.9.1", + "@polkadot/util": "^13.4.3", + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/types-support": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-15.0.2.tgz", - "integrity": "sha512-I7Im/4K2/XDZ1LfeQeeNyvIkfvozIPQs8K1/nsICDOmBbvIsjxSeKWHOcFDMJ8AlPEer6bqNQavOyZA/pg9R/Q==", + "version": "15.9.1", + "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-15.9.1.tgz", + "integrity": "sha512-KpJ/q5Bc0kYvGVK6cUJQmaq+zAFpTJB3cv+C7EgeBowgWRzz9tPKG9kEFlEw6ZumOz2jk/1eVMJ8dajFSeqs4w==", "license": "Apache-2.0", "dependencies": { - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" + "@polkadot/util": "^13.4.3", + "tslib": "^2.8.1" }, "engines": { "node": ">=18" } }, "node_modules/@polkadot/util": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-13.2.3.tgz", - "integrity": "sha512-pioNnsig3qHXrfOKMe4Yqos8B8N3/EZUpS+WfTpWnn1VjYban/0GrTXeavPlAwggnY27b8fS6rBzQBhnVYDw8g==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-13.4.3.tgz", + "integrity": "sha512-6v2zvg8l7W22XvjYf7qv9tPQdYl2E6aXY94M4TZKsXZxmlS5BoG+A9Aq0+Gw8zBUjupjEmUkA6Y//msO8Zisug==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-bigint": "13.2.3", - "@polkadot/x-global": "13.2.3", - "@polkadot/x-textdecoder": "13.2.3", - "@polkadot/x-textencoder": "13.2.3", + "@polkadot/x-bigint": "13.4.3", + "@polkadot/x-global": "13.4.3", + "@polkadot/x-textdecoder": "13.4.3", + "@polkadot/x-textencoder": "13.4.3", "@types/bn.js": "^5.1.6", "bn.js": "^5.2.1", "tslib": "^2.8.0" @@ -2070,19 +2153,19 @@ } }, "node_modules/@polkadot/util-crypto": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-13.2.3.tgz", - "integrity": "sha512-5sbggmLbn5eiuVMyPROPlT5roHRqdKHOfSpioNbGvGIZ1qIWVoC1RfsK0NWJOVGDzy6DpQe0KYT/kgcU5Xsrzw==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-13.4.3.tgz", + "integrity": "sha512-Ml0mjhKVetMrRCIosmVNMa6lbFPa3fSAeOggf34NsDIIQOKt9FL644iGz1ZSMOnBwN9qk2qHYmcFMTDXX2yKVQ==", "license": "Apache-2.0", "dependencies": { "@noble/curves": "^1.3.0", "@noble/hashes": "^1.3.3", - "@polkadot/networks": "13.2.3", - "@polkadot/util": "13.2.3", + "@polkadot/networks": "13.4.3", + "@polkadot/util": "13.4.3", "@polkadot/wasm-crypto": "^7.4.1", "@polkadot/wasm-util": "^7.4.1", - "@polkadot/x-bigint": "13.2.3", - "@polkadot/x-randomvalues": "13.2.3", + "@polkadot/x-bigint": "13.4.3", + "@polkadot/x-randomvalues": "13.4.3", "@scure/base": "^1.1.7", "tslib": "^2.8.0" }, @@ -2090,27 +2173,7 @@ "node": ">=18" }, "peerDependencies": { - "@polkadot/util": "13.2.3" - } - }, - "node_modules/@polkadot/util-crypto/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==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@polkadot/util-crypto/node_modules/@scure/base": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.1.tgz", - "integrity": "sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" + "@polkadot/util": "13.4.3" } }, "node_modules/@polkadot/wasm-bridge": { @@ -2218,12 +2281,12 @@ } }, "node_modules/@polkadot/x-bigint": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-13.2.3.tgz", - "integrity": "sha512-VKgEAh0LsxTd/Hg517Tt5ZU4CySjBwMpaojbkjgv3fOdg1cN7t4eFEUxpyj7mlO0cp22SzDh7nmy4TO98qhLQA==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-13.4.3.tgz", + "integrity": "sha512-8NbjF5Q+5lflhvDFve58wULjCVcvXa932LKFtI5zL2gx5VDhMgyfkNcYRjHB18Ecl21963JuGzvGVTZNkh/i6g==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.2.3", + "@polkadot/x-global": "13.4.3", "tslib": "^2.8.0" }, "engines": { @@ -2231,12 +2294,12 @@ } }, "node_modules/@polkadot/x-fetch": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-13.2.3.tgz", - "integrity": "sha512-7Nmk+8ieEGzz43nc1rX6nH3rQo6rhGmAaIXJWnXY9gOHY0k1me1bJYbP+xDdh8vcLh8eY3D1sESUwG6QYZW2lg==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-13.4.3.tgz", + "integrity": "sha512-EwhcwROqWa7mvNTbLVNH71Hbyp5PW5j9lV2UpII5MZzRO95eYwV4oP/xgtTxC+60nC8lrvzAw0JxEHrmNzmtlg==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.2.3", + "@polkadot/x-global": "13.4.3", "node-fetch": "^3.3.2", "tslib": "^2.8.0" }, @@ -2245,9 +2308,9 @@ } }, "node_modules/@polkadot/x-global": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-13.2.3.tgz", - "integrity": "sha512-7MYQIAEwBkRcNrgqac5PbB0kNPlI6ISJEy6/Nb+crj8BFjQ8rf11PF49fq0QsvDeuYM1aNLigrvYZNptQs4lbw==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-13.4.3.tgz", + "integrity": "sha512-6c98kxZdoGRct3ua9Dz6/qz8wb3XFRUkaY+4+RzIgehKMPhu19pGWTrzmbJSyY9FtIpThuWKuDaBEvd5KgSxjA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -2257,29 +2320,29 @@ } }, "node_modules/@polkadot/x-randomvalues": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-13.2.3.tgz", - "integrity": "sha512-Zf0GTfLmVk+VzPUmcQSpXjjmFzMTjPhXoLuIoE7xIu73T+vQ+TX9j7DvorN6bIRsnZ9l1SyTZsSf/NTjNZKIZg==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-13.4.3.tgz", + "integrity": "sha512-pskXP/S2jROZ6aASExsUFlNp7GbJvQikKogvyvMMCzNIbUYLxpLuquLRa3MOORx2c0SNsENg90cx/zHT+IjPRQ==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.2.3", + "@polkadot/x-global": "13.4.3", "tslib": "^2.8.0" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@polkadot/util": "13.2.3", + "@polkadot/util": "13.4.3", "@polkadot/wasm-util": "*" } }, "node_modules/@polkadot/x-textdecoder": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-13.2.3.tgz", - "integrity": "sha512-i8hRXPtGknmdm3FYv6/94I52VXHJZa5sgYNw1+Hqb4Jqmq4awUjea35CKXd/+aw70Qn8Ngg31l2GoiH494fa+Q==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-13.4.3.tgz", + "integrity": "sha512-k7Wg6csAPxfNtpBt3k5yUuPHYmRl/nl7H2OMr40upMjbZXbQ1RJW9Z3GBkLmQczG7NwwfAXHwQE9FYOMUtbuRQ==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.2.3", + "@polkadot/x-global": "13.4.3", "tslib": "^2.8.0" }, "engines": { @@ -2287,12 +2350,12 @@ } }, "node_modules/@polkadot/x-textencoder": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-13.2.3.tgz", - "integrity": "sha512-wJI3Bb/dC4zyBXJFm5+ZhyBXWoI5wvP8k8qX0/ZC0PQsgSAqs7LVhiofk4Wd94n0P41W5re58LrGXLyziSAshw==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-13.4.3.tgz", + "integrity": "sha512-byl2LbN1rnEXKmnsCzEDaIjSIHAr+1ciSe2yj3M0K+oWEEcaFZEovJaf/uoyzkcjn+/l8rDv3nget6mPuQ/DSw==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.2.3", + "@polkadot/x-global": "13.4.3", "tslib": "^2.8.0" }, "engines": { @@ -2300,12 +2363,12 @@ } }, "node_modules/@polkadot/x-ws": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-13.2.3.tgz", - "integrity": "sha512-Y6MTAWgcnrnx/LkBx65X3ZyoJH5EFj3tXtflRoKg1+PLHSLuNBV7Wi5mLcE70z4e5c+4hgBbLq+8SqCqzFtSPw==", + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-13.4.3.tgz", + "integrity": "sha512-GS0I6MYLD/xNAAjODZi/pbG7Ba0e/5sbvDIrT01iKH3SPGN+PZoyAsc04t2IOXA6QmPa1OBHnaU3N4K8gGmJ+w==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.2.3", + "@polkadot/x-global": "13.4.3", "tslib": "^2.8.0", "ws": "^8.18.0" }, @@ -2340,48 +2403,120 @@ "license": "MIT" }, "node_modules/@scure/base": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", - "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.4.tgz", + "integrity": "sha512-5Yy9czTO47mqz+/J8GM6GIId4umdCk1wc1q8rKERQulIoc8VP9pzDcghv10Tl2E7R96ZUx/PhND3ESYUQX8NuQ==", + "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip32": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", - "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz", + "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==", + "dev": true, + "license": "MIT", "dependencies": { - "@noble/hashes": "~1.1.1", - "@noble/secp256k1": "~1.6.0", - "@scure/base": "~1.1.0" + "@noble/curves": "~1.2.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/@scure/bip39": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", - "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "dev": true, + "license": "MIT", "dependencies": { - "@noble/hashes": "~1.1.1", + "@noble/hashes": "~1.3.0", "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/@sentry/core": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -2396,12 +2531,14 @@ "node_modules/@sentry/core/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sentry/hub": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", @@ -2414,12 +2551,14 @@ "node_modules/@sentry/hub/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sentry/minimal": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", @@ -2432,12 +2571,14 @@ "node_modules/@sentry/minimal/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sentry/node": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", @@ -2453,23 +2594,17 @@ "node": ">=6" } }, - "node_modules/@sentry/node/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/@sentry/node/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sentry/tracing": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "license": "MIT", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -2484,12 +2619,14 @@ "node_modules/@sentry/tracing/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sentry/types": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "license": "BSD-3-Clause", "engines": { "node": ">=6" } @@ -2498,6 +2635,7 @@ "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" @@ -2509,24 +2647,26 @@ "node_modules/@sentry/utils/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" }, "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/is?sponsor=1" } }, "node_modules/@solidity-parser/parser": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", - "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.19.0.tgz", + "integrity": "sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==", "dev": true, "license": "MIT" }, @@ -2545,16 +2685,16 @@ } }, "node_modules/@substrate/connect-extension-protocol": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-2.2.1.tgz", - "integrity": "sha512-GoafTgm/Jey9E4Xlj4Z5ZBt/H4drH2CNq8VrAro80rtoznrXnFDNVivLQzZN0Xaj2g8YXSn9pC9Oc9IovYZJXw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-2.2.2.tgz", + "integrity": "sha512-t66jwrXA0s5Goq82ZtjagLNd7DPGCNjHeehRlE/gcJmJ+G56C0W+2plqOMRicJ8XGR1/YFnUSEqUFiSNbjGrAA==", "license": "GPL-3.0-only", "optional": true }, "node_modules/@substrate/connect-known-chains": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@substrate/connect-known-chains/-/connect-known-chains-1.8.1.tgz", - "integrity": "sha512-WkqXvuLWL1g136nxAoGkclybsVpo8claHeBl/8iA99ECAk4pWLtoCh8PoYrFEE1HfY4rk+A0krPybDlcDa/G4g==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@substrate/connect-known-chains/-/connect-known-chains-1.9.3.tgz", + "integrity": "sha512-CPcykiKcVuG4J424gNUFak4AdIJ1sXbu/Bk1IGVPOz74NlBO8EvUyRlpPA7IY0vEf7/n4HQ1gEN5lfgERo4q3w==", "license": "GPL-3.0-only", "optional": true }, @@ -2588,6 +2728,7 @@ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dev": true, + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -2596,24 +2737,39 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "license": "MIT" }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } }, "node_modules/@typechain/ethers-v6": { "version": "0.5.1", @@ -2652,6 +2808,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -2662,27 +2819,6 @@ "node": ">=10" } }, - "node_modules/@typechain/hardhat/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@typechain/hardhat/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@types/bn.js": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.6.tgz", @@ -2692,18 +2828,6 @@ "@types/node": "*" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, "node_modules/@types/chai": { "version": "4.3.20", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", @@ -2712,10 +2836,11 @@ "license": "MIT" }, "node_modules/@types/chai-as-promised": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", - "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", + "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", "dev": true, + "license": "MIT", "dependencies": { "@types/chai": "*" } @@ -2725,16 +2850,18 @@ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimatch": "*", "@types/node": "*" } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA==", - "dev": true + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -2743,25 +2870,18 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "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==" + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mocha": { "version": "10.0.10", @@ -2771,72 +2891,61 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", + "version": "22.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", + "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, - "node_modules/@types/node/node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "license": "MIT" - }, "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "license": "MIT" }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + "license": "MIT" }, "node_modules/@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz", - "integrity": "sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==", + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz", + "integrity": "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/type-utils": "8.18.1", - "@typescript-eslint/utils": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/type-utils": "8.29.1", + "@typescript-eslint/utils": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2848,20 +2957,20 @@ "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", - "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==", + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.1.tgz", + "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/typescript-estree": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/typescript-estree": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", "debug": "^4.3.4" }, "engines": { @@ -2873,18 +2982,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz", - "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==", + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz", + "integrity": "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1" + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2895,16 +3004,16 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz", - "integrity": "sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==", + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz", + "integrity": "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.18.1", - "@typescript-eslint/utils": "8.18.1", + "@typescript-eslint/typescript-estree": "8.29.1", + "@typescript-eslint/utils": "8.29.1", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2915,13 +3024,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz", - "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==", + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.1.tgz", + "integrity": "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==", "dev": true, "license": "MIT", "engines": { @@ -2933,20 +3042,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz", - "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==", + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz", + "integrity": "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/visitor-keys": "8.29.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2956,59 +3065,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/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, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz", - "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==", + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.1.tgz", + "integrity": "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/typescript-estree": "8.18.1" + "@typescript-eslint/scope-manager": "8.29.1", + "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/typescript-estree": "8.29.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3019,17 +3089,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz", - "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==", + "version": "8.29.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz", + "integrity": "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.18.1", + "@typescript-eslint/types": "8.29.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -3054,37 +3124,274 @@ } }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, "license": "ISC" }, - "node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.4.1.tgz", + "integrity": "sha512-8Tv+Bsd0BjGwfEedIyor4inw8atppRxM5BdUnIt+3mAm/QXUm7Dw74CHnXpfZKXkp07EXJGiA8hStqCINAWhdw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.4.1.tgz", + "integrity": "sha512-X8c3PhWziEMKAzZz+YAYWfwawi5AEgzy/hmfizAB4C70gMHLKmInJcp1270yYAOs7z07YVFI220pp50z24Jk3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.4.1.tgz", + "integrity": "sha512-UUr/nREy1UdtxXQnmLaaTXFGOcGxPwNIzeJdb3KXai3TKtC1UgNOB9s8KOA4TaxOUBR/qVgL5BvBwmUjD5yuVA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.4.1.tgz", + "integrity": "sha512-e3pII53dEeS8inkX6A1ad2UXE0nuoWCqik4kOxaDnls0uJUq0ntdj5d9IYd+bv5TDwf9DSge/xPOvCmRYH+Tsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.4.1.tgz", + "integrity": "sha512-e/AKKd9gR+HNmVyDEPI/PIz2t0DrA3cyonHNhHVjrkxe8pMCiYiqhtn1+h+yIpHUtUlM6Y1FNIdivFa+r7wrEQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.4.1.tgz", + "integrity": "sha512-vtIu34luF1jRktlHtiwm2mjuE8oJCsFiFr8hT5+tFQdqFKjPhbJXn83LswKsOhy0GxAEevpXDI4xxEwkjuXIPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.4.1.tgz", + "integrity": "sha512-H3PaOuGyhFXiyJd+09uPhGl4gocmhyi1BRzvsP8Lv5AQO3p3/ZY7WjV4t2NkBksm9tMjf3YbOVHyPWi2eWsNYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.4.1.tgz", + "integrity": "sha512-4+GmJcaaFntCi1S01YByqp8wLMjV/FyQyHVGm0vedIhL1Vfx7uHkz/sZmKsidRwokBGuxi92GFmSzqT2O8KcNA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.4.1.tgz", + "integrity": "sha512-6RDQVCmtFYTlhy89D5ixTqo9bTQqFhvNN0Ey1wJs5r+01Dq15gPHRXv2jF2bQATtMrOfYwv+R2ZR9ew1N1N3YQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.4.1.tgz", + "integrity": "sha512-XpU9uzIkD86+19NjCXxlVPISMUrVXsXo5htxtuG+uJ59p5JauSRZsIxQxzzfKzkxEjdvANPM/lS1HFoX6A6QeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.4.1.tgz", + "integrity": "sha512-3CDjG/spbTKCSHl66QP2ekHSD+H34i7utuDIM5gzoNBcZ1gTO0Op09Wx5cikXnhORRf9+HyDWzm37vU1PLSM1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.4.1.tgz", + "integrity": "sha512-50tYhvbCTnuzMn7vmP8IV2UKF7ITo1oihygEYq9wW2DUb/Y+QMqBHJUSCABRngATjZ4shOK6f2+s0gQX6ElENQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.8" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.4.1.tgz", + "integrity": "sha512-KyJiIne/AqV4IW0wyQO34wSMuJwy3VxVQOfIXIPyQ/Up6y/zi2P/WwXb78gHsLiGRUqCA9LOoCX+6dQZde0g1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.4.1.tgz", + "integrity": "sha512-y2NUD7pygrBolN2NoXUrwVqBpKPhF8DiSNE5oB5/iFO49r2DpoYqdj5HPb3F42fPBH5qNqj6Zg63+xCEzAD2hw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.4.1.tgz", + "integrity": "sha512-hVXaObGI2lGFmrtT77KSbPQ3I+zk9IU500wobjk0+oX59vg/0VqAzABNtt3YSQYgXTC2a/LYxekLfND/wlt0yQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/abitype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", + "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" @@ -3101,9 +3408,13 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -3112,19 +3423,22 @@ "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "license": "MIT", "engines": { "node": ">=0.3.0" } }, "node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "license": "MIT" }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", "dependencies": { "debug": "4" }, @@ -3136,6 +3450,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -3149,6 +3464,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3165,6 +3481,7 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, + "license": "BSD-3-Clause OR MIT", "optional": true, "engines": { "node": ">=0.4.2" @@ -3174,29 +3491,42 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", "dependencies": { "string-width": "^4.1.0" } }, "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "license": "MIT", "dependencies": { - "environment": "^1.0.0" + "type-fest": "^0.21.3" }, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3206,6 +3536,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } @@ -3214,6 +3545,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -3238,6 +3570,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3249,31 +3582,34 @@ "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/array-back": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -3308,23 +3644,25 @@ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3334,17 +3672,17 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, "engines": { "node": ">= 0.4" }, @@ -3353,16 +3691,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -3372,20 +3710,19 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -3399,26 +3736,31 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/assertion-tools": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/assertion-tools/-/assertion-tools-2.2.1.tgz", - "integrity": "sha512-JlA1S16Ox93PnYb45HvxNcax/Ii4gqTO8HLGa/ykj/ddp8EEHlokn6inJR2yMiz173WSFkCc0ciLJzGeaYBANw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/assertion-tools/-/assertion-tools-8.0.1.tgz", + "integrity": "sha512-9LJf5O3X30/UcDs5FyBJ+pLJl3dWbIKgTC3REMuJjhqtTMu7W3Dl0AOPg/HBxWYIYMPjBQtSK6KUKdpX6QrHHg==", "dev": true, + "hasInstallScript": true, "license": "ISC", "dependencies": { "ethers": "^5.7.2", "jsonld": "^8.1.0", - "merkletreejs": "^0.3.2" + "merkletreejs": "^0.3.2", + "n3": "^1.23.1", + "rdf-canonize": "^4.0.1", + "uuid": "^8.3.2" } }, "node_modules/assertion-tools/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", "dev": true, "funding": [ { @@ -3432,36 +3774,36 @@ ], "license": "MIT", "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" } }, "node_modules/ast-parents": { @@ -3485,18 +3827,31 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "engines": { "node": ">= 4.0.0" } @@ -3521,6 +3876,7 @@ "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.14.0" } @@ -3528,52 +3884,84 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==", + "license": "MIT" }, "node_modules/bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.2.0.tgz", + "integrity": "sha512-JocpCSOixzy5XFJi2ub6IMmV/G9i8Lrm2lZvwBv9xPdglmZM0ufDVBbjbrfU/zuLvBfD7Bv2eYxz9i+OHTgkew==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "license": "MIT" }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "license": "MIT" }, "node_modules/boxen": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "license": "MIT", "dependencies": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", @@ -3592,18 +3980,19 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -3614,7 +4003,8 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" }, "node_modules/brotli-wasm": { "version": "2.0.1", @@ -3626,12 +4016,14 @@ "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "license": "ISC" }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -3645,6 +4037,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", "dependencies": { "base-x": "^3.0.2" } @@ -3653,112 +4046,148 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "license": "MIT", "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", "safe-buffer": "^5.1.2" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" }, "node_modules/buffer-reverse": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, - "node_modules/bufferutil": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", - "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "license": "MIT" }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10.6.0" + "node": ">=14.16" } }, "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "dev": true, + "license": "MIT", "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.16" } }, "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -3772,14 +4201,16 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -3791,7 +4222,8 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/chai": { "version": "4.5.0", @@ -3813,21 +4245,23 @@ } }, "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", + "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", "dev": true, + "license": "WTFPL", "dependencies": { "check-error": "^1.0.2" }, "peerDependencies": { - "chai": ">= 2.1.2 < 5" + "chai": ">= 2.1.2 < 6" } }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -3863,60 +4297,44 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "readdirp": "^4.0.1" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" + "node": ">= 14.16.0" }, - "engines": { - "node": ">=8.10.0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "license": "MIT" }, "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", "engines": { "node": ">=6" } @@ -3925,6 +4343,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -3953,6 +4372,7 @@ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, + "license": "MIT", "dependencies": { "string-width": "^4.2.0" }, @@ -3993,56 +4413,13 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cli-truncate/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true, "license": "MIT" }, - "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/cli-truncate/node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -4081,28 +4458,18 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -4113,7 +4480,8 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" }, "node_modules/colorette": { "version": "2.0.20", @@ -4126,6 +4494,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -4144,6 +4513,7 @@ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", @@ -4159,6 +4529,7 @@ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", @@ -4174,6 +4545,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -4186,6 +4558,7 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -4195,6 +4568,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4209,6 +4583,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -4217,13 +4592,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/command-line-usage/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -4233,6 +4610,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -4242,6 +4620,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -4254,24 +4633,27 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", "dev": true, "license": "MIT", "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" }, "node_modules/config-chain": { "version": "1.1.13", @@ -4284,6 +4666,15 @@ "proto-list": "~1.2.1" } }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cosmiconfig": { "version": "8.3.6", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", @@ -4315,6 +4706,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -4327,6 +4719,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -4339,13 +4732,15 @@ "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "license": "MIT" }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.1" }, @@ -4360,10 +4755,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4387,26 +4783,28 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", "engines": { "node": ">= 12" } }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4416,31 +4814,31 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -4478,6 +4876,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4490,6 +4889,7 @@ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -4505,6 +4905,7 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4513,10 +4914,11 @@ } }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -4529,6 +4931,7 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.0.0" } @@ -4537,13 +4940,15 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -4552,6 +4957,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", @@ -4587,6 +4993,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -4596,6 +5003,7 @@ "resolved": "https://registry.npmjs.org/delete-empty/-/delete-empty-3.0.0.tgz", "integrity": "sha512-ZUyiwo76W+DYnKsL3Kim6M/UOavPdBJgDYWOmuQhYaZvJH0AXAHbUNyEDtRbBra8wqqr686+63/0azfEk1ebUQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.0", "minimist": "^1.2.0", @@ -4609,12 +5017,59 @@ "node": ">=10" } }, + "node_modules/delete-empty/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/delete-empty/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/delete-empty/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/delete-empty/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -4626,14 +5081,16 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } @@ -4655,6 +5112,7 @@ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -4667,6 +5125,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -4686,16 +5145,32 @@ "url": "https://dotenvx.com" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -4707,54 +5182,31 @@ } }, "node_modules/elliptic/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==" - }, - "node_modules/elliptic/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT" }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, "node_modules/encode-utf8": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } + "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==", + "license": "MIT" }, "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "license": "MIT", "dependencies": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8.6" @@ -4764,6 +5216,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4786,63 +5239,69 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.23.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", - "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" @@ -4852,13 +5311,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -4873,10 +5329,9 @@ } }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -4886,28 +5341,31 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { @@ -4929,9 +5387,10 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -4940,6 +5399,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4952,6 +5412,7 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esprima": "^2.7.1", "estraverse": "^1.9.1", @@ -4969,19 +5430,6 @@ "source-map": "~0.2.0" } }, - "node_modules/escodegen/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/escodegen/node_modules/estraverse": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", @@ -4996,6 +5444,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -5009,6 +5458,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -5035,6 +5485,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "~1.1.2" }, @@ -5135,26 +5586,25 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz", - "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.0.tgz", + "integrity": "sha512-aV3/dVsT0/H9BtpNwbaqvl+0xGMRGzncLyhm793NFGvbwGGvzyAykqWZ8oZlZuGwuHkwJjhWJkG1cM3ynvd2pQ==", "dev": true, "license": "ISC", "dependencies": { "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.7", - "enhanced-resolve": "^5.15.0", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", - "is-glob": "^4.0.3", - "stable-hash": "^0.0.4" + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.12", + "unrs-resolver": "^1.3.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + "url": "https://opencollective.com/eslint-import-resolver-typescript" }, "peerDependencies": { "eslint": "*", @@ -5232,10 +5682,21 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5247,6 +5708,7 @@ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -5254,6 +5716,29 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-mocha": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz", @@ -5273,14 +5758,14 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz", + "integrity": "sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ==", "dev": true, "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" + "synckit": "^0.11.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -5291,7 +5776,7 @@ "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", - "eslint-config-prettier": "*", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -5325,6 +5810,7 @@ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -5343,6 +5829,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10" } @@ -5360,16 +5847,28 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10.13.0" + "node": "*" } }, "node_modules/espree": { @@ -5390,6 +5889,20 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -5431,56 +5944,26 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz", + "integrity": "sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==", "dev": true, - "dependencies": { - "js-sha3": "^0.8.0" - } - }, - "node_modules/ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", - "dependencies": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" - } - }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "git+ssh://git@github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0", "license": "MIT", "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==", - "dependencies": { - "@types/node": "*" + "@noble/hashes": "^1.4.0" } }, - "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==" - }, - "node_modules/ethereumjs-abi/node_modules/ethereum-cryptography": { + "node_modules/ethereum-cryptography": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -5499,10 +5982,37 @@ "setimmediate": "^1.0.5" } }, + "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.", + "license": "MIT", + "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==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT" + }, "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==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -5518,6 +6028,7 @@ "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dev": true, + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -5529,33 +6040,10 @@ "node": ">=10.0.0" } }, - "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/ethers": { - "version": "6.13.4", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz", - "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==", + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.5.tgz", + "integrity": "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==", "funding": [ { "type": "individual", @@ -5580,12 +6068,6 @@ "node": ">=14.0.0" } }, - "node_modules/ethers/node_modules/@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", - "license": "MIT" - }, "node_modules/ethers/node_modules/@noble/curves": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", @@ -5619,18 +6101,18 @@ "undici-types": "~6.19.2" } }, - "node_modules/ethers/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "license": "MIT" - }, "node_modules/ethers/node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", "license": "0BSD" }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, "node_modules/ethers/node_modules/ws": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", @@ -5657,6 +6139,7 @@ "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -5670,12 +6153,14 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true + "dev": true, + "license": "MIT" }, "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==", + "license": "MIT", "dependencies": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -5690,6 +6175,7 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5700,10 +6186,21 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", "license": "MIT" }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/evp_bytestokey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "license": "MIT", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -5733,35 +6230,24 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -5769,36 +6255,62 @@ "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "license": "BSD-3-Clause" }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } @@ -5817,6 +6329,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" @@ -5830,6 +6343,7 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -5841,6 +6355,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -5853,6 +6368,7 @@ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^3.0.1" }, @@ -5864,6 +6380,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -5879,17 +6396,20 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, + "license": "MIT", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -5897,29 +6417,32 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" }, "node_modules/fmix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", + "license": "MIT", "dependencies": { "imul": "^1.0.0" } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -5930,22 +6453,29 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -5956,12 +6486,14 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -5969,15 +6501,20 @@ } }, "node_modules/form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", - "dev": true + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.17" + } }, "node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", "dependencies": { "fetch-blob": "^3.1.2" }, @@ -5988,12 +6525,13 @@ "node_modules/fp-ts": { "version": "1.19.3", "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==", + "license": "MIT" }, "node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, "license": "MIT", "dependencies": { @@ -6005,39 +6543,18 @@ "node": ">=14.14" } }, - "node_modules/fs-extra/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/fs-extra/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -6056,16 +6573,18 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -6088,6 +6607,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -6116,16 +6636,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6134,28 +6659,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -6165,9 +6704,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", "dev": true, "license": "MIT", "dependencies": { @@ -6182,6 +6721,7 @@ "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", "dev": true, + "license": "ISC", "dependencies": { "chalk": "^2.4.2", "node-emoji": "^1.10.0" @@ -6195,6 +6735,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -6207,6 +6748,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -6221,6 +6763,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -6229,13 +6772,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -6245,6 +6790,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -6254,6 +6800,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -6262,31 +6809,37 @@ } }, "node_modules/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, + "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/global-modules": { @@ -6294,6 +6847,7 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -6306,6 +6860,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -6320,6 +6875,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -6360,6 +6916,72 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/globby/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -6373,24 +6995,23 @@ } }, "node_modules/got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", "dev": true, + "license": "MIT", "dependencies": { - "@sindresorhus/is": "^4.6.0", + "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", + "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" + "responselike": "^3.0.0" }, "engines": { "node": ">=14.16" @@ -6399,10 +7020,23 @@ "url": "https://github.com/sindresorhus/got?sponsor=1" } }, + "node_modules/got/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, "node_modules/graphemer": { @@ -6417,6 +7051,7 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -6438,19 +7073,20 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/hardhat": { - "version": "2.22.17", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.17.tgz", - "integrity": "sha512-tDlI475ccz4d/dajnADUTRc1OJ3H8fpP9sWhXhBPpYsQOg8JHq5xrDimo53UhWPl7KJmAeDCm1bFG74xvpGRpg==", + "version": "2.22.19", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.19.tgz", + "integrity": "sha512-jptJR5o6MCgNbhd7eKa3mrteR+Ggq1exmE5RUL5ydQEVKcZm0sss5laa86yZ0ixIavIvF4zzS7TdGDuyopj0sQ==", "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/edr": "^0.6.5", + "@nomicfoundation/edr": "^0.8.0", "@nomicfoundation/ethereumjs-common": "4.0.4", "@nomicfoundation/ethereumjs-tx": "5.0.4", "@nomicfoundation/ethereumjs-util": "9.0.4", @@ -6510,12 +7146,13 @@ } }, "node_modules/hardhat-abi-exporter": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/hardhat-abi-exporter/-/hardhat-abi-exporter-2.10.1.tgz", - "integrity": "sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/hardhat-abi-exporter/-/hardhat-abi-exporter-2.11.0.tgz", + "integrity": "sha512-hBC4Xzncew9pdqVpzWoEEBJUthp99TCH39cHlMehVxBBQ6EIsIFyj3N0yd0hkVDfM8/s/FMRAuO5jntZBpwCZQ==", "dev": true, + "license": "MIT", "dependencies": { - "@ethersproject/abi": "^5.5.0", + "@ethersproject/abi": "^5.7.0", "delete-empty": "^3.0.0" }, "engines": { @@ -6530,6 +7167,7 @@ "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz", "integrity": "sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "cli-table3": "^0.6.0", @@ -6582,10 +7220,34 @@ "hardhat-deploy": "^0.12.0" } }, + "node_modules/hardhat-deploy/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/hardhat-deploy/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", "funding": [ { "type": "individual", @@ -6598,42 +7260,43 @@ ], "license": "MIT", "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" } }, "node_modules/hardhat-deploy/node_modules/fs-extra": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -6643,23 +7306,28 @@ "node": ">=12" } }, - "node_modules/hardhat-deploy/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/hardhat-deploy/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { - "universalify": "^2.0.0" + "is-glob": "^4.0.1" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">= 6" } }, - "node_modules/hardhat-deploy/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "node_modules/hardhat-deploy/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, "engines": { - "node": ">= 10.0.0" + "node": ">=8.10.0" } }, "node_modules/hardhat-gas-reporter": { @@ -6715,8 +7383,18 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/hardhat-gas-reporter/node_modules/@scure/bip32": { - "version": "1.4.0", + "node_modules/hardhat-gas-reporter/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/hardhat-gas-reporter/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, @@ -6744,39 +7422,10 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/hardhat-gas-reporter/node_modules/@solidity-parser/parser": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.19.0.tgz", - "integrity": "sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==", - "dev": true, - "license": "MIT" - }, - "node_modules/hardhat-gas-reporter/node_modules/abitype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", - "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/wevm" - }, - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, "node_modules/hardhat-gas-reporter/node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", "dev": true, "license": "MIT", "dependencies": { @@ -6785,16 +7434,6 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/hardhat-gas-reporter/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/hardhat-gas-reporter/node_modules/ethereum-cryptography": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", @@ -6808,151 +7447,202 @@ "@scure/bip39": "1.3.0" } }, - "node_modules/hardhat-gas-reporter/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "node_modules/hardhat-tracer": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hardhat-tracer/-/hardhat-tracer-3.1.0.tgz", + "integrity": "sha512-Ip16HQAuzbqbNJUIEVfqmbPmOY90bxZSpwu5Q73cwloy+LUYA04BATUM9Gui5H7zcgsgZ1IVy7pSYn6ZMjLmag==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "chalk": "^4.1.2", + "debug": "^4.3.4", + "ethers": "^5.6.1", + "semver": "^7.6.2" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "chai": "4.x", + "hardhat": ">=2.22.5 <3.x" } }, - "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-tracer/node_modules/ethers": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.8.0.tgz", + "integrity": "sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==", "dev": true, - "license": "ISC", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, + "@ethersproject/abi": "5.8.0", + "@ethersproject/abstract-provider": "5.8.0", + "@ethersproject/abstract-signer": "5.8.0", + "@ethersproject/address": "5.8.0", + "@ethersproject/base64": "5.8.0", + "@ethersproject/basex": "5.8.0", + "@ethersproject/bignumber": "5.8.0", + "@ethersproject/bytes": "5.8.0", + "@ethersproject/constants": "5.8.0", + "@ethersproject/contracts": "5.8.0", + "@ethersproject/hash": "5.8.0", + "@ethersproject/hdnode": "5.8.0", + "@ethersproject/json-wallets": "5.8.0", + "@ethersproject/keccak256": "5.8.0", + "@ethersproject/logger": "5.8.0", + "@ethersproject/networks": "5.8.0", + "@ethersproject/pbkdf2": "5.8.0", + "@ethersproject/properties": "5.8.0", + "@ethersproject/providers": "5.8.0", + "@ethersproject/random": "5.8.0", + "@ethersproject/rlp": "5.8.0", + "@ethersproject/sha2": "5.8.0", + "@ethersproject/signing-key": "5.8.0", + "@ethersproject/solidity": "5.8.0", + "@ethersproject/strings": "5.8.0", + "@ethersproject/transactions": "5.8.0", + "@ethersproject/units": "5.8.0", + "@ethersproject/wallet": "5.8.0", + "@ethersproject/web": "5.8.0", + "@ethersproject/wordlists": "5.8.0" + } + }, + "node_modules/hardhat/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/hardhat/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "license": "MIT", "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==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" + "node_modules/hardhat/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" } }, - "node_modules/hardhat-gas-reporter/node_modules/viem": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.7.14.tgz", - "integrity": "sha512-5b1KB1gXli02GOQHZIUsRluNUwssl2t4hqdFAzyWPwJ744N83jAOBOjOkrGz7K3qMIv9b0GQt3DoZIErSQTPkQ==", - "dev": true, + "node_modules/hardhat/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/wevm" + "type": "individual", + "url": "https://paulmillr.com/funding/" } ], "license": "MIT", "dependencies": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@scure/bip32": "1.3.2", - "@scure/bip39": "1.2.1", - "abitype": "1.0.0", - "isows": "1.0.3", - "ws": "8.13.0" - }, - "peerDependencies": { - "typescript": ">=5.0.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" } }, - "node_modules/hardhat-gas-reporter/node_modules/viem/node_modules/@noble/curves": { + "node_modules/hardhat/node_modules/ethereum-cryptography": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "dev": true, + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, - "node_modules/hardhat-gas-reporter/node_modules/viem/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "dev": true, + "node_modules/hardhat/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "license": "MIT", - "engines": { - "node": ">= 16" + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/hardhat-gas-reporter/node_modules/viem/node_modules/@scure/bip32": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz", - "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==", - "dev": true, + "node_modules/hardhat/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "license": "MIT", - "dependencies": { - "@noble/curves": "~1.2.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/hardhat-gas-reporter/node_modules/viem/node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", - "dev": true, + "node_modules/hardhat/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "license": "MIT", "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" + "path-parse": "^1.0.6" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat-gas-reporter/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, + "node_modules/hardhat/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/hardhat/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">= 4.0.0" + } + }, + "node_modules/hardhat/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -6963,222 +7653,24 @@ } } }, - "node_modules/hardhat-tracer": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hardhat-tracer/-/hardhat-tracer-3.1.0.tgz", - "integrity": "sha512-Ip16HQAuzbqbNJUIEVfqmbPmOY90bxZSpwu5Q73cwloy+LUYA04BATUM9Gui5H7zcgsgZ1IVy7pSYn6ZMjLmag==", + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "debug": "^4.3.4", - "ethers": "^5.6.1", - "semver": "^7.6.2" + "engines": { + "node": ">= 0.4" }, - "peerDependencies": { - "chai": "4.x", - "hardhat": ">=2.22.5 <3.x" - } - }, - "node_modules/hardhat-tracer/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/hardhat-tracer/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hardhat/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hardhat/node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/hardhat/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/hardhat/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/hardhat/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hardhat/node_modules/solc": { - "version": "0.8.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz", - "integrity": "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==", - "license": "MIT", - "dependencies": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solc.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/hardhat/node_modules/solc/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/hardhat/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hardhat/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "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==", + "license": "MIT", "engines": { "node": ">=8" } @@ -7187,6 +7679,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" @@ -7196,12 +7689,13 @@ } }, "node_modules/has-proto": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", - "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "dunder-proto": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7211,9 +7705,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7225,7 +7720,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -7241,6 +7735,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -7250,15 +7745,11 @@ "node": ">=4" } }, - "node_modules/hash-base/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, "node_modules/hash.js": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -7280,6 +7771,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", "bin": { "he": "bin/he" } @@ -7288,12 +7780,14 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -7304,12 +7798,14 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -7321,16 +7817,12 @@ "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dev": true, + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -7343,6 +7835,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -7381,6 +7874,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -7388,6 +7882,27 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -7399,15 +7914,17 @@ } }, "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "license": "MIT" }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7423,6 +7940,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7432,6 +7950,7 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } @@ -7440,6 +7959,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", "engines": { "node": ">=8" } @@ -7448,32 +7968,36 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7484,6 +8008,7 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -7492,19 +8017,21 @@ "version": "1.10.4", "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "license": "MIT", "dependencies": { "fp-ts": "^1.0.0" } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -7517,16 +8044,21 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7555,6 +8087,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -7563,13 +8096,13 @@ } }, "node_modules/is-boolean-object": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", - "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -7580,26 +8113,13 @@ } }, "node_modules/is-bun-module": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", - "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.6.3" - } - }, - "node_modules/is-bun-module/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "semver": "^7.7.1" } }, "node_modules/is-callable": { @@ -7607,6 +8127,7 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7615,9 +8136,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { @@ -7631,12 +8152,14 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -7647,13 +8170,14 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -7666,18 +8190,19 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-finalizationregistry": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", - "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -7687,20 +8212,29 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7713,6 +8247,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -7724,6 +8259,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "license": "MIT", "engines": { "node": ">=6.5.0", "npm": ">=3" @@ -7742,35 +8278,23 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", - "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -7785,19 +8309,29 @@ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-regex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", - "integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "gopd": "^1.1.0", + "call-bound": "^1.0.2", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" }, @@ -7822,13 +8356,13 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -7851,13 +8385,13 @@ } }, "node_modules/is-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", - "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -7868,15 +8402,15 @@ } }, "node_modules/is-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", - "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "has-symbols": "^1.0.3", - "safe-regex-test": "^1.0.3" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7886,13 +8420,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -7905,6 +8439,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -7926,27 +8461,30 @@ } }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -7966,7 +8504,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isows": { "version": "1.0.3", @@ -8003,7 +8542,8 @@ "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -8016,6 +8556,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -8027,7 +8568,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -8040,13 +8582,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stream-stringify": { "version": "3.1.6", @@ -8077,42 +8621,62 @@ } }, "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/jsonld": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.1.0.tgz", - "integrity": "sha512-6tYhiEVYO3rTcoYCGCArw8SqawuW0hf/cqmaE5WbX44CGb7d8N2UFvmUj9OYkJhChD98bfdPljUj7S39MrzsHg==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.3.3.tgz", + "integrity": "sha512-9YcilrF+dLfg9NTEof/mJLMtbdX1RJ8dbWtJgE00cMOIohb1lIyJl710vFiTaiHTl6ZYODJuBd32xFvUhmv3kg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@digitalbazaar/http-client": "^3.2.0", + "@digitalbazaar/http-client": "^3.4.1", "canonicalize": "^1.0.1", "lru-cache": "^6.0.0", - "rdf-canonize": "^3.0.0" + "rdf-canonize": "^3.4.0" }, "engines": { "node": ">=14" } }, + "node_modules/jsonld/node_modules/rdf-canonize": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.4.0.tgz", + "integrity": "sha512-fUeWjrkOO0t1rg7B2fdyDTvngj+9RlUyL92vOdiB7c0FPguWVsniIMjEtHH+meLBO9rzkUlUzBVXgWrjI8P9LA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "setimmediate": "^1.0.5" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.5.0.tgz", + "integrity": "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==", "dev": true, + "license": "MIT", "engines": { "node": "*" } }, "node_modules/keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -8127,6 +8691,7 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -8136,40 +8701,43 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/ky": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz", - "integrity": "sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==", + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", + "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, "node_modules/ky-universal": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.10.1.tgz", - "integrity": "sha512-r8909k+ELKZAxhVA5c440x22hqw5XcMRwLRbgpPQk4JHy3/ddJnvzcnSo5Ww3HdKdNeS3Y8dBgcIYyVahMa46g==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.11.0.tgz", + "integrity": "sha512-65KyweaWvk+uKKkCrfAf+xqN2/epw1IJDtlyCPxYffFCMR8u1sp2U65NtWpnozYfZxQ6IUzIlvUcw+hQ82U2Xw==", "dev": true, + "license": "MIT", "dependencies": { "abort-controller": "^3.0.0", - "node-fetch": "^3.2.2" + "node-fetch": "^3.2.10" }, "engines": { - "node": ">=14" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/ky-universal?sponsor=1" }, "peerDependencies": { - "ky": ">=0.26.0", - "web-streams-polyfill": ">=3.0.1" + "ky": ">=0.31.4", + "web-streams-polyfill": ">=3.2.1" }, "peerDependenciesMeta": { "web-streams-polyfill": { @@ -8228,22 +8796,22 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "15.2.11", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.11.tgz", - "integrity": "sha512-Ev6ivCTYRTGs9ychvpVw35m/bcNDuBN+mnTeObCL5h+boS5WzBEC6LHI4I9F/++sZm1m+J2LEiy0gxL/R9TBqQ==", + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.0.tgz", + "integrity": "sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "~5.3.0", - "commander": "~12.1.0", - "debug": "~4.4.0", - "execa": "~8.0.1", - "lilconfig": "~3.1.3", - "listr2": "~8.2.5", - "micromatch": "~4.0.8", - "pidtree": "~0.6.0", - "string-argv": "~0.3.2", - "yaml": "~2.6.1" + "chalk": "^5.4.1", + "commander": "^13.1.0", + "debug": "^4.4.0", + "execa": "^8.0.1", + "lilconfig": "^3.1.3", + "listr2": "^8.2.5", + "micromatch": "^4.0.8", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.7.0" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -8256,9 +8824,9 @@ } }, "node_modules/lint-staged/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, "license": "MIT", "engines": { @@ -8268,16 +8836,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lint-staged/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/listr2": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", @@ -8385,6 +8943,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -8398,25 +8957,30 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", + "license": "MIT", "peer": true }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", @@ -8429,6 +8993,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -8460,6 +9025,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/log-update/node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", @@ -8593,6 +9174,7 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8603,13 +9185,15 @@ "node_modules/lru_map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "license": "MIT" }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -8620,7 +9204,8 @@ "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "license": "ISC" }, "node_modules/markdown-table": { "version": "2.0.0", @@ -8637,14 +9222,25 @@ } }, "node_modules/match-all": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz", - "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.7.tgz", + "integrity": "sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -8671,6 +9267,7 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -8680,6 +9277,7 @@ "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.3.11.tgz", "integrity": "sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==", "dev": true, + "license": "MIT", "dependencies": { "bignumber.js": "^9.0.1", "buffer-reverse": "^1.0.1", @@ -8691,6 +9289,13 @@ "node": ">= 7.6.0" } }, + "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, + "license": "MIT" + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -8706,19 +9311,21 @@ } }, "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -8751,88 +9358,114 @@ } }, "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, "bin": { "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/mnemonist": { "version": "0.38.5", "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "license": "MIT", "dependencies": { "obliterator": "^2.0.0" } }, "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" }, "bin": { "_mocha": "bin/_mocha", @@ -8840,75 +9473,69 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/mocha/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=6.0" + "node": ">= 8.10.0" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mocha/node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "engines": { - "node": ">=0.3.1" + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/mocha/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "is-glob": "^4.0.1" }, "engines": { - "node": "*" + "node": ">= 6" } }, "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8916,29 +9543,23 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/mocha/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" + "picomatch": "^2.2.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8.10.0" } }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8968,34 +9589,58 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz", "integrity": "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==", + "license": "MIT", "dependencies": { "encode-utf8": "^1.0.2", "fmix": "^0.1.0", "imul": "^1.0.0" } }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "bin": { - "nanoid": "bin/nanoid.cjs" + "node_modules/n3": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/n3/-/n3-1.24.2.tgz", + "integrity": "sha512-j/3PKmK0MA3tAohDCl9y1JDaNxp8wCnhTtrOOgZ1O17JVtWLkzHsp2jZ8YhY2uS4FWQAm6mExcXvl7C8lwXyaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "queue-microtask": "^1.1.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">=12.0" + } + }, + "node_modules/n3/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "dev": true, + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nock": { "version": "13.5.6", @@ -9014,7 +9659,8 @@ "node_modules/node-addon-api": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", + "license": "MIT" }, "node_modules/node-domexception": { "version": "1.0.0", @@ -9030,6 +9676,7 @@ "url": "https://paypal.me/jimmywarting" } ], + "license": "MIT", "engines": { "node": ">=10.5.0" } @@ -9039,6 +9686,7 @@ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dev": true, + "license": "MIT", "dependencies": { "lodash": "^4.17.21" } @@ -9047,6 +9695,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", @@ -9061,9 +9710,10 @@ } }, "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -9075,6 +9725,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, + "license": "ISC", "dependencies": { "abbrev": "1" }, @@ -9086,17 +9737,19 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9136,6 +9789,7 @@ "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", "dev": true, + "license": "MIT", "dependencies": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -9149,12 +9803,13 @@ "version": "4.11.6", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -9174,15 +9829,17 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -9227,13 +9884,14 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -9245,14 +9903,16 @@ } }, "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "license": "MIT" }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } @@ -9295,21 +9955,42 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" } @@ -9318,6 +9999,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -9332,6 +10014,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -9346,6 +10029,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -9382,24 +10066,12 @@ "dev": true, "license": "BlueOak-1.0.0" }, - "node_modules/package-json/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -9430,6 +10102,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { "node": ">=8" } @@ -9438,6 +10111,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9447,6 +10122,7 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9454,7 +10130,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" }, "node_modules/path-scurry": { "version": "1.11.1", @@ -9480,21 +10157,12 @@ "dev": true, "license": "ISC" }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/path-starts-with": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-starts-with/-/path-starts-with-2.0.1.tgz", "integrity": "sha512-wZ3AeiRBRlNwkdUxvBANh0+esnt38DLffHDujZyRHkqkaKHTglnY2EP5UX3b8rdeiSutgO4y9NEJwXezNP5vHg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9504,6 +10172,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9513,6 +10182,7 @@ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -9521,6 +10191,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "license": "MIT", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -9542,6 +10213,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -9554,6 +10226,7 @@ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, + "license": "MIT", "bin": { "pidtree": "bin/pidtree.js" }, @@ -9566,6 +10239,7 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -9581,9 +10255,9 @@ } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { @@ -9601,9 +10275,9 @@ } }, "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "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": { @@ -9621,6 +10295,7 @@ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -9629,35 +10304,30 @@ } }, "node_modules/prettier-plugin-solidity": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz", - "integrity": "sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.2.tgz", + "integrity": "sha512-VVD/4XlDjSzyPWWCPW8JEleFa8JNKFYac5kNlMjVXemQyQZKfpekPMhFZSePuXB6L+RixlFvWe20iacGjFYrLw==", "dev": true, "license": "MIT", "dependencies": { - "@solidity-parser/parser": "^0.18.0", - "semver": "^7.5.4" + "@solidity-parser/parser": "^0.19.0", + "semver": "^7.6.3" }, "engines": { - "node": ">=16" + "node": ">=18" }, "peerDependencies": { "prettier": ">=2.3.0" } }, - "node_modules/prettier-plugin-solidity/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.6.0" } }, "node_modules/propagate": { @@ -9683,31 +10353,23 @@ "dev": true, "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -9734,13 +10396,15 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9749,15 +10413,17 @@ } }, "node_modules/rambda": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.4.0.tgz", - "integrity": "sha512-A9hihu7dUTLOUCM+I8E61V4kRXnN4DwYeK0DwCBydC1MqNI1PidyAtbtpsJlBBzK4icSctEcCQ1bGcLpBuETUQ==", - "dev": true + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz", + "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==", + "dev": true, + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } @@ -9766,6 +10432,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -9792,22 +10459,34 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/rdf-canonize": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.3.0.tgz", - "integrity": "sha512-gfSNkMua/VWC1eYbSkVaL/9LQhFeOh0QULwv7Or0f+po8pMgQ1blYQFe1r9Mv2GJZXw88Cz/drnAnB9UlNnHfQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-4.0.1.tgz", + "integrity": "sha512-B5ynHt4sasbUafzrvYI2GFARgeFcD8Sx9yXPbg7gEyT2EH76rlCv84kyO6tnxzVbxUN/uJDbK1S/MXh+DsnuTA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "setimmediate": "^1.0.5" }, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -9818,12 +10497,12 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -9847,6 +10526,7 @@ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dev": true, + "license": "MIT", "dependencies": { "minimatch": "^3.0.5" }, @@ -9854,29 +10534,55 @@ "node": ">=6.0.0" } }, + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/reduce-flatten": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/reflect.getprototypeof": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", - "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "which-builtin-type": "^1.1.4" + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -9886,15 +10592,17 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "set-function-name": "^2.0.2" }, "engines": { @@ -9905,9 +10613,9 @@ } }, "node_modules/registry-auth-token": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.3.tgz", - "integrity": "sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.1.0.tgz", + "integrity": "sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw==", "dev": true, "license": "MIT", "dependencies": { @@ -9947,6 +10655,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9962,19 +10671,22 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9983,13 +10695,15 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -10005,26 +10719,21 @@ } }, "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, + "license": "MIT", "dependencies": { - "lowercase-keys": "^2.0.0" + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/restore-cursor": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", @@ -10059,10 +10768,11 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -10079,7 +10789,9 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -10090,10 +10802,57 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -10103,6 +10862,7 @@ "version": "2.2.7", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "license": "MPL-2.0", "dependencies": { "bn.js": "^5.2.0" }, @@ -10129,29 +10889,31 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -10178,18 +10940,36 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -10201,13 +10981,15 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" }, "node_modules/sc-istanbul": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "abbrev": "1.0.x", "async": "1.x", @@ -10233,21 +11015,20 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, - "node_modules/sc-istanbul/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "node_modules/sc-istanbul/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/sc-istanbul/node_modules/glob": { @@ -10256,6 +11037,7 @@ "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "inflight": "^1.0.4", "inherits": "2", @@ -10272,6 +11054,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10281,6 +11064,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -10294,6 +11078,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -10302,29 +11087,32 @@ "node": ">=4" } }, - "node_modules/sc-istanbul/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/sc-istanbul/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "license": "ISC", "dependencies": { - "minimist": "^1.2.6" + "brace-expansion": "^1.1.7" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": "*" } }, "node_modules/sc-istanbul/node_modules/resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sc-istanbul/node_modules/supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^1.0.0" }, @@ -10337,6 +11125,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -10354,34 +11143,48 @@ "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", + "license": "MIT" }, "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==", "hasInstallScript": true, + "license": "MIT", "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", + "elliptic": "^6.5.7", + "node-addon-api": "^5.0.0", "node-gyp-build": "^4.2.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } }, + "node_modules/secp256k1/node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "license": "MIT" + }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -10390,6 +11193,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", @@ -10419,20 +11223,38 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -10460,6 +11282,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -10472,6 +11295,7 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -10481,6 +11305,7 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -10493,14 +11318,119 @@ "node": ">=4" } }, + "node_modules/shelljs/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/shelljs/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/shelljs/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10524,28 +11454,41 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/smoldot": { "version": "2.0.26", "resolved": "https://registry.npmjs.org/smoldot/-/smoldot-2.0.26.tgz", @@ -10562,14 +11505,53 @@ "integrity": "sha512-MkY9KFFuhMeTkWU+4wIzBoEkGr1DXdMR98/zGB8S7efg9Wph9Z4d98RRu7c8pRpmRfrSPAYuMKkvauMCpWXStg==", "license": "MIT" }, + "node_modules/solc": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz", + "integrity": "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==", + "license": "MIT", + "dependencies": { + "command-exists": "^1.2.8", + "commander": "^8.1.0", + "follow-redirects": "^1.12.1", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solc.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/solc/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/solhint": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-5.0.3.tgz", - "integrity": "sha512-OLCH6qm/mZTCpplTXzXTJGId1zrtNuDYP5c2e6snIv/hdRVxPfBBz/bAlL91bY/Accavkayp2Zp2BaDSrLVXTQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/solhint/-/solhint-5.0.5.tgz", + "integrity": "sha512-WrnG6T+/UduuzSWsSOAbfq1ywLUDwNea3Gd5hg6PS+pLUm8lz2ECNr0beX609clBxmDeZ3676AiA9nPDljmbJQ==", "dev": true, "license": "MIT", "dependencies": { - "@solidity-parser/parser": "^0.18.0", + "@solidity-parser/parser": "^0.19.0", "ajv": "^6.12.6", "antlr4": "^4.13.1-patch-1", "ast-parents": "^0.0.1", @@ -10610,14 +11592,14 @@ "prettier-plugin-solidity": "^1.0.0" } }, - "node_modules/solhint/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/solhint/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "engines": { + "node": ">=14" } }, "node_modules/solhint/node_modules/glob": { @@ -10671,19 +11653,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/solhint/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/solidity-coverage": { "version": "0.8.14", "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.14.tgz", @@ -10718,18 +11687,12 @@ "hardhat": "^2.11.0" } }, - "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.19.0.tgz", - "integrity": "sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==", - "dev": true, - "license": "MIT" - }, "node_modules/solidity-coverage/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -10742,6 +11705,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -10756,6 +11720,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "1.1.3" } @@ -10764,13 +11729,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/solidity-coverage/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.0" } @@ -10780,6 +11747,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -10789,44 +11757,24 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/solidity-coverage/node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/solidity-coverage/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "node_modules/solidity-coverage/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, "node_modules/solidity-coverage/node_modules/supports-color": { @@ -10834,6 +11782,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -10841,6 +11790,16 @@ "node": ">=4" } }, + "node_modules/solidity-coverage/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/source-map": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", @@ -10858,6 +11817,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -10867,6 +11827,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -10875,19 +11836,21 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/stable-hash": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", - "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", "dev": true, "license": "MIT" }, "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", + "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", + "license": "MIT", "dependencies": { "type-fest": "^0.7.1" }, @@ -10899,6 +11862,7 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -10907,6 +11871,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -10915,6 +11880,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } @@ -10933,12 +11899,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true + "dev": true, + "license": "WTFPL OR MIT" }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10964,17 +11932,39 @@ "node": ">=8" } }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10984,16 +11974,20 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11020,6 +12014,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -11068,6 +12063,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "license": "MIT", "dependencies": { "is-hex-prefixed": "1.0.0" }, @@ -11077,19 +12073,22 @@ } }, "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "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==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11102,6 +12101,7 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -11110,20 +12110,20 @@ } }, "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.3.tgz", + "integrity": "sha512-szhWDqNNI9etJUvbZ1/cx1StnZx8yMmFxme48SwR4dty4ioSY50KEZlpv0qAfgc1fpRzuh9hBXEzoCpJ779dLg==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "@pkgr/core": "^0.2.1", + "tslib": "^2.8.1" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/synckit" } }, "node_modules/table": { @@ -11148,6 +12148,7 @@ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, + "license": "MIT", "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", @@ -11163,6 +12164,7 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -11172,6 +12174,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -11193,6 +12196,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -11200,39 +12213,51 @@ "dev": true, "license": "MIT" }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", - "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", "license": "MIT", "dependencies": { - "fdir": "^6.4.2", + "fdir": "^6.4.3", "picomatch": "^4.0.2" }, "engines": { "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", - "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -11259,6 +12284,7 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -11270,6 +12296,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -11281,6 +12308,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } @@ -11290,28 +12318,30 @@ "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-command-line-args": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz", - "integrity": "sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", "dev": true, + "license": "ISC", "dependencies": { "chalk": "^4.1.0", "command-line-args": "^5.1.1", @@ -11327,6 +12357,7 @@ "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, + "license": "MIT", "peerDependencies": { "typescript": ">=3.7.0" } @@ -11335,6 +12366,7 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -11373,6 +12405,15 @@ } } }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -11395,17 +12436,20 @@ "node_modules/tsort": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", + "license": "MIT" }, "node_modules/tweetnacl": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "license": "Unlicense" }, "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==" + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "license": "Unlicense" }, "node_modules/type-check": { "version": "0.4.0", @@ -11434,6 +12478,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -11446,6 +12491,7 @@ "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/prettier": "^2.1.1", "debug": "^4.3.1", @@ -11465,11 +12511,23 @@ "typescript": ">=4.3.0" } }, + "node_modules/typechain/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/typechain/node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -11483,7 +12541,9 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11499,12 +12559,48 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/typechain/node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "license": "MIT", + "node_modules/typechain/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/typechain/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typechain/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -11515,33 +12611,43 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/typechain/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -11551,19 +12657,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", - "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "reflect.getprototypeof": "^1.0.6" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -11594,9 +12700,9 @@ } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -11611,15 +12717,17 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, + "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -11629,25 +12737,29 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", + "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "license": "MIT", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -11656,65 +12768,84 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, + "node_modules/unrs-resolver": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.4.1.tgz", + "integrity": "sha512-MhPB3wBI5BR8TGieTb08XuYlE8oFVEXdSAgat3psdlRyejl8ojQ8iqPcjh094qCZ1r+TnkxzP6BeCd/umfHckQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/JounQin" + }, + "optionalDependencies": { + "@unrs/resolver-binding-darwin-arm64": "1.4.1", + "@unrs/resolver-binding-darwin-x64": "1.4.1", + "@unrs/resolver-binding-freebsd-x64": "1.4.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.4.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.4.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.4.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.4.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.4.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.4.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.4.1", + "@unrs/resolver-binding-linux-x64-musl": "1.4.1", + "@unrs/resolver-binding-wasm32-wasi": "1.4.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.4.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.4.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.4.1" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/utf-8-validate": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", - "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", - "hasInstallScript": true, - "optional": true, - "peer": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, "node_modules/utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -11722,25 +12853,115 @@ "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "license": "MIT" + }, + "node_modules/viem": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.7.14.tgz", + "integrity": "sha512-5b1KB1gXli02GOQHZIUsRluNUwssl2t4hqdFAzyWPwJ744N83jAOBOjOkrGz7K3qMIv9b0GQt3DoZIErSQTPkQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@scure/bip32": "1.3.2", + "@scure/bip39": "1.2.1", + "abitype": "1.0.0", + "isows": "1.0.3", + "ws": "8.13.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/@adraffy/ens-normalize": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/viem/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/viem/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", + "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", "dev": true, + "license": "LGPL-3.0", "dependencies": { + "@ethereumjs/util": "^8.1.0", "bn.js": "^5.2.1", "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", + "ethereum-cryptography": "^2.1.2", "ethjs-unit": "0.1.6", "number-to-bn": "1.7.0", "randombytes": "^2.1.0", @@ -11750,80 +12971,159 @@ "node": ">=8.0.0" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/web3-utils/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": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "@noble/hashes": "1.4.0" }, - "engines": { - "node": ">= 8" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", - "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", + "node_modules/web3-utils/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", - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.0", - "is-number-object": "^1.1.0", - "is-string": "^1.1.0", - "is-symbol": "^1.1.0" - }, "engines": { - "node": ">= 0.4" + "node": ">= 16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/which-builtin-type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", - "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "node_modules/web3-utils/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "node_modules/web3-utils/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": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/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/web3-utils/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, + "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/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -11833,16 +13133,18 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", - "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -11856,6 +13158,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "license": "MIT", "dependencies": { "string-width": "^4.0.0" }, @@ -11868,6 +13171,7 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11876,13 +13180,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wordwrapjs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, + "license": "MIT", "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" @@ -11896,19 +13202,22 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11943,12 +13252,13 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -11970,6 +13280,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } @@ -11978,12 +13289,13 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", "dev": true, "license": "ISC", "bin": { @@ -11997,6 +13309,7 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -12011,9 +13324,10 @@ } }, "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", "engines": { "node": ">=10" } @@ -12022,6 +13336,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "license": "MIT", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -12032,18 +13347,11 @@ "node": ">=10" } }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", "engines": { "node": ">=6" } @@ -12052,6 +13360,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -12074,10 +13383,10 @@ "ethers": "~5.7.0" } }, - "node_modules/zksync-ethers/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "node_modules/zksync-ethers/node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "funding": [ { "type": "individual", @@ -12090,140 +13399,6 @@ ], "license": "MIT", "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - } - }, - "dependencies": { - "@adraffy/ens-normalize": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", - "dev": true - }, - "@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "dev": true - }, - "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@digitalbazaar/http-client": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@digitalbazaar/http-client/-/http-client-3.2.0.tgz", - "integrity": "sha512-NhYXcWE/JDE7AnJikNX7q0S6zNuUPA2NuIoRdUpmvHlarjmRqyr6hIO3Awu2FxlUzbdiI1uzuWrZyB9mD1tTvw==", - "dev": true, - "requires": { - "ky": "^0.30.0", - "ky-universal": "^0.10.1", - "undici": "^5.2.0" - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.4.3" - } - }, - "@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - } - } - }, - "@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true - }, - "@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "requires": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -12235,11 +13410,22 @@ "@ethersproject/strings": "^5.7.0" } }, - "@ethersproject/abstract-provider": { + "node_modules/zksync-ethers/node_modules/@ethersproject/abstract-provider": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -12249,23 +13435,45 @@ "@ethersproject/web": "^5.7.0" } }, - "@ethersproject/abstract-signer": { + "node_modules/zksync-ethers/node_modules/@ethersproject/abstract-signer": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "requires": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/address": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/zksync-ethers/node_modules/@ethersproject/address": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", @@ -12273,54 +13481,120 @@ "@ethersproject/rlp": "^5.7.0" } }, - "@ethersproject/base64": { + "node_modules/zksync-ethers/node_modules/@ethersproject/base64": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bytes": "^5.7.0" } }, - "@ethersproject/basex": { + "node_modules/zksync-ethers/node_modules/@ethersproject/basex": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" } }, - "@ethersproject/bignumber": { + "node_modules/zksync-ethers/node_modules/@ethersproject/bignumber": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "bn.js": "^5.2.1" } }, - "@ethersproject/bytes": { + "node_modules/zksync-ethers/node_modules/@ethersproject/bytes": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/logger": "^5.7.0" } }, - "@ethersproject/constants": { + "node_modules/zksync-ethers/node_modules/@ethersproject/constants": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bignumber": "^5.7.0" } }, - "@ethersproject/contracts": { + "node_modules/zksync-ethers/node_modules/@ethersproject/contracts": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -12333,11 +13607,22 @@ "@ethersproject/transactions": "^5.7.0" } }, - "@ethersproject/hash": { + "node_modules/zksync-ethers/node_modules/@ethersproject/hash": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/base64": "^5.7.0", @@ -12349,11 +13634,22 @@ "@ethersproject/strings": "^5.7.0" } }, - "@ethersproject/hdnode": { + "node_modules/zksync-ethers/node_modules/@ethersproject/hdnode": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -12368,11 +13664,22 @@ "@ethersproject/wordlists": "^5.7.0" } }, - "@ethersproject/json-wallets": { + "node_modules/zksync-ethers/node_modules/@ethersproject/json-wallets": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -12388,50 +13695,116 @@ "scrypt-js": "3.0.1" } }, - "@ethersproject/keccak256": { + "node_modules/zksync-ethers/node_modules/@ethersproject/keccak256": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" } }, - "@ethersproject/logger": { + "node_modules/zksync-ethers/node_modules/@ethersproject/logger": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT" }, - "@ethersproject/networks": { + "node_modules/zksync-ethers/node_modules/@ethersproject/networks": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/logger": "^5.7.0" } }, - "@ethersproject/pbkdf2": { + "node_modules/zksync-ethers/node_modules/@ethersproject/pbkdf2": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" } }, - "@ethersproject/properties": { + "node_modules/zksync-ethers/node_modules/@ethersproject/properties": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/logger": "^5.7.0" } }, - "@ethersproject/providers": { + "node_modules/zksync-ethers/node_modules/@ethersproject/providers": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -12452,62 +13825,109 @@ "@ethersproject/web": "^5.7.0", "bech32": "1.1.4", "ws": "7.4.6" - }, - "dependencies": { - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "requires": {} - } } }, - "@ethersproject/random": { + "node_modules/zksync-ethers/node_modules/@ethersproject/random": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, - "@ethersproject/rlp": { + "node_modules/zksync-ethers/node_modules/@ethersproject/rlp": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, - "@ethersproject/sha2": { + "node_modules/zksync-ethers/node_modules/@ethersproject/sha2": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", "hash.js": "1.1.7" } }, - "@ethersproject/signing-key": { + "node_modules/zksync-ethers/node_modules/@ethersproject/signing-key": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" } }, - "@ethersproject/solidity": { + "node_modules/zksync-ethers/node_modules/@ethersproject/solidity": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", @@ -12516,21 +13936,43 @@ "@ethersproject/strings": "^5.7.0" } }, - "@ethersproject/strings": { + "node_modules/zksync-ethers/node_modules/@ethersproject/strings": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, - "@ethersproject/transactions": { + "node_modules/zksync-ethers/node_modules/@ethersproject/transactions": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -12542,21 +13984,43 @@ "@ethersproject/signing-key": "^5.7.0" } }, - "@ethersproject/units": { + "node_modules/zksync-ethers/node_modules/@ethersproject/units": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, - "@ethersproject/wallet": { + "node_modules/zksync-ethers/node_modules/@ethersproject/wallet": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -12574,11 +14038,22 @@ "@ethersproject/wordlists": "^5.7.0" } }, - "@ethersproject/web": { + "node_modules/zksync-ethers/node_modules/@ethersproject/web": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -12586,11 +14061,22 @@ "@ethersproject/strings": "^5.7.0" } }, - "@ethersproject/wordlists": { + "node_modules/zksync-ethers/node_modules/@ethersproject/wordlists": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "requires": { + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -12598,7852 +14084,99 @@ "@ethersproject/strings": "^5.7.0" } }, - "@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==" - }, - "@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true + "node_modules/zksync-ethers/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==", + "license": "MIT" }, - "@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, + "node_modules/zksync-ethers/node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "license": "MIT", "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } + "node_modules/zksync-ethers/node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "license": "MIT" }, - "@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==", - "requires": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "dependencies": { - "@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==", - "requires": { - "@types/node": "*" - } - }, - "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==" - }, - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } + "node_modules/zksync-ethers/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" }, - "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==", - "requires": { - "@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" - } + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } - } - }, - "@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", - "requires": { - "@noble/hashes": "1.4.0" - }, + ], + "license": "MIT", "dependencies": { - "@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==" - } - } - }, - "@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==" - }, - "@noble/secp256k1": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.6.3.tgz", - "integrity": "sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true - }, - "@nomicfoundation/edr": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.6.5.tgz", - "integrity": "sha512-tAqMslLP+/2b2sZP4qe9AuGxG3OkQ5gGgHE4isUuq6dUVjwCRPFhAOhpdFl+OjY5P3yEv3hmq9HjUGRa2VNjng==", - "requires": { - "@nomicfoundation/edr-darwin-arm64": "0.6.5", - "@nomicfoundation/edr-darwin-x64": "0.6.5", - "@nomicfoundation/edr-linux-arm64-gnu": "0.6.5", - "@nomicfoundation/edr-linux-arm64-musl": "0.6.5", - "@nomicfoundation/edr-linux-x64-gnu": "0.6.5", - "@nomicfoundation/edr-linux-x64-musl": "0.6.5", - "@nomicfoundation/edr-win32-x64-msvc": "0.6.5" - } - }, - "@nomicfoundation/edr-darwin-arm64": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.6.5.tgz", - "integrity": "sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw==" - }, - "@nomicfoundation/edr-darwin-x64": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.6.5.tgz", - "integrity": "sha512-x3zBY/v3R0modR5CzlL6qMfFMdgwd6oHrWpTkuuXnPFOX8SU31qq87/230f4szM+ukGK8Hi+mNq7Ro2VF4Fj+w==" - }, - "@nomicfoundation/edr-linux-arm64-gnu": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.6.5.tgz", - "integrity": "sha512-HGpB8f1h8ogqPHTyUpyPRKZxUk2lu061g97dOQ/W4CxevI0s/qiw5DB3U3smLvSnBHKOzYS1jkxlMeGN01ky7A==" - }, - "@nomicfoundation/edr-linux-arm64-musl": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.6.5.tgz", - "integrity": "sha512-ESvJM5Y9XC03fZg9KaQg3Hl+mbx7dsSkTIAndoJS7X2SyakpL9KZpOSYrDk135o8s9P9lYJdPOyiq+Sh+XoCbQ==" - }, - "@nomicfoundation/edr-linux-x64-gnu": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.6.5.tgz", - "integrity": "sha512-HCM1usyAR1Ew6RYf5AkMYGvHBy64cPA5NMbaeY72r0mpKaH3txiMyydcHibByOGdQ8iFLWpyUdpl1egotw+Tgg==" - }, - "@nomicfoundation/edr-linux-x64-musl": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.6.5.tgz", - "integrity": "sha512-nB2uFRyczhAvWUH7NjCsIO6rHnQrof3xcCe6Mpmnzfl2PYcGyxN7iO4ZMmRcQS7R1Y670VH6+8ZBiRn8k43m7A==" - }, - "@nomicfoundation/edr-win32-x64-msvc": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.6.5.tgz", - "integrity": "sha512-B9QD/4DSSCFtWicO8A3BrsnitO1FPv7axB62wq5Q+qeJ50yJlTmyeGY3cw62gWItdvy2mh3fRM6L1LpnHiB77A==" - }, - "@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==", - "requires": { - "@nomicfoundation/ethereumjs-util": "9.0.4" - } - }, - "@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==" - }, - "@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==", - "requires": { - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "ethereum-cryptography": "0.1.3" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - } - } - }, - "@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==", - "requires": { - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "ethereum-cryptography": "0.1.3" + "node_modules/zksync-ethers/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" }, - "dependencies": { - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - } - } - }, - "@nomicfoundation/hardhat-chai-matchers": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.8.tgz", - "integrity": "sha512-Z5PiCXH4xhNLASROlSUOADfhfpfhYO6D7Hn9xp8PddmHey0jq704cr6kfU8TRrQ4PUZbpfsZadPj+pCfZdjPIg==", - "dev": true, - "requires": { - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" - } - }, - "@nomicfoundation/hardhat-ethers": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.8.tgz", - "integrity": "sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==", - "peer": true, - "requires": { - "debug": "^4.1.1", - "lodash.isequal": "^4.5.0" - } - }, - "@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.12.tgz", - "integrity": "sha512-xTNQNI/9xkHvjmCJnJOTyqDSl8uq1rKb2WOVmixQxFtRd7Oa3ecO8zM0cyC2YmOK+jHB9WPZ+F/ijkHg1CoORA==", - "dev": true, - "requires": { - "ethereumjs-util": "^7.1.4" - } - }, - "@nomicfoundation/solidity-analyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz", - "integrity": "sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==", - "requires": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.0", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.0", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.0", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.0", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.0", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.0" - } - }, - "@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz", - "integrity": "sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz", - "integrity": "sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz", - "integrity": "sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz", - "integrity": "sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz", - "integrity": "sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz", - "integrity": "sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz", - "integrity": "sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz", - "integrity": "sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz", - "integrity": "sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw==", - "optional": true - }, - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz", - "integrity": "sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA==", - "optional": true - }, - "@nomiclabs/hardhat-solhint": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-solhint/-/hardhat-solhint-4.0.1.tgz", - "integrity": "sha512-ekfbbGfUwMZGr9aPAurPa7GVMX/6XqKemppVEez+mC36H7G5UyBsnrUKZMhMDVHG9S7+ke9sLuaibnWvpdSrQA==", - "dev": true, - "requires": { - "solhint": "^5.0.2" - } - }, - "@openzeppelin/contracts": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.1.0.tgz", - "integrity": "sha512-p1ULhl7BXzjjbha5aqst+QMLY+4/LCWADXOCsmLHRM77AqiPjnd9vvUN9sosUfhL9JGKpZ0TjEGxgvnizmWGSA==" - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "optional": true - }, - "@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true - }, - "@pnpm/config.env-replace": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", - "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", - "dev": true - }, - "@pnpm/network.ca-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", - "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", - "dev": true, - "requires": { - "graceful-fs": "4.2.10" - } - }, - "@pnpm/npm-conf": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", - "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", - "dev": true, - "requires": { - "@pnpm/config.env-replace": "^1.1.0", - "@pnpm/network.ca-file": "^1.0.1", - "config-chain": "^1.1.11" - } - }, - "@polkadot-api/json-rpc-provider": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@polkadot-api/json-rpc-provider/-/json-rpc-provider-0.0.1.tgz", - "integrity": "sha512-/SMC/l7foRjpykLTUTacIH05H3mr9ip8b5xxfwXlVezXrNVLp3Cv0GX6uItkKd+ZjzVPf3PFrDF2B2/HLSNESA==", - "optional": true - }, - "@polkadot-api/json-rpc-provider-proxy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@polkadot-api/json-rpc-provider-proxy/-/json-rpc-provider-proxy-0.1.0.tgz", - "integrity": "sha512-8GSFE5+EF73MCuLQm8tjrbCqlgclcHBSRaswvXziJ0ZW7iw3UEMsKkkKvELayWyBuOPa2T5i1nj6gFOeIsqvrg==", - "optional": true - }, - "@polkadot-api/metadata-builders": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@polkadot-api/metadata-builders/-/metadata-builders-0.3.2.tgz", - "integrity": "sha512-TKpfoT6vTb+513KDzMBTfCb/ORdgRnsS3TDFpOhAhZ08ikvK+hjHMt5plPiAX/OWkm1Wc9I3+K6W0hX5Ab7MVg==", - "optional": true, - "requires": { - "@polkadot-api/substrate-bindings": "0.6.0", - "@polkadot-api/utils": "0.1.0" - } - }, - "@polkadot-api/observable-client": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@polkadot-api/observable-client/-/observable-client-0.3.2.tgz", - "integrity": "sha512-HGgqWgEutVyOBXoGOPp4+IAq6CNdK/3MfQJmhCJb8YaJiaK4W6aRGrdQuQSTPHfERHCARt9BrOmEvTXAT257Ug==", - "optional": true, - "requires": { - "@polkadot-api/metadata-builders": "0.3.2", - "@polkadot-api/substrate-bindings": "0.6.0", - "@polkadot-api/utils": "0.1.0" - } - }, - "@polkadot-api/substrate-bindings": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@polkadot-api/substrate-bindings/-/substrate-bindings-0.6.0.tgz", - "integrity": "sha512-lGuhE74NA1/PqdN7fKFdE5C1gNYX357j1tWzdlPXI0kQ7h3kN0zfxNOpPUN7dIrPcOFZ6C0tRRVrBylXkI6xPw==", - "optional": true, - "requires": { - "@noble/hashes": "^1.3.1", - "@polkadot-api/utils": "0.1.0", - "@scure/base": "^1.1.1", - "scale-ts": "^1.6.0" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" }, - "dependencies": { - "@noble/hashes": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz", - "integrity": "sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==", + "peerDependenciesMeta": { + "bufferutil": { "optional": true - } - } - }, - "@polkadot-api/substrate-client": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@polkadot-api/substrate-client/-/substrate-client-0.1.4.tgz", - "integrity": "sha512-MljrPobN0ZWTpn++da9vOvt+Ex+NlqTlr/XT7zi9sqPtDJiQcYl+d29hFAgpaeTqbeQKZwz3WDE9xcEfLE8c5A==", - "optional": true, - "requires": { - "@polkadot-api/json-rpc-provider": "0.0.1", - "@polkadot-api/utils": "0.1.0" - } - }, - "@polkadot-api/utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@polkadot-api/utils/-/utils-0.1.0.tgz", - "integrity": "sha512-MXzWZeuGxKizPx2Xf/47wx9sr/uxKw39bVJUptTJdsaQn/TGq+z310mHzf1RCGvC1diHM8f593KrnDgc9oNbJA==", - "optional": true - }, - "@polkadot/api": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-15.0.2.tgz", - "integrity": "sha512-CA8Pq2Gsz2MJvpkpIVNzaBs2eJGCr0sEodAb0vTOZW/ZlIDHcBWyWq3KXE+lBMWVzYBEC4Vz6MafNgq6Bsshlw==", - "requires": { - "@polkadot/api-augment": "15.0.2", - "@polkadot/api-base": "15.0.2", - "@polkadot/api-derive": "15.0.2", - "@polkadot/keyring": "^13.2.3", - "@polkadot/rpc-augment": "15.0.2", - "@polkadot/rpc-core": "15.0.2", - "@polkadot/rpc-provider": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/types-augment": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/types-create": "15.0.2", - "@polkadot/types-known": "15.0.2", - "@polkadot/util": "^13.2.3", - "@polkadot/util-crypto": "^13.2.3", - "eventemitter3": "^5.0.1", - "rxjs": "^7.8.1", - "tslib": "^2.8.0" - } - }, - "@polkadot/api-augment": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-15.0.2.tgz", - "integrity": "sha512-7qtfTihLKS7cT2kEsd8Y1+MJ+2n4Sl0y9BHuPhdNfKcDbGwCxIB7JzXNujww4Is4bF7w1lXcM2U0E/XwJi1BbQ==", - "requires": { - "@polkadot/api-base": "15.0.2", - "@polkadot/rpc-augment": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/types-augment": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/api-base": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-15.0.2.tgz", - "integrity": "sha512-5++EjpuCxzmrL2JJj511RrPK+IovuIQa8DJhyOp62VDMXPkqS/O6Df5wjYzQh/ftT1ZysftXqJAUA/LSUsH+2g==", - "requires": { - "@polkadot/rpc-core": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/util": "^13.2.3", - "rxjs": "^7.8.1", - "tslib": "^2.8.0" - } - }, - "@polkadot/api-derive": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-15.0.2.tgz", - "integrity": "sha512-nD8hXZxEv2/wuhjMmVP09lTAYd8inNgrLpLGUR+7hBQeVEQQTdNatkqMKpNIOk2MO46mtUK35NepvDBK9DWZzA==", - "requires": { - "@polkadot/api": "15.0.2", - "@polkadot/api-augment": "15.0.2", - "@polkadot/api-base": "15.0.2", - "@polkadot/rpc-core": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/util": "^13.2.3", - "@polkadot/util-crypto": "^13.2.3", - "rxjs": "^7.8.1", - "tslib": "^2.8.0" - } - }, - "@polkadot/keyring": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-13.2.3.tgz", - "integrity": "sha512-pgTo6DXNXub0wGD+MnVHYhKxf80Jl+QMOCb818ioGdXz++Uw4mTueFAwtB+N7TGo0HafhChUiNJDxFdlDkcAng==", - "requires": { - "@polkadot/util": "13.2.3", - "@polkadot/util-crypto": "13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/networks": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-13.2.3.tgz", - "integrity": "sha512-mG+zkXg/33AyPrkv2xBbAo3LBUwOwBn6qznBU/4jxiZPnVvCwMaxE7xHM22B5riItbNJ169FXv3wy0v6ZmkFbw==", - "requires": { - "@polkadot/util": "13.2.3", - "@substrate/ss58-registry": "^1.51.0", - "tslib": "^2.8.0" - } - }, - "@polkadot/rpc-augment": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-15.0.2.tgz", - "integrity": "sha512-of88GdzsOs15HP+Gowh4G/iKKFkCNIeF0Wes8LiONfn+j2TmWt8blbyGhrIZZeApzbFUDFjnxUPGT40uWJcMpw==", - "requires": { - "@polkadot/rpc-core": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/rpc-core": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-15.0.2.tgz", - "integrity": "sha512-KOUnfXOAFCN0N23sEbS+FzXhX88JCvJst/nKzO9+q67NgYBEqgcaoG4tqt/VVedgkNi0kA7WAA3wyjt5UYMnrg==", - "requires": { - "@polkadot/rpc-augment": "15.0.2", - "@polkadot/rpc-provider": "15.0.2", - "@polkadot/types": "15.0.2", - "@polkadot/util": "^13.2.3", - "rxjs": "^7.8.1", - "tslib": "^2.8.0" - } - }, - "@polkadot/rpc-provider": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-15.0.2.tgz", - "integrity": "sha512-BwLP8gNskzqtQ2kMk+EX6WK4d9TU0XJ/nJg0TKC2dX5sSTpTF2JQIYp1wuOik4rKNXIU/1hKaDSSylMJj7AHeQ==", - "requires": { - "@polkadot/keyring": "^13.2.3", - "@polkadot/types": "15.0.2", - "@polkadot/types-support": "15.0.2", - "@polkadot/util": "^13.2.3", - "@polkadot/util-crypto": "^13.2.3", - "@polkadot/x-fetch": "^13.2.3", - "@polkadot/x-global": "^13.2.3", - "@polkadot/x-ws": "^13.2.3", - "@substrate/connect": "0.8.11", - "eventemitter3": "^5.0.1", - "mock-socket": "^9.3.1", - "nock": "^13.5.5", - "tslib": "^2.8.0" - } - }, - "@polkadot/types": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-15.0.2.tgz", - "integrity": "sha512-6gZBnuXU58hQAXWI2daED2OaQwFMxbQdkE8HVGMovMobEf0PxPfIqf+GdnVmWbe09EU9mv2gCWBcdnvHSRBlQg==", - "requires": { - "@polkadot/keyring": "^13.2.3", - "@polkadot/types-augment": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/types-create": "15.0.2", - "@polkadot/util": "^13.2.3", - "@polkadot/util-crypto": "^13.2.3", - "rxjs": "^7.8.1", - "tslib": "^2.8.0" - } - }, - "@polkadot/types-augment": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-15.0.2.tgz", - "integrity": "sha512-UiFJVEYML30+V9GdFAHPbA3s4MVQTL1CevsZMnX0+ApvlgEHJMZnVFfYF7jL2bl9BcUYM/zoxEAhj2MpqFFfxw==", - "requires": { - "@polkadot/types": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/types-codec": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-15.0.2.tgz", - "integrity": "sha512-44Q40p1rl0t7Bl1QUamewqXNVPway9xgqByyifv6ODSGhtt+lFoarb3U4JzqRUuuK0PP57ePB0L8q81Totxeew==", - "requires": { - "@polkadot/util": "^13.2.3", - "@polkadot/x-bigint": "^13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/types-create": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-15.0.2.tgz", - "integrity": "sha512-YhpcqbH3oI87PkgrV6Fez9jWDqFIep0KcS1YWQcwc9gsBNnuour80t2AAK41/tqAYwOZi6tpJwIevnEhVkxFYA==", - "requires": { - "@polkadot/types-codec": "15.0.2", - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/types-known": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-15.0.2.tgz", - "integrity": "sha512-SyBo4xBoesHYiEfdW/nOgaftKgM7+puBWqQXq1Euz0MM5LDLjxBw22Srgk9ulGM6l9MsekIwCyX8geJ6/6J3Cg==", - "requires": { - "@polkadot/networks": "^13.2.3", - "@polkadot/types": "15.0.2", - "@polkadot/types-codec": "15.0.2", - "@polkadot/types-create": "15.0.2", - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/types-support": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-15.0.2.tgz", - "integrity": "sha512-I7Im/4K2/XDZ1LfeQeeNyvIkfvozIPQs8K1/nsICDOmBbvIsjxSeKWHOcFDMJ8AlPEer6bqNQavOyZA/pg9R/Q==", - "requires": { - "@polkadot/util": "^13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/util": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-13.2.3.tgz", - "integrity": "sha512-pioNnsig3qHXrfOKMe4Yqos8B8N3/EZUpS+WfTpWnn1VjYban/0GrTXeavPlAwggnY27b8fS6rBzQBhnVYDw8g==", - "requires": { - "@polkadot/x-bigint": "13.2.3", - "@polkadot/x-global": "13.2.3", - "@polkadot/x-textdecoder": "13.2.3", - "@polkadot/x-textencoder": "13.2.3", - "@types/bn.js": "^5.1.6", - "bn.js": "^5.2.1", - "tslib": "^2.8.0" - } - }, - "@polkadot/util-crypto": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-13.2.3.tgz", - "integrity": "sha512-5sbggmLbn5eiuVMyPROPlT5roHRqdKHOfSpioNbGvGIZ1qIWVoC1RfsK0NWJOVGDzy6DpQe0KYT/kgcU5Xsrzw==", - "requires": { - "@noble/curves": "^1.3.0", - "@noble/hashes": "^1.3.3", - "@polkadot/networks": "13.2.3", - "@polkadot/util": "13.2.3", - "@polkadot/wasm-crypto": "^7.4.1", - "@polkadot/wasm-util": "^7.4.1", - "@polkadot/x-bigint": "13.2.3", - "@polkadot/x-randomvalues": "13.2.3", - "@scure/base": "^1.1.7", - "tslib": "^2.8.0" - }, - "dependencies": { - "@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==" - }, - "@scure/base": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.1.tgz", - "integrity": "sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ==" - } - } - }, - "@polkadot/wasm-bridge": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-bridge/-/wasm-bridge-7.4.1.tgz", - "integrity": "sha512-tdkJaV453tezBxhF39r4oeG0A39sPKGDJmN81LYLf+Fihb7astzwju+u75BRmDrHZjZIv00un3razJEWCxze6g==", - "requires": { - "@polkadot/wasm-util": "7.4.1", - "tslib": "^2.7.0" - } - }, - "@polkadot/wasm-crypto": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto/-/wasm-crypto-7.4.1.tgz", - "integrity": "sha512-kHN/kF7hYxm1y0WeFLWeWir6oTzvcFmR4N8fJJokR+ajYbdmrafPN+6iLgQVbhZnDdxyv9jWDuRRsDnBx8tPMQ==", - "requires": { - "@polkadot/wasm-bridge": "7.4.1", - "@polkadot/wasm-crypto-asmjs": "7.4.1", - "@polkadot/wasm-crypto-init": "7.4.1", - "@polkadot/wasm-crypto-wasm": "7.4.1", - "@polkadot/wasm-util": "7.4.1", - "tslib": "^2.7.0" - } - }, - "@polkadot/wasm-crypto-asmjs": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-7.4.1.tgz", - "integrity": "sha512-pwU8QXhUW7IberyHJIQr37IhbB6DPkCG5FhozCiNTq4vFBsFPjm9q8aZh7oX1QHQaiAZa2m2/VjIVE+FHGbvHQ==", - "requires": { - "tslib": "^2.7.0" - } - }, - "@polkadot/wasm-crypto-init": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-init/-/wasm-crypto-init-7.4.1.tgz", - "integrity": "sha512-AVka33+f7MvXEEIGq5U0dhaA2SaXMXnxVCQyhJTaCnJ5bRDj0Xlm3ijwDEQUiaDql7EikbkkRtmlvs95eSUWYQ==", - "requires": { - "@polkadot/wasm-bridge": "7.4.1", - "@polkadot/wasm-crypto-asmjs": "7.4.1", - "@polkadot/wasm-crypto-wasm": "7.4.1", - "@polkadot/wasm-util": "7.4.1", - "tslib": "^2.7.0" - } - }, - "@polkadot/wasm-crypto-wasm": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-7.4.1.tgz", - "integrity": "sha512-PE1OAoupFR0ZOV2O8tr7D1FEUAwaggzxtfs3Aa5gr+yxlSOaWUKeqsOYe1KdrcjmZVV3iINEAXxgrbzCmiuONg==", - "requires": { - "@polkadot/wasm-util": "7.4.1", - "tslib": "^2.7.0" - } - }, - "@polkadot/wasm-util": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@polkadot/wasm-util/-/wasm-util-7.4.1.tgz", - "integrity": "sha512-RAcxNFf3zzpkr+LX/ItAsvj+QyM56TomJ0xjUMo4wKkHjwsxkz4dWJtx5knIgQz/OthqSDMR59VNEycQeNuXzA==", - "requires": { - "tslib": "^2.7.0" - } - }, - "@polkadot/x-bigint": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-13.2.3.tgz", - "integrity": "sha512-VKgEAh0LsxTd/Hg517Tt5ZU4CySjBwMpaojbkjgv3fOdg1cN7t4eFEUxpyj7mlO0cp22SzDh7nmy4TO98qhLQA==", - "requires": { - "@polkadot/x-global": "13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/x-fetch": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-13.2.3.tgz", - "integrity": "sha512-7Nmk+8ieEGzz43nc1rX6nH3rQo6rhGmAaIXJWnXY9gOHY0k1me1bJYbP+xDdh8vcLh8eY3D1sESUwG6QYZW2lg==", - "requires": { - "@polkadot/x-global": "13.2.3", - "node-fetch": "^3.3.2", - "tslib": "^2.8.0" - } - }, - "@polkadot/x-global": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-13.2.3.tgz", - "integrity": "sha512-7MYQIAEwBkRcNrgqac5PbB0kNPlI6ISJEy6/Nb+crj8BFjQ8rf11PF49fq0QsvDeuYM1aNLigrvYZNptQs4lbw==", - "requires": { - "tslib": "^2.8.0" - } - }, - "@polkadot/x-randomvalues": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-13.2.3.tgz", - "integrity": "sha512-Zf0GTfLmVk+VzPUmcQSpXjjmFzMTjPhXoLuIoE7xIu73T+vQ+TX9j7DvorN6bIRsnZ9l1SyTZsSf/NTjNZKIZg==", - "requires": { - "@polkadot/x-global": "13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/x-textdecoder": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-13.2.3.tgz", - "integrity": "sha512-i8hRXPtGknmdm3FYv6/94I52VXHJZa5sgYNw1+Hqb4Jqmq4awUjea35CKXd/+aw70Qn8Ngg31l2GoiH494fa+Q==", - "requires": { - "@polkadot/x-global": "13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/x-textencoder": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-13.2.3.tgz", - "integrity": "sha512-wJI3Bb/dC4zyBXJFm5+ZhyBXWoI5wvP8k8qX0/ZC0PQsgSAqs7LVhiofk4Wd94n0P41W5re58LrGXLyziSAshw==", - "requires": { - "@polkadot/x-global": "13.2.3", - "tslib": "^2.8.0" - } - }, - "@polkadot/x-ws": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-13.2.3.tgz", - "integrity": "sha512-Y6MTAWgcnrnx/LkBx65X3ZyoJH5EFj3tXtflRoKg1+PLHSLuNBV7Wi5mLcE70z4e5c+4hgBbLq+8SqCqzFtSPw==", - "requires": { - "@polkadot/x-global": "13.2.3", - "tslib": "^2.8.0", - "ws": "^8.18.0" - } - }, - "@prb/math": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@prb/math/-/math-4.1.0.tgz", - "integrity": "sha512-ef5Xrlh3BeX4xT5/Wi810dpEPq2bYPndRxgFIaKSU1F/Op/s8af03kyom+mfU7gEpvfIZ46xu8W0duiHplbBMg==" - }, - "@prettier/sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@prettier/sync/-/sync-0.3.0.tgz", - "integrity": "sha512-3dcmCyAxIcxy036h1I7MQU/uEEBq8oLwf1CE3xeze+MPlgkdlb/+w6rGR/1dhp6Hqi17fRS6nvwnOzkESxEkOw==", - "dev": true, - "requires": {} - }, - "@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true - }, - "@scure/base": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", - "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==" - }, - "@scure/bip32": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.0.tgz", - "integrity": "sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q==", - "requires": { - "@noble/hashes": "~1.1.1", - "@noble/secp256k1": "~1.6.0", - "@scure/base": "~1.1.0" - } - }, - "@scure/bip39": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.0.tgz", - "integrity": "sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w==", - "requires": { - "@noble/hashes": "~1.1.1", - "@scure/base": "~1.1.0" - } - }, - "@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "requires": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "requires": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "dependencies": { - "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "requires": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==" - }, - "@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "requires": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@solidity-parser/parser": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", - "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==", - "dev": true - }, - "@substrate/connect": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/@substrate/connect/-/connect-0.8.11.tgz", - "integrity": "sha512-ofLs1PAO9AtDdPbdyTYj217Pe+lBfTLltdHDs3ds8no0BseoLeAGxpz1mHfi7zB4IxI3YyAiLjH6U8cw4pj4Nw==", - "optional": true, - "requires": { - "@substrate/connect-extension-protocol": "^2.0.0", - "@substrate/connect-known-chains": "^1.1.5", - "@substrate/light-client-extension-helpers": "^1.0.0", - "smoldot": "2.0.26" - } - }, - "@substrate/connect-extension-protocol": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@substrate/connect-extension-protocol/-/connect-extension-protocol-2.2.1.tgz", - "integrity": "sha512-GoafTgm/Jey9E4Xlj4Z5ZBt/H4drH2CNq8VrAro80rtoznrXnFDNVivLQzZN0Xaj2g8YXSn9pC9Oc9IovYZJXw==", - "optional": true - }, - "@substrate/connect-known-chains": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@substrate/connect-known-chains/-/connect-known-chains-1.8.1.tgz", - "integrity": "sha512-WkqXvuLWL1g136nxAoGkclybsVpo8claHeBl/8iA99ECAk4pWLtoCh8PoYrFEE1HfY4rk+A0krPybDlcDa/G4g==", - "optional": true - }, - "@substrate/light-client-extension-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@substrate/light-client-extension-helpers/-/light-client-extension-helpers-1.0.0.tgz", - "integrity": "sha512-TdKlni1mBBZptOaeVrKnusMg/UBpWUORNDv5fdCaJklP4RJiFOzBCrzC+CyVI5kQzsXBisZ+2pXm+rIjS38kHg==", - "optional": true, - "requires": { - "@polkadot-api/json-rpc-provider": "^0.0.1", - "@polkadot-api/json-rpc-provider-proxy": "^0.1.0", - "@polkadot-api/observable-client": "^0.3.0", - "@polkadot-api/substrate-client": "^0.1.2", - "@substrate/connect-extension-protocol": "^2.0.0", - "@substrate/connect-known-chains": "^1.1.5", - "rxjs": "^7.8.1" - } - }, - "@substrate/ss58-registry": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/@substrate/ss58-registry/-/ss58-registry-1.51.0.tgz", - "integrity": "sha512-TWDurLiPxndFgKjVavCniytBIw+t4ViOi7TYp9h/D0NMmkEc9klFTo+827eyEJ0lELpqO207Ey7uGxUa+BS1jQ==" - }, - "@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.1" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" - }, - "@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" - }, - "@typechain/ethers-v6": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", - "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", - "dev": true, - "requires": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - } - }, - "@typechain/hardhat": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-9.1.0.tgz", - "integrity": "sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==", - "dev": true, - "requires": { - "fs-extra": "^9.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - } - } - }, - "@types/bn.js": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.6.tgz", - "integrity": "sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==", - "requires": { - "@types/node": "*" - } - }, - "@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "@types/chai": { - "version": "4.3.20", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", - "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", - "dev": true - }, - "@types/chai-as-promised": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", - "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", - "dev": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@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==" - }, - "@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "@types/mocha": { - "version": "10.0.10", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", - "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", - "dev": true - }, - "@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", - "requires": { - "undici-types": "~6.20.0" - }, - "dependencies": { - "undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" - } - } - }, - "@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz", - "integrity": "sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/type-utils": "8.18.1", - "@typescript-eslint/utils": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/parser": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.18.1.tgz", - "integrity": "sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/typescript-estree": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz", - "integrity": "sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1" - } - }, - "@typescript-eslint/type-utils": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz", - "integrity": "sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "8.18.1", - "@typescript-eslint/utils": "8.18.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - } - }, - "@typescript-eslint/types": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.18.1.tgz", - "integrity": "sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz", - "integrity": "sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/visitor-keys": "8.18.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } - } - }, - "@typescript-eslint/utils": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.18.1.tgz", - "integrity": "sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.18.1", - "@typescript-eslint/types": "8.18.1", - "@typescript-eslint/typescript-estree": "8.18.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz", - "integrity": "sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.18.1", - "eslint-visitor-keys": "^4.2.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true - } - } - }, - "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true - }, - "abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dev": true, - "requires": { - "event-target-shim": "^5.0.0" - } - }, - "acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" - }, - "adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" - }, - "aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "requires": { - "debug": "4" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "optional": true - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" - }, - "ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "requires": { - "environment": "^1.0.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "antlr4": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.13.2.tgz", - "integrity": "sha512-QiVbZhyy4xAZ17UPEuG3YTOt8ZaoeOR1CvEAqrEsDBsOqINslaB147i9xqljZqoyf5S+EUlGStaj+t22LT9MOg==", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true - }, - "array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - } - }, - "array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - } - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "assertion-tools": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/assertion-tools/-/assertion-tools-2.2.1.tgz", - "integrity": "sha512-JlA1S16Ox93PnYb45HvxNcax/Ii4gqTO8HLGa/ykj/ddp8EEHlokn6inJR2yMiz173WSFkCc0ciLJzGeaYBANw==", - "dev": true, - "requires": { - "ethers": "^5.7.2", - "jsonld": "^8.1.0", - "merkletreejs": "^0.3.2" - }, - "dependencies": { - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - } - } - }, - "ast-parents": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/ast-parents/-/ast-parents-0.0.1.tgz", - "integrity": "sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "bignumber.js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" - }, - "blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" - }, - "bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "requires": { - "fill-range": "^7.1.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "brotli-wasm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brotli-wasm/-/brotli-wasm-2.0.1.tgz", - "integrity": "sha512-+3USgYsC7bzb5yU0/p2HnnynZl0ak0E6uoIm4UW4Aby/8s8HFCq6NCfrrf1E9c3O8OCSzq3oYO1tUVqIi61Nww==", - "dev": true - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "buffer-reverse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-reverse/-/buffer-reverse-1.0.1.tgz", - "integrity": "sha512-M87YIUBsZ6N924W57vDwT/aOu8hw7ZgdByz6ijksLjmHJELBASmYTTlNHRgjE+pTsT9oJXGaDSgqqwfdHotDUg==", - "dev": true - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, - "bufferutil": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", - "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", - "optional": true, - "peer": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==" - }, - "canonicalize": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/canonicalize/-/canonicalize-1.0.8.tgz", - "integrity": "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A==", - "dev": true - }, - "chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - } - }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "requires": { - "check-error": "^1.0.2" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true - }, - "check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "requires": { - "get-func-name": "^2.0.2" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "requires": { - "picomatch": "^2.2.1" - } - } - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" - }, - "cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "requires": { - "restore-cursor": "^5.0.0" - } - }, - "cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "requires": { - "@colors/colors": "1.5.0", - "string-width": "^4.2.0" - } - }, - "cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true - }, - "slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "requires": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - } - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" - }, - "command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "requires": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - } - }, - "command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, - "requires": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "commander": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "requires": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true - }, - "crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "dev": true - }, - "data-uri-to-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", - "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==" - }, - "data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - } - }, - "death": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", - "dev": true - }, - "debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "requires": { - "ms": "^2.1.3" - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "delete-empty": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/delete-empty/-/delete-empty-3.0.0.tgz", - "integrity": "sha512-ZUyiwo76W+DYnKsL3Kim6M/UOavPdBJgDYWOmuQhYaZvJH0AXAHbUNyEDtRbBra8wqqr686+63/0azfEk1ebUQ==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.0", - "minimist": "^1.2.0", - "path-starts-with": "^2.0.0", - "rimraf": "^2.6.2" - }, - "dependencies": { - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" - }, - "difflib": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", - "dev": true, - "requires": { - "heap": ">= 0.2.0" - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==" - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - }, - "dependencies": { - "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==" - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encode-utf8": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", - "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" - }, - "environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.23.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", - "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - } - }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "requires": { - "es-errors": "^1.3.0" - } - }, - "es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - } - }, - "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "dev": true, - "requires": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", - "dev": true, - "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", - "dev": true - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-import-resolver-typescript": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.7.0.tgz", - "integrity": "sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==", - "dev": true, - "requires": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.7", - "enhanced-resolve": "^5.15.0", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", - "is-glob": "^4.0.3", - "stable-hash": "^0.0.4" - } - }, - "eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "dev": true, - "requires": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "eslint-plugin-mocha": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.5.0.tgz", - "integrity": "sha512-F2ALmQVPT1GoP27O1JTZGrV9Pqg8k79OeIuvw63UxMtQKREZtmkK1NFgkZQ2TW7L2JSSFKHFPTtHu5z8R9QNRw==", - "dev": true, - "requires": { - "eslint-utils": "^3.0.0", - "globals": "^13.24.0", - "rambda": "^7.4.0" - } - }, - "eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - } - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "dev": true, - "requires": { - "js-sha3": "^0.8.0" - } - }, - "ethereum-cryptography": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz", - "integrity": "sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ==", - "requires": { - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.6.3", - "@scure/bip32": "1.1.0", - "@scure/bip39": "1.1.0" - } - }, - "ethereumjs-abi": { - "version": "git+ssh://git@github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0", - "from": "ethereumjs-abi@^0.6.8", - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "@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==", - "requires": { - "@types/node": "*" - } - }, - "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==" - }, - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "requires": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - } - } - }, - "ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "requires": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "dependencies": { - "ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "requires": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - } - } - }, - "ethers": { - "version": "6.13.4", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz", - "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==", - "requires": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "22.7.5", - "aes-js": "4.0.0-beta.5", - "tslib": "2.7.0", - "ws": "8.17.1" - }, - "dependencies": { - "@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" - }, - "@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "requires": { - "@noble/hashes": "1.3.2" - } - }, - "@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" - }, - "@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", - "requires": { - "undici-types": "~6.19.2" - } - }, - "aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" - }, - "ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "requires": {} - } - } - }, - "ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - } - } - }, - "ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "dev": true - }, - "eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "requires": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "requires": { - "array-back": "^3.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "fmix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fmix/-/fmix-0.1.0.tgz", - "integrity": "sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==", - "requires": { - "imul": "^1.0.0" - } - }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==", - "dev": true - }, - "formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "requires": { - "fetch-blob": "^3.1.2" - } - }, - "fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" - }, - "fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "dependencies": { - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "dev": true - }, - "get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - } - }, - "get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "dev": true, - "requires": { - "resolve-pkg-maps": "^1.0.0" - } - }, - "ghost-testrpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - } - }, - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, - "requires": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - } - }, - "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" - }, - "got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "hardhat": { - "version": "2.22.17", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.17.tgz", - "integrity": "sha512-tDlI475ccz4d/dajnADUTRc1OJ3H8fpP9sWhXhBPpYsQOg8JHq5xrDimo53UhWPl7KJmAeDCm1bFG74xvpGRpg==", - "requires": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/edr": "^0.6.5", - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "@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", - "boxen": "^5.1.2", - "chokidar": "^4.0.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^5.0.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "json-stream-stringify": "^3.1.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "picocolors": "^1.1.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.8.26", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tinyglobby": "^0.2.6", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "requires": { - "type-fest": "^0.21.3" - } - }, - "chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", - "requires": { - "readdirp": "^4.0.1" - } - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "solc": { - "version": "0.8.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.26.tgz", - "integrity": "sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==", - "requires": { - "command-exists": "^1.2.8", - "commander": "^8.1.0", - "follow-redirects": "^1.12.1", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" - }, - "ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "requires": {} - } - } - }, - "hardhat-abi-exporter": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/hardhat-abi-exporter/-/hardhat-abi-exporter-2.10.1.tgz", - "integrity": "sha512-X8GRxUTtebMAd2k4fcPyVnCdPa6dYK4lBsrwzKP5yiSq4i+WadWPIumaLfce53TUf/o2TnLpLOduyO1ylE2NHQ==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.5.0", - "delete-empty": "^3.0.0" - } - }, - "hardhat-contract-sizer": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz", - "integrity": "sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "cli-table3": "^0.6.0", - "strip-ansi": "^6.0.0" - } - }, - "hardhat-deploy": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/hardhat-deploy/-/hardhat-deploy-0.12.4.tgz", - "integrity": "sha512-bYO8DIyeGxZWlhnMoCBon9HNZb6ji0jQn7ngP1t5UmGhC8rQYhji7B73qETMOFhzt5ECZPr+U52duj3nubsqdQ==", - "requires": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/contracts": "^5.7.0", - "@ethersproject/providers": "^5.7.2", - "@ethersproject/solidity": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wallet": "^5.7.0", - "@types/qs": "^6.9.7", - "axios": "^0.21.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.2", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "ethers": "^5.7.0", - "form-data": "^4.0.0", - "fs-extra": "^10.0.0", - "match-all": "^1.2.6", - "murmur-128": "^0.2.1", - "qs": "^6.9.4", - "zksync-ethers": "^5.0.0" - }, - "dependencies": { - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - } - } - }, - "hardhat-deploy-ethers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/hardhat-deploy-ethers/-/hardhat-deploy-ethers-0.4.2.tgz", - "integrity": "sha512-AskNH/XRYYYqPT94MvO5s1yMi+/QvoNjS4oU5VcVqfDU99kgpGETl+uIYHIrSXtH5sy7J6gyVjpRMf4x0tjLSQ==", - "requires": {} - }, - "hardhat-gas-reporter": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-2.2.2.tgz", - "integrity": "sha512-xlg3d00wrgUvP2S5tw3Zf6nO7OyS5crK3P6/ZP69i24pz4grM+6oFHGW/eJPSGqiDWBYX+gKp9XoqP4rwRXrdQ==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/units": "^5.7.0", - "@solidity-parser/parser": "^0.19.0", - "axios": "^1.6.7", - "brotli-wasm": "^2.0.1", - "chalk": "4.1.2", - "cli-table3": "^0.6.3", - "ethereum-cryptography": "^2.1.3", - "glob": "^10.3.10", - "jsonschema": "^1.4.1", - "lodash": "^4.17.21", - "markdown-table": "2.0.0", - "sha1": "^1.1.1", - "viem": "2.7.14" - }, - "dependencies": { - "@noble/curves": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", - "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", - "dev": true, - "requires": { - "@noble/hashes": "1.4.0" - } - }, - "@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 - }, - "@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", - "dev": true, - "requires": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - } - }, - "@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, - "requires": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - } - }, - "@solidity-parser/parser": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.19.0.tgz", - "integrity": "sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==", - "dev": true - }, - "abitype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", - "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==", - "dev": true, - "requires": {} - }, - "axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "dev": true, - "requires": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "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, - "requires": { - "@noble/curves": "1.4.2", - "@noble/hashes": "1.4.0", - "@scure/bip32": "1.4.0", - "@scure/bip39": "1.3.0" - } - }, - "glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - } - }, - "minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true - }, - "viem": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.7.14.tgz", - "integrity": "sha512-5b1KB1gXli02GOQHZIUsRluNUwssl2t4hqdFAzyWPwJ744N83jAOBOjOkrGz7K3qMIv9b0GQt3DoZIErSQTPkQ==", - "dev": true, - "requires": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@scure/bip32": "1.3.2", - "@scure/bip39": "1.2.1", - "abitype": "1.0.0", - "isows": "1.0.3", - "ws": "8.13.0" - }, - "dependencies": { - "@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "dev": true, - "requires": { - "@noble/hashes": "1.3.2" - } - }, - "@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "dev": true - }, - "@scure/bip32": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz", - "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==", - "dev": true, - "requires": { - "@noble/curves": "~1.2.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.2" - } - }, - "@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", - "dev": true, - "requires": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - } - } - } - }, - "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "requires": {} - } - } - }, - "hardhat-tracer": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hardhat-tracer/-/hardhat-tracer-3.1.0.tgz", - "integrity": "sha512-Ip16HQAuzbqbNJUIEVfqmbPmOY90bxZSpwu5Q73cwloy+LUYA04BATUM9Gui5H7zcgsgZ1IVy7pSYn6ZMjLmag==", - "dev": true, - "requires": { - "chalk": "^4.1.2", - "debug": "^4.3.4", - "ethers": "^5.6.1", - "semver": "^7.6.2" - }, - "dependencies": { - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", - "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", - "requires": { - "call-bind": "^1.0.7" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, - "heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - } - } - }, - "http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true - }, - "husky": { - "version": "9.1.7", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true - }, - "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imul": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/imul/-/imul-1.0.1.tgz", - "integrity": "sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "requires": { - "fp-ts": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "requires": { - "has-bigints": "^1.0.2" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", - "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "has-tostringtag": "^1.0.2" - } - }, - "is-bun-module": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.3.0.tgz", - "integrity": "sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==", - "dev": true, - "requires": { - "semver": "^7.6.3" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "dev": true, - "requires": { - "hasown": "^2.0.2" - } - }, - "is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "requires": { - "is-typed-array": "^1.1.13" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-finalizationregistry": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", - "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", - "dev": true, - "requires": { - "call-bind": "^1.0.7" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==" - }, - "is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", - "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "has-tostringtag": "^1.0.2" - } - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-regex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", - "integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "gopd": "^1.1.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - } - }, - "is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7" - } - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "is-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", - "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "has-tostringtag": "^1.0.2" - } - }, - "is-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", - "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "has-symbols": "^1.0.3", - "safe-regex-test": "^1.0.3" - } - }, - "is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "requires": { - "which-typed-array": "^1.1.14" - } - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" - }, - "is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - } - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isows": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz", - "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==", - "dev": true, - "requires": {} - }, - "jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json-stream-stringify": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.1.6.tgz", - "integrity": "sha512-x7fpwxOkbhFCaJDJ8vb1fBY3DdSa4AlITaz+HHILQJzdPMnHEFjxPwVUi1ALIbcIxDE0PNe/0i7frnY8QnBQog==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonld": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/jsonld/-/jsonld-8.1.0.tgz", - "integrity": "sha512-6tYhiEVYO3rTcoYCGCArw8SqawuW0hf/cqmaE5WbX44CGb7d8N2UFvmUj9OYkJhChD98bfdPljUj7S39MrzsHg==", - "dev": true, - "requires": { - "@digitalbazaar/http-client": "^3.2.0", - "canonicalize": "^1.0.1", - "lru-cache": "^6.0.0", - "rdf-canonize": "^3.0.0" - } - }, - "jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "dev": true - }, - "keccak": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.2.tgz", - "integrity": "sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ==", - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - } - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "ky": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz", - "integrity": "sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==", - "dev": true - }, - "ky-universal": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/ky-universal/-/ky-universal-0.10.1.tgz", - "integrity": "sha512-r8909k+ELKZAxhVA5c440x22hqw5XcMRwLRbgpPQk4JHy3/ddJnvzcnSo5Ww3HdKdNeS3Y8dBgcIYyVahMa46g==", - "dev": true, - "requires": { - "abort-controller": "^3.0.0", - "node-fetch": "^3.2.2" - } - }, - "latest-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", - "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", - "dev": true, - "requires": { - "package-json": "^8.1.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "lint-staged": { - "version": "15.2.11", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.11.tgz", - "integrity": "sha512-Ev6ivCTYRTGs9ychvpVw35m/bcNDuBN+mnTeObCL5h+boS5WzBEC6LHI4I9F/++sZm1m+J2LEiy0gxL/R9TBqQ==", - "dev": true, - "requires": { - "chalk": "~5.3.0", - "commander": "~12.1.0", - "debug": "~4.4.0", - "execa": "~8.0.1", - "lilconfig": "~3.1.3", - "listr2": "~8.2.5", - "micromatch": "~4.0.8", - "pidtree": "~0.6.0", - "string-argv": "~0.3.2", - "yaml": "~2.6.1" - }, - "dependencies": { - "chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true - }, - "commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true - } - } - }, - "listr2": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", - "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", - "dev": true, - "requires": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "requires": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - } - } - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "peer": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "requires": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true - }, - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - }, - "emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "requires": { - "get-east-asian-width": "^1.0.0" - } - }, - "slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "requires": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - } - }, - "string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - } - }, - "strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "requires": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - } - } - } - }, - "loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.1" - } - }, - "lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "dev": true - }, - "lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "markdown-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", - "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", - "dev": true, - "requires": { - "repeat-string": "^1.0.0" - } - }, - "match-all": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/match-all/-/match-all-1.2.6.tgz", - "integrity": "sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==" - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "merkletreejs": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/merkletreejs/-/merkletreejs-0.3.11.tgz", - "integrity": "sha512-LJKTl4iVNTndhL+3Uz/tfkjD0klIWsHlUzgtuNnNrsf7bAlXR30m+xYB7lHr5Z/l6e/yAIsr26Dabx6Buo4VGQ==", - "dev": true, - "requires": { - "bignumber.js": "^9.0.1", - "buffer-reverse": "^1.0.1", - "crypto-js": "^4.2.0", - "treeify": "^1.1.0", - "web3-utils": "^1.3.4" - } - }, - "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "requires": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" - }, - "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", - "requires": { - "mime-db": "1.51.0" - } - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "requires": { - "obliterator": "^2.0.0" - } - }, - "mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "requires": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "requires": { - "brace-expansion": "^2.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - } - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "mock-socket": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/mock-socket/-/mock-socket-9.3.1.tgz", - "integrity": "sha512-qxBgB7Qa2sEQgHFjj0dSigq7fX4k6Saisd5Nelwp2q8mlbAFh5dHV9JTTlF8viYJLSSWgMCZFUom8PJcMNBoJw==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "murmur-128": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/murmur-128/-/murmur-128-0.2.1.tgz", - "integrity": "sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==", - "requires": { - "encode-utf8": "^1.0.2", - "fmix": "^0.1.0", - "imul": "^1.0.0" - } - }, - "nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "nock": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.5.6.tgz", - "integrity": "sha512-o2zOYiCpzRqSzPj0Zt/dQ/DqZeYoaQ7TUonc/xUPjCGl9WeHpNbxgVvOquXYAaJzI0M9BXV3HTzG0p8IUAbBTQ==", - "requires": { - "debug": "^4.1.0", - "json-stringify-safe": "^5.0.1", - "propagate": "^2.0.0" - } - }, - "node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==" - }, - "node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "requires": { - "lodash": "^4.17.21" - } - }, - "node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "requires": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - } - }, - "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==" - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - }, - "dependencies": { - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - } - } - }, - "number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "dev": true, - "requires": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", - "dev": true - } - } - }, - "object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - } - }, - "object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - } - }, - "object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - } - }, - "ordinal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", - "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" - }, - "p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "package-json": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", - "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", - "dev": true, - "requires": { - "got": "^12.1.0", - "registry-auth-token": "^5.0.1", - "registry-url": "^6.0.0", - "semver": "^7.3.7" - }, - "dependencies": { - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } - } - }, - "package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "requires": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true - }, - "minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true - } - } - }, - "path-starts-with": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-starts-with/-/path-starts-with-2.0.1.tgz", - "integrity": "sha512-wZ3AeiRBRlNwkdUxvBANh0+esnt38DLffHDujZyRHkqkaKHTglnY2EP5UX3b8rdeiSutgO4y9NEJwXezNP5vHg==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true - }, - "possible-typed-array-names": { - "version": "1.0.0", - "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 - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "prettier-plugin-solidity": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.4.1.tgz", - "integrity": "sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg==", - "dev": true, - "requires": { - "@solidity-parser/parser": "^0.18.0", - "semver": "^7.5.4" - }, - "dependencies": { - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==" - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, - "rambda": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.4.0.tgz", - "integrity": "sha512-A9hihu7dUTLOUCM+I8E61V4kRXnN4DwYeK0DwCBydC1MqNI1PidyAtbtpsJlBBzK4icSctEcCQ1bGcLpBuETUQ==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "rdf-canonize": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rdf-canonize/-/rdf-canonize-3.3.0.tgz", - "integrity": "sha512-gfSNkMua/VWC1eYbSkVaL/9LQhFeOh0QULwv7Or0f+po8pMgQ1blYQFe1r9Mv2GJZXw88Cz/drnAnB9UlNnHfQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.5" - } - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==" - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "requires": { - "minimatch": "^3.0.5" - } - }, - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true - }, - "reflect.getprototypeof": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", - "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "which-builtin-type": "^1.1.4" - } - }, - "regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" - } - }, - "registry-auth-token": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.3.tgz", - "integrity": "sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA==", - "dev": true, - "requires": { - "@pnpm/npm-conf": "^2.1.0" - } - }, - "registry-url": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", - "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "requires": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "dependencies": { - "onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "requires": { - "mimic-function": "^5.0.0" - } - } - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "requires": { - "bn.js": "^5.2.0" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sc-istanbul": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", - "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", - "dev": true, - "requires": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dev": true, - "requires": { - "has-flag": "^1.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "scale-ts": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/scale-ts/-/scale-ts-1.6.1.tgz", - "integrity": "sha512-PBMc2AWc6wSEqJYBDPcyCLUj9/tMKnLX70jLOSndMtcUoLQucP/DM0vnQo1wJAYjTrQiq8iG9rD0q6wFzgjH7g==", - "optional": true - }, - "scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - } - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", - "dev": true, - "requires": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "smoldot": { - "version": "2.0.26", - "resolved": "https://registry.npmjs.org/smoldot/-/smoldot-2.0.26.tgz", - "integrity": "sha512-F+qYmH4z2s2FK+CxGj8moYcd1ekSIKH8ywkdqlOz88Dat35iB1DIYL11aILN46YSGMzQW/lbJNS307zBSDN5Ig==", - "optional": true, - "requires": { - "ws": "^8.8.1" - } - }, - "solady": { - "version": "0.0.285", - "resolved": "https://registry.npmjs.org/solady/-/solady-0.0.285.tgz", - "integrity": "sha512-MkY9KFFuhMeTkWU+4wIzBoEkGr1DXdMR98/zGB8S7efg9Wph9Z4d98RRu7c8pRpmRfrSPAYuMKkvauMCpWXStg==" - }, - "solhint": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/solhint/-/solhint-5.0.3.tgz", - "integrity": "sha512-OLCH6qm/mZTCpplTXzXTJGId1zrtNuDYP5c2e6snIv/hdRVxPfBBz/bAlL91bY/Accavkayp2Zp2BaDSrLVXTQ==", - "dev": true, - "requires": { - "@solidity-parser/parser": "^0.18.0", - "ajv": "^6.12.6", - "antlr4": "^4.13.1-patch-1", - "ast-parents": "^0.0.1", - "chalk": "^4.1.2", - "commander": "^10.0.0", - "cosmiconfig": "^8.0.0", - "fast-diff": "^1.2.0", - "glob": "^8.0.3", - "ignore": "^5.2.4", - "js-yaml": "^4.1.0", - "latest-version": "^7.0.0", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "prettier": "^2.8.3", - "semver": "^7.5.2", - "strip-ansi": "^6.0.1", - "table": "^6.8.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "optional": true - }, - "semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true - } - } - }, - "solhint-plugin-prettier": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/solhint-plugin-prettier/-/solhint-plugin-prettier-0.1.0.tgz", - "integrity": "sha512-SDOTSM6tZxZ6hamrzl3GUgzF77FM6jZplgL2plFBclj/OjKP8Z3eIPojKU73gRr0MvOS8ACZILn8a5g0VTz/Gw==", - "dev": true, - "requires": { - "@prettier/sync": "^0.3.0", - "prettier-linter-helpers": "^1.0.0" - } - }, - "solidity-coverage": { - "version": "0.8.14", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.14.tgz", - "integrity": "sha512-ItAAObe5GaEOp20kXC2BZRnph+9P7Rtoqg2mQc2SXGEHgSDF2wWd1Wxz3ntzQWXkbCtIIGdJT918HG00cObwbA==", - "dev": true, - "requires": { - "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.19.0", - "chalk": "^2.4.2", - "death": "^1.1.0", - "difflib": "^0.2.4", - "fs-extra": "^8.1.0", - "ghost-testrpc": "^0.0.2", - "global-modules": "^2.0.0", - "globby": "^10.0.1", - "jsonschema": "^1.2.4", - "lodash": "^4.17.21", - "mocha": "^10.2.0", - "node-emoji": "^1.10.0", - "pify": "^4.0.1", - "recursive-readdir": "^2.2.2", - "sc-istanbul": "^0.4.5", - "semver": "^7.3.4", - "shelljs": "^0.8.3", - "web3-utils": "^1.3.6" - }, - "dependencies": { - "@solidity-parser/parser": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.19.0.tgz", - "integrity": "sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", - "dev": true, - "optional": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stable-hash": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", - "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", - "dev": true - }, - "stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "requires": { - "type-fest": "^0.7.1" - }, - "dependencies": { - "type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==" - } - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true - }, - "string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - }, - "strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", - "dev": true, - "requires": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - } - }, - "table": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", - "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "tinyglobby": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", - "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", - "requires": { - "fdir": "^6.4.2", - "picomatch": "^4.0.2" - }, - "dependencies": { - "fdir": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", - "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", - "requires": {} - }, - "picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==" - } - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", - "dev": true - }, - "ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "requires": {} - }, - "ts-command-line-args": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz", - "integrity": "sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - } - }, - "ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "dev": true, - "requires": {} - }, - "ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" - }, - "tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" - }, - "tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - }, - "typechain": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", - "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", - "dev": true, - "requires": { - "@types/prettier": "^2.1.1", - "debug": "^4.3.1", - "fs-extra": "^7.0.0", - "glob": "7.1.7", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "mkdirp": "^1.0.4", - "prettier": "^2.3.1", - "ts-command-line-args": "^2.2.0", - "ts-essentials": "^7.0.1" - }, - "dependencies": { - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - } - } - }, - "typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - } - }, - "typed-array-byte-offset": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", - "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "reflect.getprototypeof": "^1.0.6" - } - }, - "typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" - } - }, - "typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==" - }, - "typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true - }, - "uglify-js": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", - "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", - "dev": true, - "optional": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", - "requires": { - "@fastify/busboy": "^2.0.0" - } - }, - "undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "utf-8-validate": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", - "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", - "optional": true, - "peer": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" - }, - "web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==" - }, - "web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dev": true, - "requires": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", - "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", - "dev": true, - "requires": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.0", - "is-number-object": "^1.1.0", - "is-string": "^1.1.0", - "is-symbol": "^1.1.0" - } - }, - "which-builtin-type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", - "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.7", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - } - }, - "which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "requires": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - } - }, - "which-typed-array": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", - "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "requires": { - "string-width": "^4.0.0" - } - }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "dependencies": { - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", - "requires": {} - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" - } - } - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" - }, - "zksync-ethers": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/zksync-ethers/-/zksync-ethers-5.10.0.tgz", - "integrity": "sha512-OAjTGAHF9wbdkRGkj7XZuF/a1Sk/FVbwH4pmLjAKlR7mJ7sQtQhBhrPU2dCc67xLaNvEESPfwil19ES5wooYFg==", - "requires": { - "ethers": "~5.7.0" - }, - "dependencies": { - "ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } + "utf-8-validate": { + "optional": true } } } diff --git a/package.json b/package.json index d1334136..f6ce11e4 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "@types/node": "^22.10.2", "@typescript-eslint/eslint-plugin": "^8.18.1", "@typescript-eslint/parser": "^8.18.1", - "assertion-tools": "^2.2.1", + "assertion-tools": "^8.0.1", "chai": "^4.5.0", "cross-env": "^7.0.3", "eslint": "^8.17.0", diff --git a/test/helpers/kc-helpers.ts b/test/helpers/kc-helpers.ts index dc6c41de..40af2523 100644 --- a/test/helpers/kc-helpers.ts +++ b/test/helpers/kc-helpers.ts @@ -1,5 +1,6 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { ethers, getBytes } from 'ethers'; +import { HexString } from 'ethers/lib.commonjs/utils/data'; import { createProfile, createProfiles } from './profile-helpers'; import { KCSignaturesData, NodeAccounts } from './types'; @@ -21,8 +22,10 @@ export async function getKCSignaturesData( publishingNode: NodeAccounts, publisherIdentityId: number, receivingNodes: NodeAccounts[], + merkleRoot: HexString = ethers.keccak256( + ethers.toUtf8Bytes('test-merkle-root'), + ), ): Promise { - const merkleRoot = ethers.keccak256(ethers.toUtf8Bytes('test-merkle-root')); const publisherMessageHash = ethers.solidityPackedKeccak256( ['uint72', 'bytes32'], [publisherIdentityId, merkleRoot], diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index 3822b162..9d673e40 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -1,6 +1,9 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; +// @ts-expect-error: No type definitions available for assertion-tools +import { kcTools } from 'assertion-tools'; import { expect } from 'chai'; +import { ethers } from 'ethers'; import hre from 'hardhat'; import { @@ -20,9 +23,18 @@ import { KnowledgeCollection, ParanetKnowledgeMinersRegistry, ParanetKnowledgeCollectionsRegistry, + Staking, + ShardingTableStorage, + ShardingTable, + ParametersStorage, + Ask, } from '../../typechain'; -import { createProfilesAndKC } from '../helpers/kc-helpers'; -import { createProfile } from '../helpers/profile-helpers'; +import { + createProfilesAndKC, + getKCSignaturesData, + createKnowledgeCollection, +} from '../helpers/kc-helpers'; +import { createProfile, createProfiles } from '../helpers/profile-helpers'; import { getDefaultKCCreator, getDefaultReceivingNodes, @@ -33,6 +45,7 @@ import { type Challenge = { knowledgeCollectionId: bigint; chunkId: bigint; + knowledgeCollectionStorageContract: string; epoch: bigint; activeProofPeriodStartBlock: bigint; proofingPeriodDurationInBlocks: bigint; @@ -58,6 +71,11 @@ type RandomSamplingFixture = { Token: Token; ParanetKnowledgeMinersRegistry: ParanetKnowledgeMinersRegistry; ParanetKnowledgeCollectionsRegistry: ParanetKnowledgeCollectionsRegistry; + Staking: Staking; + ShardingTableStorage: ShardingTableStorage; + ShardingTable: ShardingTable; + ParametersStorage: ParametersStorage; + Ask: Ask; }; describe('@integration RandomSampling', () => { @@ -71,11 +89,16 @@ describe('@integration RandomSampling', () => { let EpochStorage: EpochStorage; let Chronos: Chronos; let AskStorage: AskStorage; + let Ask: Ask; let DelegatorsInfo: DelegatorsInfo; let Profile: Profile; let Hub: Hub; let KnowledgeCollection: KnowledgeCollection; let Token: Token; + let Staking: Staking; + let ShardingTableStorage: ShardingTableStorage; + let ShardingTable: ShardingTable; + let ParametersStorage: ParametersStorage; let ParanetKnowledgeMinersRegistry: ParanetKnowledgeMinersRegistry; let ParanetKnowledgeCollectionsRegistry: ParanetKnowledgeCollectionsRegistry; @@ -99,6 +122,8 @@ describe('@integration RandomSampling', () => { 'RandomSampling', 'ParanetKnowledgeMinersRegistry', 'ParanetKnowledgeCollectionsRegistry', + 'Staking', + 'Ask', ]); accounts = await hre.ethers.getSigners(); @@ -136,6 +161,15 @@ describe('@integration RandomSampling', () => { DelegatorsInfo = await hre.ethers.getContract('DelegatorsInfo'); Profile = await hre.ethers.getContract('Profile'); + Staking = await hre.ethers.getContract('Staking'); + ShardingTableStorage = await hre.ethers.getContract( + 'ShardingTableStorage', + ); + ShardingTable = + await hre.ethers.getContract('ShardingTable'); + ParametersStorage = + await hre.ethers.getContract('ParametersStorage'); + Ask = await hre.ethers.getContract('Ask'); // Get RandomSampling contract after all others are registered RandomSampling = @@ -165,6 +199,11 @@ describe('@integration RandomSampling', () => { Token, ParanetKnowledgeMinersRegistry, ParanetKnowledgeCollectionsRegistry, + Staking, + ShardingTableStorage, + ShardingTable, + ParametersStorage, + Ask, }; } @@ -186,6 +225,11 @@ describe('@integration RandomSampling', () => { RandomSamplingStorage, ParanetKnowledgeMinersRegistry, ParanetKnowledgeCollectionsRegistry, + Staking, + ShardingTableStorage, + ShardingTable, + ParametersStorage, + Ask, } = await loadFixture(deployRandomSamplingFixture)); }); @@ -210,6 +254,8 @@ describe('@integration RandomSampling', () => { const challenge: Challenge = { knowledgeCollectionId: 1n, chunkId: 1n, + knowledgeCollectionStorageContract: + await KnowledgeCollectionStorage.getAddress(), epoch: currentEpoch, activeProofPeriodStartBlock: activeBlock, proofingPeriodDurationInBlocks: proofingPeriodDuration, @@ -297,7 +343,7 @@ describe('@integration RandomSampling', () => { // Mine blocks to pass the proofing period const proofingPeriodDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); - const blocksToMine = Number(proofingPeriodDuration) + 1 - diff; + const blocksToMine = Number(proofingPeriodDuration) - diff; for (let i = 0; i < blocksToMine; i++) { await hre.network.provider.send('evm_mine'); @@ -315,7 +361,7 @@ describe('@integration RandomSampling', () => { // The new period should be different from the initial one expect(newPeriodStartBlock).to.be.greaterThan(initialPeriodStartBlock); expect(newPeriodStartBlock).to.be.equal( - initialPeriodStartBlock + BigInt(proofingPeriodDuration) + 1n, + initialPeriodStartBlock + BigInt(proofingPeriodDuration), ); }); }); @@ -407,6 +453,130 @@ describe('@integration RandomSampling', () => { // eslint-disable-next-line @typescript-eslint/no-unused-expressions expect(challenge.solved).to.be.true; }); + + it('Should submit a valid proof successfully', async () => { + const quads = [ + ' "468.9 sq mi" .', + ' "New York" .', + ' "8,336,817" .', + ' "New York" .', + ' .', + ' "0xaac2a420672a1eb77506c544ff01beed2be58c0ee3576fe037c846f97481cefd" .', + ' .', + ' .', + ' .', + ]; + // Generate the Merkle tree and get the root + const merkleRoot = kcTools.calculateMerkleRoot(quads, 32); + + expect(merkleRoot).to.equal( + '0xe860c5ab7ed7c79dbdff4af603cad8952eb2f5573db4e3b06585990f55fd8a95', + ); + + const kcCreator = getDefaultKCCreator(accounts); + const publishingNode = getDefaultPublishingNode(accounts); + const receivingNodes = getDefaultReceivingNodes(accounts); + + const { identityId: publishingNodeIdentityId } = await createProfile( + Profile, + publishingNode, + ); + const receivingNodesIdentityIds = ( + await createProfiles(Profile, receivingNodes) + ).map((p) => p.identityId); + + // Mint tokens and set stake + const minStake = await ParametersStorage.minimumStake(); + await Token.mint(accounts[0].address, minStake); + await Token.connect(accounts[0]).approve( + await Staking.getAddress(), + minStake, + ); + await Staking.stake(publishingNodeIdentityId, minStake); + + expect( + await StakingStorage.getNodeStake(publishingNodeIdentityId), + ).to.equal(minStake); + expect( + await ShardingTableStorage.nodeExists(publishingNodeIdentityId), + ).to.equal(true); + + // Recalculate the active set + const newAsk = 200n; + await Profile.connect(publishingNode.operational).updateAsk( + publishingNodeIdentityId, + newAsk, + ); + await Ask.connect(accounts[0]).recalculateActiveSet(); + + // Create a knowledge collection + const signaturesData = await getKCSignaturesData( + publishingNode, + publishingNodeIdentityId, + receivingNodes, + merkleRoot, + ); + + await createKnowledgeCollection( + kcCreator, + publishingNodeIdentityId, + receivingNodesIdentityIds, + signaturesData, + { + KnowledgeCollection, + Token, + }, + 'f6821709-be83-464d-a450-84c51d1077f5', + 5, + 1280, + 2, + BigInt('11641036927376871'), + false, + ethers.ZeroAddress, + ); + + // Update and get the new active proof period + const tx = + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + await tx.wait(); + + // Create challenge + const challengeTx = await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + await challengeTx.wait(); + + // Get the challenge from storage to verify it + let challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Get chunk from quads + const chunks = kcTools.splitIntoChunks(quads, 32); + const challengeChunk = chunks[challenge.chunkId]; + + // Generate a proof for our challenge chunk + const { proof } = kcTools.calculateMerkleProof( + quads, + 32, + challenge.chunkId, + ); + + // Submit proof + const submitProofTx = await RandomSampling.connect( + publishingNode.operational, + ).submitProof(challengeChunk, proof); + await submitProofTx.wait(); + + // Get the challenge from storage to verify it + challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Since the challenge was solved, the challenge should be marked as solved + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(challenge.solved).to.be.true; + }); }); describe('Score Calculation', () => { From 0b978a7d4c2ecd5ba375459f3064d342d0f2ae0a Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 10 Apr 2025 16:34:11 +0200 Subject: [PATCH 048/106] Swap returns with reverts --- abi/RandomSampling.json | 53 ++---------------------------------- contracts/RandomSampling.sol | 23 ++++++---------- 2 files changed, 11 insertions(+), 65 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index 2aa52477..872bc387 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -203,50 +203,7 @@ { "inputs": [], "name": "createChallenge", - "outputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "knowledgeCollectionId", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "chunkId", - "type": "uint256" - }, - { - "internalType": "address", - "name": "knowledgeCollectionStorageContract", - "type": "address" - }, - { - "internalType": "uint256", - "name": "epoch", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "activeProofPeriodStartBlock", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "proofingPeriodDurationInBlocks", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "solved", - "type": "bool" - } - ], - "internalType": "struct RandomSamplingLib.Challenge", - "name": "", - "type": "tuple" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, @@ -516,13 +473,7 @@ } ], "name": "submitProof", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], + "outputs": [], "stateMutability": "nonpayable", "type": "function" }, diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 28db2b35..c071f833 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -108,7 +108,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { } } - function createChallenge() external returns (RandomSamplingLib.Challenge memory) { + function createChallenge() external { // identityId uint72 identityId = identityStorage.getIdentityId(msg.sender); @@ -117,14 +117,14 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { if ( nodeChallenge.activeProofPeriodStartBlock == randomSamplingStorage.updateAndGetActiveProofPeriodStartBlock() ) { - // If node has already solved the challenge for this period, return an empty challenge + // Revert if node has already solved the challenge for this period if (nodeChallenge.solved == true) { - return RandomSamplingLib.Challenge(0, 0, address(0), 0, 0, 0, false); + revert("The challenge for this proof period has already been solved"); } - // If the challenge for this node exists but has not been solved yet, return the existing challenge + // Revert if a challenge for this node exists but has not been solved yet if (nodeChallenge.knowledgeCollectionId != 0) { - return nodeChallenge; + revert("An unsolved challenge already exists for this node in the current proof period"); } } @@ -133,11 +133,9 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { // Store the new challenge in the storage contract randomSamplingStorage.setNodeChallenge(identityId, challenge); - - return challenge; } - function submitProof(string memory chunk, bytes32[] calldata merkleProof) public returns (bool) { + function submitProof(string memory chunk, bytes32[] calldata merkleProof) public { // Get node identityId uint72 identityId = identityStorage.getIdentityId(msg.sender); @@ -148,8 +146,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { // verify that the challengeId matches the current challenge if (challenge.activeProofPeriodStartBlock != activeProofPeriodStartBlock) { - // This challenge is no longer active - return false; + revert("This challenge is no longer active"); } // Construct the merkle root from chunk and merkleProof @@ -175,11 +172,9 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { _calculateAndStoreDelegatorScores(identityId, epoch, activeProofPeriodStartBlock); emit ValidProofSubmitted(identityId, epoch, score); - - return true; + } else { + revert("Proof is not valid"); } - - return false; } function getDelegatorEpochRewardsAmount(uint72 identityId, uint256 epoch) public view returns (uint256) { From 9165967cec057dd4c1a3ef48059fd96ebe1a1958 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 10 Apr 2025 16:34:39 +0200 Subject: [PATCH 049/106] Update kc-helpers --- test/helpers/kc-helpers.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/helpers/kc-helpers.ts b/test/helpers/kc-helpers.ts index 40af2523..6cb81673 100644 --- a/test/helpers/kc-helpers.ts +++ b/test/helpers/kc-helpers.ts @@ -117,6 +117,9 @@ export async function createProfilesAndKC( KnowledgeCollection: KnowledgeCollection; Token: Token; }, + merkleRoot: HexString = ethers.keccak256( + ethers.toUtf8Bytes('test-merkle-root'), + ), ) { const { identityId: publishingNodeIdentityId } = await createProfile( contracts.Profile, @@ -131,6 +134,7 @@ export async function createProfilesAndKC( publishingNode, publishingNodeIdentityId, receivingNodes, + merkleRoot, ); const { collectionId } = await createKnowledgeCollection( kcCreator, From d5bd58b9a254ae9788c8f7ab49ab7c7a6090cf1e Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 10 Apr 2025 16:35:46 +0200 Subject: [PATCH 050/106] Reorg tests, add new and update old --- test/integration/RandomSampling.test.ts | 385 +++++++++++++++++++----- 1 file changed, 304 insertions(+), 81 deletions(-) diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index 9d673e40..5cc10328 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -3,7 +3,6 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; // @ts-expect-error: No type definitions available for assertion-tools import { kcTools } from 'assertion-tools'; import { expect } from 'chai'; -import { ethers } from 'ethers'; import hre from 'hardhat'; import { @@ -29,18 +28,31 @@ import { ParametersStorage, Ask, } from '../../typechain'; -import { - createProfilesAndKC, - getKCSignaturesData, - createKnowledgeCollection, -} from '../helpers/kc-helpers'; -import { createProfile, createProfiles } from '../helpers/profile-helpers'; +import { createProfilesAndKC } from '../helpers/kc-helpers'; +import { createProfile } from '../helpers/profile-helpers'; import { getDefaultKCCreator, getDefaultReceivingNodes, getDefaultPublishingNode, } from '../helpers/setup-helpers'; +// Sample values for tests +const avgBlockTimeInSeconds = 1; // Average block time +const SCALING_FACTOR = 10n ** 18n; +const quads = [ + ' "468.9 sq mi" .', + ' "New York" .', + ' "8,336,817" .', + ' "New York" .', + ' .', + ' "0xaac2a420672a1eb77506c544ff01beed2be58c0ee3576fe037c846f97481cefd" .', + ' .', + ' .', + ' .', +]; +// Generate the Merkle tree and get the root +const merkleRoot = kcTools.calculateMerkleRoot(quads, 32); + // Type definition for a Challenge type Challenge = { knowledgeCollectionId: bigint; @@ -78,6 +90,81 @@ type RandomSamplingFixture = { Ask: Ask; }; +async function setNodeStake( + node: { operational: SignerWithAddress; admin: SignerWithAddress }, + identityId: bigint, + amount: bigint, + hubOwner: SignerWithAddress, + deps: { Token: Token; Staking: Staking; Ask: Ask }, +) { + const { Token, Staking } = deps; + + await Token.mint(node.operational.address, amount); + await Token.connect(node.operational).approve( + await Staking.getAddress(), + amount, + ); + await Staking.connect(node.operational).stake(identityId, amount); +} + +async function calculateExpectedNodeScore( + identityId: bigint, + nodeStake: bigint, + deps: { + ParametersStorage: ParametersStorage; + ProfileStorage: ProfileStorage; + AskStorage: AskStorage; + EpochStorage: EpochStorage; + }, +): Promise { + const { ParametersStorage, ProfileStorage, AskStorage, EpochStorage } = deps; + // Cap stake at maximum + const maximumStake = await ParametersStorage.maximumStake(); + const cappedStake = nodeStake > maximumStake ? maximumStake : nodeStake; + + // 1. Stake Factor + const stakeDivisor = 2000000n; // Magic number from contract + const stakeRatio = cappedStake / stakeDivisor; + const nodeStakeFactor = (2n * stakeRatio ** 2n) / SCALING_FACTOR; + + // 2. Ask Factor + const nodeAsk = await ProfileStorage.getAsk(identityId); + const nodeAskScaled = nodeAsk * SCALING_FACTOR; + const [askLowerBound, askUpperBound] = await AskStorage.getAskBounds(); + let nodeAskFactor = 0n; + + if (nodeAskScaled <= askUpperBound && nodeAskScaled >= askLowerBound) { + const askBoundsDiff = askUpperBound - askLowerBound; + if (askBoundsDiff > 0n) { + // Prevent division by zero + const askDiffRatio = + ((askUpperBound - nodeAskScaled) * SCALING_FACTOR) / askBoundsDiff; + // Ensure intermediate multiplication doesn't overflow - use SCALING_FACTOR**2n directly + nodeAskFactor = + (stakeRatio * askDiffRatio ** 2n) / (SCALING_FACTOR * SCALING_FACTOR); + } else { + // If bounds are equal and ask matches, ratio is effectively 0 or 1 depending on perspective, + // but safer to assign 0 as boundsDiff is 0. + nodeAskFactor = 0n; + } + } + + // 3. Publishing Factor + // Assuming this test runs in an epoch where production has happened + const nodePubFactor = + await EpochStorage.getNodeCurrentEpochProducedKnowledgeValue(identityId); + const maxNodePubFactor = + await EpochStorage.getCurrentEpochNodeMaxProducedKnowledgeValue(); + let nodePublishingFactor = 0n; + if (maxNodePubFactor > 0n) { + // Prevent division by zero + const pubRatio = (nodePubFactor * SCALING_FACTOR) / maxNodePubFactor; + nodePublishingFactor = (nodeStakeFactor * pubRatio) / SCALING_FACTOR; + } + + return nodeStakeFactor + nodePublishingFactor + nodeAskFactor; +} + describe('@integration RandomSampling', () => { let accounts: SignerWithAddress[]; let RandomSampling: RandomSampling; @@ -102,9 +189,6 @@ describe('@integration RandomSampling', () => { let ParanetKnowledgeMinersRegistry: ParanetKnowledgeMinersRegistry; let ParanetKnowledgeCollectionsRegistry: ParanetKnowledgeCollectionsRegistry; - // Sample values for tests - const avgBlockTimeInSeconds = 1; // Average block time - // Deploy all contracts, set the HubOwner and necessary accounts. Returns the RandomSamplingFixture async function deployRandomSamplingFixture(): Promise { await hre.deployments.fixture([ @@ -428,7 +512,75 @@ describe('@integration RandomSampling', () => { expect(challenge.solved).to.be.false; }); - it('Should return an empty challenge if already solved for current period', async () => { + it('Should return the same challenge if unsolved within the period', async () => { + const kcCreator = getDefaultKCCreator(accounts); + const publishingNode = getDefaultPublishingNode(accounts); + const receivingNodes = getDefaultReceivingNodes(accounts); + + const { publishingNodeIdentityId } = await createProfilesAndKC( + kcCreator, + publishingNode, + receivingNodes, + { Profile, KnowledgeCollection, Token }, + merkleRoot, + ); + const minStake = await ParametersStorage.minimumStake(); + await setNodeStake( + publishingNode, + BigInt(publishingNodeIdentityId), + BigInt(minStake), + accounts[0], + { Token, Staking, Ask }, + ); + await Profile.connect(publishingNode.operational).updateAsk( + publishingNodeIdentityId, + 100n, + ); + await Ask.connect(accounts[0]).recalculateActiveSet(); + + // Create first challenge + const tx1 = await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + await tx1.wait(); + const challenge1 = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Mine some blocks but stay within the period + const duration = + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + if (Number(duration) > 2) { + await hre.network.provider.send('evm_mine'); + } + + // Create second challenge in same period + const tx2 = RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + await expect(tx2).to.be.revertedWith( + 'An unsolved challenge already exists for this node in the current proof period', + ); + const challenge2 = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Challenges should be identical + expect(challenge2.knowledgeCollectionId).to.equal( + challenge1.knowledgeCollectionId, + ); + expect(challenge2.chunkId).to.equal(challenge1.chunkId); + expect(challenge2.epoch).to.equal(challenge1.epoch); + expect(challenge2.activeProofPeriodStartBlock).to.equal( + challenge1.activeProofPeriodStartBlock, + ); + expect(challenge2.proofingPeriodDurationInBlocks).to.equal( + challenge1.proofingPeriodDurationInBlocks, + ); + expect(challenge2.solved).to.equal(challenge1.solved); // Both false + }); + + it('Should return an existing solved challenge if already solved for current period', async () => { // Create profile and identity first const publishingNode = getDefaultPublishingNode(accounts); const { identityId } = await createProfile(Profile, publishingNode); @@ -437,69 +589,69 @@ describe('@integration RandomSampling', () => { const mockChallenge = await createMockChallenge(); // Store the mock challenge in the storage contract - await RandomSamplingStorage.setNodeChallenge(identityId, mockChallenge); + // Make sure the mock challenge's start block matches the current active one + const tx1 = + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + await tx1.wait(); + const proofPeriodStatus = + await RandomSamplingStorage.getActiveProofPeriodStatus(); + const proofPeriodStartBlock = + proofPeriodStatus.activeProofPeriodStartBlock; + + const challengeToStore: Challenge = { + ...mockChallenge, + }; + challengeToStore.activeProofPeriodStartBlock = proofPeriodStartBlock; + await RandomSamplingStorage.setNodeChallenge( + identityId, + challengeToStore, + ); // Try to create a new challenge for the same period - const challengeTx = await RandomSampling.connect( + const challengeTx = RandomSampling.connect( publishingNode.operational, ).createChallenge(); - await challengeTx.wait(); + await expect(challengeTx).to.be.revertedWith( + 'The challenge for this proof period has already been solved', + ); - // Get the challenge from the transaction return value - const challenge = + // Get the challenge from storage - it should be the one we stored + const returnedChallenge = await RandomSamplingStorage.getNodeChallenge(identityId); - // Since the challenge was solved, the challenge should still be marked as solved + // Since the challenge was solved, the stored challenge should still be marked as solved + expect(returnedChallenge.knowledgeCollectionId).to.equal( + challengeToStore.knowledgeCollectionId, + ); + expect(returnedChallenge.activeProofPeriodStartBlock).to.equal( + challengeToStore.activeProofPeriodStartBlock, + ); // eslint-disable-next-line @typescript-eslint/no-unused-expressions - expect(challenge.solved).to.be.true; + expect(returnedChallenge.solved).to.be.true; }); - it('Should submit a valid proof successfully', async () => { - const quads = [ - ' "468.9 sq mi" .', - ' "New York" .', - ' "8,336,817" .', - ' "New York" .', - ' .', - ' "0xaac2a420672a1eb77506c544ff01beed2be58c0ee3576fe037c846f97481cefd" .', - ' .', - ' .', - ' .', - ]; - // Generate the Merkle tree and get the root - const merkleRoot = kcTools.calculateMerkleRoot(quads, 32); - - expect(merkleRoot).to.equal( - '0xe860c5ab7ed7c79dbdff4af603cad8952eb2f5573db4e3b06585990f55fd8a95', - ); - + it('Should submit a valid proof successfully and calculate the correct score', async () => { const kcCreator = getDefaultKCCreator(accounts); const publishingNode = getDefaultPublishingNode(accounts); const receivingNodes = getDefaultReceivingNodes(accounts); - const { identityId: publishingNodeIdentityId } = await createProfile( - Profile, + const { publishingNodeIdentityId } = await createProfilesAndKC( + kcCreator, publishingNode, + receivingNodes, + { Profile, KnowledgeCollection, Token }, + merkleRoot, ); - const receivingNodesIdentityIds = ( - await createProfiles(Profile, receivingNodes) - ).map((p) => p.identityId); // Mint tokens and set stake const minStake = await ParametersStorage.minimumStake(); - await Token.mint(accounts[0].address, minStake); - await Token.connect(accounts[0]).approve( - await Staking.getAddress(), - minStake, + await setNodeStake( + publishingNode, + BigInt(publishingNodeIdentityId), + BigInt(minStake), + accounts[0], + { Token, Staking, Ask }, ); - await Staking.stake(publishingNodeIdentityId, minStake); - - expect( - await StakingStorage.getNodeStake(publishingNodeIdentityId), - ).to.equal(minStake); - expect( - await ShardingTableStorage.nodeExists(publishingNodeIdentityId), - ).to.equal(true); // Recalculate the active set const newAsk = 200n; @@ -509,32 +661,6 @@ describe('@integration RandomSampling', () => { ); await Ask.connect(accounts[0]).recalculateActiveSet(); - // Create a knowledge collection - const signaturesData = await getKCSignaturesData( - publishingNode, - publishingNodeIdentityId, - receivingNodes, - merkleRoot, - ); - - await createKnowledgeCollection( - kcCreator, - publishingNodeIdentityId, - receivingNodesIdentityIds, - signaturesData, - { - KnowledgeCollection, - Token, - }, - 'f6821709-be83-464d-a450-84c51d1077f5', - 5, - 1280, - 2, - BigInt('11641036927376871'), - false, - ethers.ZeroAddress, - ); - // Update and get the new active proof period const tx = await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); @@ -566,7 +692,7 @@ describe('@integration RandomSampling', () => { const submitProofTx = await RandomSampling.connect( publishingNode.operational, ).submitProof(challengeChunk, proof); - await submitProofTx.wait(); + const receipt = await submitProofTx.wait(); // Get the challenge from storage to verify it challenge = await RandomSamplingStorage.getNodeChallenge( @@ -576,6 +702,103 @@ describe('@integration RandomSampling', () => { // Since the challenge was solved, the challenge should be marked as solved // eslint-disable-next-line @typescript-eslint/no-unused-expressions expect(challenge.solved).to.be.true; + + await expect(receipt) + .to.emit(RandomSampling, 'ValidProofSubmitted') + .withArgs( + publishingNodeIdentityId, + challenge.epoch, + (score: bigint) => score > 0, // Just check score is positive, calculation checked elsewhere + ); + + const expectedScore = await calculateExpectedNodeScore( + BigInt(publishingNodeIdentityId), + BigInt(minStake), + { + ParametersStorage, + ProfileStorage, + AskStorage, + EpochStorage, + }, + ); + + expect( + await RandomSamplingStorage.getNodeEpochProofPeriodScore( + publishingNodeIdentityId, + challenge.epoch, + challenge.activeProofPeriodStartBlock, + ), + ).to.equal(expectedScore); + + expect( + await RandomSamplingStorage.getEpochAllNodesProofPeriodScore( + challenge.epoch, + + challenge.activeProofPeriodStartBlock, + ), + ).to.equal(expectedScore); + }); + + it('Should fail to submit proof for expired challenge', async () => { + // Setup + const kcCreator = getDefaultKCCreator(accounts); + const publishingNode = getDefaultPublishingNode(accounts); + const receivingNodes = getDefaultReceivingNodes(accounts); + const { publishingNodeIdentityId } = await createProfilesAndKC( + kcCreator, + publishingNode, + receivingNodes, + { Profile, KnowledgeCollection, Token }, + merkleRoot, + ); + const minStake = await ParametersStorage.minimumStake(); + await setNodeStake( + publishingNode, + BigInt(publishingNodeIdentityId), + BigInt(minStake), + accounts[0], + { Token, Staking, Ask }, + ); + await Profile.connect(publishingNode.operational).updateAsk( + publishingNodeIdentityId, + 100n, + ); + await Ask.connect(accounts[0]).recalculateActiveSet(); + + // Create challenge + const challengeTx = await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + await challengeTx.wait(); + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Advance time past the end of the proof period + const duration = challenge.proofingPeriodDurationInBlocks; + // Move past the end block + for (let i = 0; i < Number(duration) + 1; i++) { + await hre.network.provider.send('evm_mine'); + } + + // Try to submit proof + const chunks = kcTools.splitIntoChunks(quads, 32); + const challengeChunk = chunks[challenge.chunkId]; + const { proof } = kcTools.calculateMerkleProof( + quads, + 32, + challenge.chunkId, + ); + + const submitProofTx = RandomSampling.connect( + publishingNode.operational, + ).submitProof(challengeChunk, proof); + + // We check the return value if the function signature allows, or check state hasn't changed. + // In this case, checking the stored challenge state: + await expect(submitProofTx).to.be.revertedWith( + 'This challenge is no longer active', + ); }); }); From 85f8f43fc6589ee4c6608c06c2078daa01e1b0e5 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 11 Apr 2025 09:58:28 +0200 Subject: [PATCH 051/106] Add 'Should fail to submit invalid proof (wrong chunk/proof)' test --- test/integration/RandomSampling.test.ts | 69 +++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index 5cc10328..701f5ba3 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -800,6 +800,75 @@ describe('@integration RandomSampling', () => { 'This challenge is no longer active', ); }); + + it('Should fail to submit invalid proof (wrong chunk/proof)', async () => { + // Setup + const kcCreator = getDefaultKCCreator(accounts); + const publishingNode = getDefaultPublishingNode(accounts); + const receivingNodes = getDefaultReceivingNodes(accounts); + const { publishingNodeIdentityId } = await createProfilesAndKC( + kcCreator, + publishingNode, + receivingNodes, + { Profile, KnowledgeCollection, Token }, + merkleRoot, + ); + const minStake = await ParametersStorage.minimumStake(); + await setNodeStake( + publishingNode, + BigInt(publishingNodeIdentityId), + BigInt(minStake), + accounts[0], + { Token, Staking, Ask }, + ); + await Profile.connect(publishingNode.operational).updateAsk( + publishingNodeIdentityId, + 100n, + ); + await Ask.connect(accounts[0]).recalculateActiveSet(); + + // Create challenge + const challengeTx = await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + await challengeTx.wait(); + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Generate invalid proof data (e.g., wrong chunk or manipulated proof) + const chunks = kcTools.splitIntoChunks(quads, 32); + const wrongChunk = chunks[challenge.chunkId + 1n]; + const { proof } = kcTools.calculateMerkleProof( + quads, + 32, + challenge.chunkId, + ); // Correct proof + + // Try submitting correct proof with wrong chunk + const submitWrongChunkTx = RandomSampling.connect( + publishingNode.operational, + ).submitProof(wrongChunk, proof); + await expect(submitWrongChunkTx).to.be.revertedWith('Proof is not valid'); + let finalChallenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(finalChallenge.solved).to.be.false; + + // Try submitting correct chunk with wrong proof (e.g., an empty proof) + const challengeChunk = chunks[challenge.chunkId]; + const wrongProof: string[] = []; + const submitWrongProofTx = RandomSampling.connect( + publishingNode.operational, + ).submitProof(challengeChunk, wrongProof); + await expect(submitWrongProofTx).to.be.revertedWith('Proof is not valid'); + finalChallenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(finalChallenge.solved).to.be.false; + }); }); describe('Score Calculation', () => { From 4a9f6b64387dc22d538d8daf0ddfcf62f8078f6f Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 11 Apr 2025 10:36:19 +0200 Subject: [PATCH 052/106] Fix division by zero in _generateChallenge --- contracts/RandomSampling.sol | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index c071f833..9540cc9a 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -241,8 +241,11 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { uint8(1) // sector = 1 by default ) ); - uint256 knowledgeCollectionId = 0; uint256 knowledgeCollectionsCount = knowledgeCollectionStorage.getLatestKnowledgeCollectionId(); + if (knowledgeCollectionsCount == 0) { + revert("No knowledge collections exist"); + } + uint256 knowledgeCollectionId = 0; uint256 currentEpoch = chronos.getCurrentEpoch(); for (uint8 i = 0; i < 50; ) { knowledgeCollectionId = (uint256(pseudoRandomVariable) % knowledgeCollectionsCount) + 1; From f08c8f57dd7628a62ae65e81f4ccf5bd917988b2 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 11 Apr 2025 10:38:11 +0200 Subject: [PATCH 053/106] Add 'Should fail challenge creation if no active Knowledge Collections exist' test --- test/integration/RandomSampling.test.ts | 111 ++++++++++++++---------- 1 file changed, 63 insertions(+), 48 deletions(-) diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index 701f5ba3..67429bfe 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -554,18 +554,18 @@ describe('@integration RandomSampling', () => { await hre.network.provider.send('evm_mine'); } - // Create second challenge in same period + // Attempt to create second challenge - should revert const tx2 = RandomSampling.connect( publishingNode.operational, ).createChallenge(); await expect(tx2).to.be.revertedWith( 'An unsolved challenge already exists for this node in the current proof period', ); + + // Verify stored challenge hasn't changed const challenge2 = await RandomSamplingStorage.getNodeChallenge( publishingNodeIdentityId, ); - - // Challenges should be identical expect(challenge2.knowledgeCollectionId).to.equal( challenge1.knowledgeCollectionId, ); @@ -580,54 +580,24 @@ describe('@integration RandomSampling', () => { expect(challenge2.solved).to.equal(challenge1.solved); // Both false }); - it('Should return an existing solved challenge if already solved for current period', async () => { + it('Should revert if creating challenge when already solved for current period', async () => { // Create profile and identity first const publishingNode = getDefaultPublishingNode(accounts); const { identityId } = await createProfile(Profile, publishingNode); // Create a mock challenge that's marked as solved - const mockChallenge = await createMockChallenge(); + const mockChallenge = await createMockChallenge(); // Uses helper which sets solved=true // Store the mock challenge in the storage contract - // Make sure the mock challenge's start block matches the current active one - const tx1 = - await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); - await tx1.wait(); - const proofPeriodStatus = - await RandomSamplingStorage.getActiveProofPeriodStatus(); - const proofPeriodStartBlock = - proofPeriodStatus.activeProofPeriodStartBlock; - - const challengeToStore: Challenge = { - ...mockChallenge, - }; - challengeToStore.activeProofPeriodStartBlock = proofPeriodStartBlock; - await RandomSamplingStorage.setNodeChallenge( - identityId, - challengeToStore, - ); + await RandomSamplingStorage.setNodeChallenge(identityId, mockChallenge); - // Try to create a new challenge for the same period + // Try to create a new challenge for the same period - should revert const challengeTx = RandomSampling.connect( publishingNode.operational, ).createChallenge(); await expect(challengeTx).to.be.revertedWith( 'The challenge for this proof period has already been solved', ); - - // Get the challenge from storage - it should be the one we stored - const returnedChallenge = - await RandomSamplingStorage.getNodeChallenge(identityId); - - // Since the challenge was solved, the stored challenge should still be marked as solved - expect(returnedChallenge.knowledgeCollectionId).to.equal( - challengeToStore.knowledgeCollectionId, - ); - expect(returnedChallenge.activeProofPeriodStartBlock).to.equal( - challengeToStore.activeProofPeriodStartBlock, - ); - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - expect(returnedChallenge.solved).to.be.true; }); it('Should submit a valid proof successfully and calculate the correct score', async () => { @@ -836,38 +806,83 @@ describe('@integration RandomSampling', () => { publishingNodeIdentityId, ); - // Generate invalid proof data (e.g., wrong chunk or manipulated proof) + // Generate invalid proof data const chunks = kcTools.splitIntoChunks(quads, 32); - const wrongChunk = chunks[challenge.chunkId + 1n]; - const { proof } = kcTools.calculateMerkleProof( + const correctChunk = chunks[challenge.chunkId]; + const wrongChunk = + challenge.chunkId + 1n < chunks.length + ? chunks[challenge.chunkId + 1n] + : challenge.chunkId > 0 + ? chunks[challenge.chunkId - 1n] + : 'invalid chunk data'; + const { proof: correctProof } = kcTools.calculateMerkleProof( quads, 32, challenge.chunkId, - ); // Correct proof + ); + const wrongProof: string[] = []; // Try submitting correct proof with wrong chunk const submitWrongChunkTx = RandomSampling.connect( publishingNode.operational, - ).submitProof(wrongChunk, proof); + ).submitProof(wrongChunk, correctProof); await expect(submitWrongChunkTx).to.be.revertedWith('Proof is not valid'); let finalChallenge = await RandomSamplingStorage.getNodeChallenge( publishingNodeIdentityId, ); // eslint-disable-next-line @typescript-eslint/no-unused-expressions - expect(finalChallenge.solved).to.be.false; + expect(finalChallenge.solved).to.be.false; // Ensure state unchanged - // Try submitting correct chunk with wrong proof (e.g., an empty proof) - const challengeChunk = chunks[challenge.chunkId]; - const wrongProof: string[] = []; + // Try submitting correct chunk with wrong proof const submitWrongProofTx = RandomSampling.connect( publishingNode.operational, - ).submitProof(challengeChunk, wrongProof); + ).submitProof(correctChunk, wrongProof); await expect(submitWrongProofTx).to.be.revertedWith('Proof is not valid'); finalChallenge = await RandomSamplingStorage.getNodeChallenge( publishingNodeIdentityId, ); // eslint-disable-next-line @typescript-eslint/no-unused-expressions - expect(finalChallenge.solved).to.be.false; + expect(finalChallenge.solved).to.be.false; // Ensure state unchanged + }); + + it('Should fail challenge creation if no active Knowledge Collections exist', async () => { + // Setup a node profile + const publishingNode = getDefaultPublishingNode(accounts); + + const { identityId: publishingNodeIdentityId } = await createProfile( + Profile, + publishingNode, + ); + + const minStake = await ParametersStorage.minimumStake(); + await setNodeStake( + publishingNode, + BigInt(publishingNodeIdentityId), + BigInt(minStake), + accounts[0], + { + Token, + Staking, + Ask, + }, + ); + await Profile.connect(publishingNode.operational).updateAsk( + BigInt(publishingNodeIdentityId), + 100n, + ); + await Ask.connect(accounts[0]).recalculateActiveSet(); + + // Ensure no KCs are created or they are expired (by default none are created here) + + // Attempt to create challenge + const createTx = RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + + // Verification + await expect(createTx).to.be.revertedWith( + 'No knowledge collections exist', + ); }); }); From 7805526b8057f2a264161711009b0bad6a5905c8 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 11 Apr 2025 14:02:09 +0200 Subject: [PATCH 054/106] Add errors for testing --- abi/RandomSampling.json | 16 ++++++++++++++++ contracts/RandomSampling.sol | 4 +++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index 872bc387..aee66ebe 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -25,6 +25,22 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "computedMerkleRoot", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "expectedMerkleRoot", + "type": "bytes32" + } + ], + "name": "MerkleRootMismatchError", + "type": "error" + }, { "inputs": [ { diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 9540cc9a..0a5cecc3 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -39,6 +39,8 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { ParametersStorage public parametersStorage; ShardingTableStorage public shardingTableStorage; + error MerkleRootMismatchError(bytes32 computedMerkleRoot, bytes32 expectedMerkleRoot); + event ChallengeCreated( uint256 indexed identityId, uint256 indexed epoch, @@ -173,7 +175,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { emit ValidProofSubmitted(identityId, epoch, score); } else { - revert("Proof is not valid"); + revert MerkleRootMismatchError(computedMerkleRoot, expectedMerkleRoot); } } From 53a6c734e19934bbedd33f1a90fdc6d6b577e062 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 11 Apr 2025 15:48:25 +0200 Subject: [PATCH 055/106] pass leafHash instead of chunk --- abi/RandomSampling.json | 6 +++--- contracts/RandomSampling.sol | 9 ++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index aee66ebe..6b560c27 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -478,9 +478,9 @@ { "inputs": [ { - "internalType": "string", - "name": "chunk", - "type": "string" + "internalType": "bytes32", + "name": "chunkHash", + "type": "bytes32" }, { "internalType": "bytes32[]", diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 0a5cecc3..77393ac2 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -137,7 +137,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { randomSamplingStorage.setNodeChallenge(identityId, challenge); } - function submitProof(string memory chunk, bytes32[] calldata merkleProof) public { + function submitProof(bytes32 chunkHash, bytes32[] calldata merkleProof) public { // Get node identityId uint72 identityId = identityStorage.getIdentityId(msg.sender); @@ -152,7 +152,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { } // Construct the merkle root from chunk and merkleProof - bytes32 computedMerkleRoot = _computeMerkleRootFromProof(chunk, challenge.chunkId, merkleProof); + bytes32 computedMerkleRoot = _computeMerkleRootFromProof(chunkHash, merkleProof); // Get the expected merkle root for this challenge bytes32 expectedMerkleRoot = knowledgeCollectionStorage.getLatestMerkleRoot(challenge.knowledgeCollectionId); @@ -206,11 +206,10 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { } function _computeMerkleRootFromProof( - string memory chunk, - uint256 chunkId, + bytes32 chunkHash, bytes32[] memory merkleProof ) internal pure returns (bytes32) { - bytes32 computedHash = keccak256(abi.encodePacked(chunk, chunkId)); + bytes32 computedHash = chunkHash; for (uint256 i = 0; i < merkleProof.length; ) { if (computedHash < merkleProof[i]) { From a240fb35550c633f27e9c20d7c0256f1af572076 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Mon, 14 Apr 2025 11:59:47 +0200 Subject: [PATCH 056/106] Revert to argument initial data type --- abi/RandomSampling.json | 6 +++--- contracts/RandomSampling.sol | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index 6b560c27..aee66ebe 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -478,9 +478,9 @@ { "inputs": [ { - "internalType": "bytes32", - "name": "chunkHash", - "type": "bytes32" + "internalType": "string", + "name": "chunk", + "type": "string" }, { "internalType": "bytes32[]", diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 77393ac2..0a5cecc3 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -137,7 +137,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { randomSamplingStorage.setNodeChallenge(identityId, challenge); } - function submitProof(bytes32 chunkHash, bytes32[] calldata merkleProof) public { + function submitProof(string memory chunk, bytes32[] calldata merkleProof) public { // Get node identityId uint72 identityId = identityStorage.getIdentityId(msg.sender); @@ -152,7 +152,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { } // Construct the merkle root from chunk and merkleProof - bytes32 computedMerkleRoot = _computeMerkleRootFromProof(chunkHash, merkleProof); + bytes32 computedMerkleRoot = _computeMerkleRootFromProof(chunk, challenge.chunkId, merkleProof); // Get the expected merkle root for this challenge bytes32 expectedMerkleRoot = knowledgeCollectionStorage.getLatestMerkleRoot(challenge.knowledgeCollectionId); @@ -206,10 +206,11 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { } function _computeMerkleRootFromProof( - bytes32 chunkHash, + string memory chunk, + uint256 chunkId, bytes32[] memory merkleProof ) internal pure returns (bytes32) { - bytes32 computedHash = chunkHash; + bytes32 computedHash = keccak256(abi.encodePacked(chunk, chunkId)); for (uint256 i = 0; i < merkleProof.length; ) { if (computedHash < merkleProof[i]) { From fa880ebc72596b59991fcecc28da0358ab08f636 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Mon, 14 Apr 2025 14:50:16 +0200 Subject: [PATCH 057/106] Fix nodeAskScaled overflow issue --- contracts/RandomSampling.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 0a5cecc3..b831e4a0 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -299,12 +299,12 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { uint96 maximumStake = parametersStorage.maximumStake(); uint256 nodeStake = stakingStorage.getNodeStake(identityId); nodeStake = nodeStake > maximumStake ? maximumStake : nodeStake; - uint256 stakeRatio = nodeStake / 2000000; + uint256 stakeRatio = nodeStake / 2_000_000; uint256 nodeStakeFactor = (2 * stakeRatio * stakeRatio) / SCALING_FACTOR; // 2. Node ask factor calculation // Formula: nodeStake * ((upperAskBound - nodeAsk) / (upperAskBound - lowerAskBound))^2 / 2,000,000 - uint256 nodeAskScaled = profileStorage.getAsk(identityId) * 1e18; + uint256 nodeAskScaled = uint256(profileStorage.getAsk(identityId)) * 1e18; (uint256 askLowerBound, uint256 askUpperBound) = askStorage.getAskBounds(); uint256 nodeAskFactor = 0; if (nodeAskScaled <= askUpperBound && nodeAskScaled >= askLowerBound) { From b37f1fbca5125e76ee11fd079bfd67bd2f964630 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Mon, 14 Apr 2025 16:14:33 +0200 Subject: [PATCH 058/106] Add division by zero checks in storage --- contracts/storage/RandomSamplingStorage.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 71dce3b5..737761e2 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -65,6 +65,10 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, HubDepende function updateAndGetActiveProofPeriodStartBlock() external returns (uint256) { uint256 activeProofingPeriodDurationInBlocks = getActiveProofingPeriodDurationInBlocks(); + if (activeProofingPeriodDurationInBlocks == 0) { + revert("Active proofing period duration in blocks should not be 0"); + } + if (block.number > activeProofPeriodStartBlock + activeProofingPeriodDurationInBlocks - 1) { // Calculate how many complete periods have passed since the last active period started uint256 blocksSinceLastStart = block.number - activeProofPeriodStartBlock; From 4179496388044c8cf5c505207546d732cc9a5ff1 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 15 Apr 2025 11:15:19 +0200 Subject: [PATCH 059/106] Gas optimizations --- abi/RandomSampling.json | 49 +++++++++++++-------- abi/RandomSamplingStorage.json | 4 +- contracts/RandomSampling.sol | 26 +++++------ contracts/storage/RandomSamplingStorage.sol | 9 ++-- 4 files changed, 52 insertions(+), 36 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index aee66ebe..72cf9a25 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -13,12 +13,12 @@ }, { "internalType": "uint256", - "name": "_W1", + "name": "_w1", "type": "uint256" }, { "internalType": "uint256", - "name": "_W2", + "name": "_w2", "type": "uint256" } ], @@ -153,20 +153,7 @@ }, { "inputs": [], - "name": "W1", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "W2", + "name": "SCALING_FACTOR", "outputs": [ { "internalType": "uint256", @@ -414,7 +401,7 @@ "inputs": [ { "internalType": "uint256", - "name": "_W1", + "name": "_w1", "type": "uint256" } ], @@ -427,7 +414,7 @@ "inputs": [ { "internalType": "uint256", - "name": "_W2", + "name": "_w2", "type": "uint256" } ], @@ -505,5 +492,31 @@ ], "stateMutability": "pure", "type": "function" + }, + { + "inputs": [], + "name": "w1", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "w2", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" } ] diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json index 4be8ee25..1e9090eb 100644 --- a/abi/RandomSamplingStorage.json +++ b/abi/RandomSamplingStorage.json @@ -47,7 +47,7 @@ "type": "uint16" }, { - "indexed": false, + "indexed": true, "internalType": "uint256", "name": "effectiveEpoch", "type": "uint256" @@ -66,7 +66,7 @@ "type": "uint16" }, { - "indexed": false, + "indexed": true, "internalType": "uint256", "name": "effectiveEpoch", "type": "uint256" diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index b831e4a0..8e3e9672 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -19,13 +19,13 @@ import {DelegatorsInfo} from "./storage/DelegatorsInfo.sol"; import {ParametersStorage} from "./storage/ParametersStorage.sol"; import {ShardingTableStorage} from "./storage/ShardingTableStorage.sol"; -contract RandomSampling is INamed, IVersioned, ContractStatus { +contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { string private constant _NAME = "RandomSampling"; string private constant _VERSION = "1.0.0"; - uint256 SCALING_FACTOR = 1e18; + uint256 public constant SCALING_FACTOR = 1e18; uint8 public avgBlockTimeInSeconds; - uint256 public W1; - uint256 public W2; + uint256 public w1; + uint256 public w2; IdentityStorage public identityStorage; RandomSamplingStorage public randomSamplingStorage; @@ -53,10 +53,10 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { event AvgBlockTimeUpdated(uint8 avgBlockTimeInSeconds); event ProofingPeriodDurationInBlocksUpdated(uint8 durationInBlocks); - constructor(address hubAddress, uint8 _avgBlockTimeInSeconds, uint256 _W1, uint256 _W2) ContractStatus(hubAddress) { + constructor(address hubAddress, uint8 _avgBlockTimeInSeconds, uint256 _w1, uint256 _w2) ContractStatus(hubAddress) { avgBlockTimeInSeconds = _avgBlockTimeInSeconds; - W1 = _W1; - W2 = _W2; + w1 = _w1; + w2 = _w2; } function initialize() external { @@ -83,12 +83,12 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { return _VERSION; } - function setW1(uint256 _W1) external onlyHubOwner { - W1 = _W1; + function setW1(uint256 _w1) external onlyHubOwner { + w1 = _w1; } - function setW2(uint256 _W2) external onlyHubOwner { - W2 = _W2; + function setW2(uint256 _w2) external onlyHubOwner { + w2 = _w2; } function setAvgBlockTimeInSeconds(uint8 blockTimeInSeconds) external onlyHubOwner { @@ -199,7 +199,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { uint256 totalEpochTracFees = epochStorage.getEpochPool(1, epoch); uint256 reward = ((totalEpochTracFees / 2) * - (W1 * (epochNodeValidProofsCount / allExpectedEpochProofsCount) + W2 * epochNodeDelegatorScore)) / + (w1 * (epochNodeValidProofsCount / allExpectedEpochProofsCount) + w2 * epochNodeDelegatorScore)) / SCALING_FACTOR ** 2; return reward; @@ -208,7 +208,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus { function _computeMerkleRootFromProof( string memory chunk, uint256 chunkId, - bytes32[] memory merkleProof + bytes32[] calldata merkleProof ) internal pure returns (bytes32) { bytes32 computedHash = keccak256(abi.encodePacked(chunk, chunkId)); diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 737761e2..832783d3 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -29,11 +29,11 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, HubDepende // epoch => identityId => delegatorKey => score mapping(uint256 => mapping(uint72 => mapping(bytes32 => uint256))) public epochNodeDelegatorScore; - event ProofingPeriodDurationAdded(uint16 durationInBlocks, uint256 effectiveEpoch); + event ProofingPeriodDurationAdded(uint16 durationInBlocks, uint256 indexed effectiveEpoch); event PendingProofingPeriodDurationReplaced( uint16 oldDurationInBlocks, uint16 newDurationInBlocks, - uint256 effectiveEpoch + uint256 indexed effectiveEpoch ); constructor(address hubAddress, uint16 _proofingPeriodDurationInBlocks) HubDependent(hubAddress) { @@ -162,7 +162,10 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, HubDepende return nodesChallenges[identityId]; } - function setNodeChallenge(uint72 identityId, RandomSamplingLib.Challenge memory challenge) external onlyContracts { + function setNodeChallenge( + uint72 identityId, + RandomSamplingLib.Challenge calldata challenge + ) external onlyContracts { nodesChallenges[identityId] = challenge; } From 5144fe36e430349d0798a527636b7665b9cb29e5 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 15 Apr 2025 16:06:04 +0200 Subject: [PATCH 060/106] Fix blockhash bug and add requires --- contracts/RandomSampling.sol | 10 +++++++++- contracts/storage/RandomSamplingStorage.sol | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 8e3e9672..368af8ed 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -54,6 +54,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { event ProofingPeriodDurationInBlocksUpdated(uint8 durationInBlocks); constructor(address hubAddress, uint8 _avgBlockTimeInSeconds, uint256 _w1, uint256 _w2) ContractStatus(hubAddress) { + require(_avgBlockTimeInSeconds > 0, "Average block time in seconds must be greater than 0"); avgBlockTimeInSeconds = _avgBlockTimeInSeconds; w1 = _w1; w2 = _w2; @@ -92,6 +93,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { } function setAvgBlockTimeInSeconds(uint8 blockTimeInSeconds) external onlyHubOwner { + require(blockTimeInSeconds > 0, "Block time in seconds must be greater than 0"); avgBlockTimeInSeconds = blockTimeInSeconds; emit AvgBlockTimeUpdated(blockTimeInSeconds); } @@ -185,10 +187,15 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { uint256 epochNodeValidProofsCount = randomSamplingStorage.getEpochNodeValidProofsCount(epoch, identityId); uint256 proofingPeriodDurationInBlocks = randomSamplingStorage.getEpochProofingPeriodDurationInBlocks(epoch); + uint256 maxNodeProofsInEpoch = chronos.epochLength() / (proofingPeriodDurationInBlocks * avgBlockTimeInSeconds); uint256 allExpectedEpochProofsCount = shardingTableStorage.nodesCount() * maxNodeProofsInEpoch; + if (allExpectedEpochProofsCount == 0) { + revert("All expected epoch proofs count is 0"); + } + bytes32 delegatorKey = keccak256(abi.encodePacked(msg.sender)); uint256 epochNodeDelegatorScore = randomSamplingStorage.getEpochNodeDelegatorScore( epoch, @@ -231,7 +238,8 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { uint72 identityId, address originalSender ) internal returns (RandomSamplingLib.Challenge memory) { - bytes32 myBlockHash = blockhash(block.number - (identityId % 256)); + // +1 to avoid blockhash(block.number) situation + bytes32 myBlockHash = blockhash(block.number - ((identityId % 256) + 1)); bytes32 pseudoRandomVariable = keccak256( abi.encodePacked( diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 832783d3..9a5bf93c 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -37,6 +37,7 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, HubDepende ); constructor(address hubAddress, uint16 _proofingPeriodDurationInBlocks) HubDependent(hubAddress) { + require(_proofingPeriodDurationInBlocks > 0, "Proofing period duration in blocks must be greater than 0"); proofingPeriodDurations.push( RandomSamplingLib.ProofingPeriodDuration({ durationInBlocks: _proofingPeriodDurationInBlocks, From 6dc4eb10ed39336a10ff6c154497f9da68af0102 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 16 Apr 2025 10:44:40 +0200 Subject: [PATCH 061/106] Update setup helpers --- test/helpers/setup-helpers.ts | 64 +++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/test/helpers/setup-helpers.ts b/test/helpers/setup-helpers.ts index 7cf5c109..ae24a898 100644 --- a/test/helpers/setup-helpers.ts +++ b/test/helpers/setup-helpers.ts @@ -1,5 +1,8 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { createProfile } from './profile-helpers'; +import { Ask, Staking, Token, Profile } from '../../typechain'; + export function getDefaultPublishingNode(accounts: SignerWithAddress[]) { return { admin: accounts[1], @@ -20,3 +23,64 @@ export function getDefaultReceivingNodes( export function getDefaultKCCreator(accounts: SignerWithAddress[]) { return accounts[9]; } + +export async function setNodeStake( + node: { operational: SignerWithAddress; admin: SignerWithAddress }, + identityId: bigint, + amount: bigint, + deps: { Token: Token; Staking: Staking; Ask: Ask }, +) { + const { Token, Staking } = deps; + + await Token.mint(node.operational.address, amount); + await Token.connect(node.operational).approve( + await Staking.getAddress(), + amount, + ); + await Staking.connect(node.operational).stake(identityId, amount); +} + +export async function setupNodeWithStakeAndAsk( + accountIndex: number, + stakeAmount: bigint, + askAmount: bigint, + deps: { + accounts: SignerWithAddress[]; + Profile: Profile; + Token: Token; + Staking: Staking; + Ask: Ask; + }, +): Promise<{ + node: { operational: SignerWithAddress; admin: SignerWithAddress }; + identityId: number; +}> { + const { accounts, Profile, Token, Staking, Ask } = deps; + // Use distinct accounts for operational and admin keys + const operationalAccountIndex = accountIndex; + const adminAccountIndex = operationalAccountIndex + 1; + + if (adminAccountIndex >= accounts.length) { + throw new Error( + `Not enough accounts for score test setup (needed index ${adminAccountIndex})`, + ); + } + + const node = { + operational: accounts[operationalAccountIndex], + admin: accounts[adminAccountIndex], + }; + // create profile + const { identityId } = await createProfile(Profile, node); + // set stake + await setNodeStake(node, BigInt(identityId), stakeAmount, { + Token, + Staking, + Ask, + }); + // set ask + await Profile.connect(node.operational).updateAsk(identityId, askAmount); + await Ask.connect(accounts[0]).recalculateActiveSet(); + + return { node, identityId }; +} From 894879ebfcd8638460e810d3dd8aa082a4c1a939 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 16 Apr 2025 10:45:36 +0200 Subject: [PATCH 062/106] Update Staking version test --- test/unit/Staking.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/Staking.test.ts b/test/unit/Staking.test.ts index 9337b6bf..c0182088 100644 --- a/test/unit/Staking.test.ts +++ b/test/unit/Staking.test.ts @@ -109,7 +109,7 @@ describe('Staking contract', function () { it('Should have correct name and version', async () => { expect(await Staking.name()).to.equal('Staking'); - expect(await Staking.version()).to.equal('1.0.0'); + expect(await Staking.version()).to.equal('1.0.1'); }); it('Should revert if staking 0 tokens', async () => { From f1569723ddca9f5b4e17b5dc91fd98d2fa38fca8 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 16 Apr 2025 10:48:21 +0200 Subject: [PATCH 063/106] Add new and reorg old tests --- test/integration/RandomSampling.test.ts | 780 ++++++++++++++++-------- 1 file changed, 537 insertions(+), 243 deletions(-) diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index 67429bfe..5ea2d87d 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -28,12 +28,14 @@ import { ParametersStorage, Ask, } from '../../typechain'; -import { createProfilesAndKC } from '../helpers/kc-helpers'; -import { createProfile } from '../helpers/profile-helpers'; +import { createKnowledgeCollection } from '../helpers/kc-helpers'; +import { createProfile, createProfiles } from '../helpers/profile-helpers'; import { getDefaultKCCreator, getDefaultReceivingNodes, getDefaultPublishingNode, + setupNodeWithStakeAndAsk, + setNodeStake, } from '../helpers/setup-helpers'; // Sample values for tests @@ -53,17 +55,6 @@ const quads = [ // Generate the Merkle tree and get the root const merkleRoot = kcTools.calculateMerkleRoot(quads, 32); -// Type definition for a Challenge -type Challenge = { - knowledgeCollectionId: bigint; - chunkId: bigint; - knowledgeCollectionStorageContract: string; - epoch: bigint; - activeProofPeriodStartBlock: bigint; - proofingPeriodDurationInBlocks: bigint; - solved: boolean; -}; - // Fixture containing all contracts and accounts needed to test RandomSampling type RandomSamplingFixture = { accounts: SignerWithAddress[]; @@ -90,23 +81,6 @@ type RandomSamplingFixture = { Ask: Ask; }; -async function setNodeStake( - node: { operational: SignerWithAddress; admin: SignerWithAddress }, - identityId: bigint, - amount: bigint, - hubOwner: SignerWithAddress, - deps: { Token: Token; Staking: Staking; Ask: Ask }, -) { - const { Token, Staking } = deps; - - await Token.mint(node.operational.address, amount); - await Token.connect(node.operational).approve( - await Staking.getAddress(), - amount, - ); - await Staking.connect(node.operational).stake(identityId, amount); -} - async function calculateExpectedNodeScore( identityId: bigint, nodeStake: bigint, @@ -317,38 +291,6 @@ describe('@integration RandomSampling', () => { } = await loadFixture(deployRandomSamplingFixture)); }); - // Helper function to create a mock challenge - async function createMockChallenge(): Promise { - // Get all values as BigNumberish - const activeBlockTx = - await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); - await activeBlockTx.wait(); - - const activeBlockStatus = - await RandomSamplingStorage.getActiveProofPeriodStatus(); - const activeBlock = activeBlockStatus.activeProofPeriodStartBlock; - - const currentEpochTx = await Chronos.getCurrentEpoch(); - const currentEpoch = BigInt(currentEpochTx.toString()); - - const proofingPeriodDurationTx = - await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); - const proofingPeriodDuration = BigInt(proofingPeriodDurationTx.toString()); - - const challenge: Challenge = { - knowledgeCollectionId: 1n, - chunkId: 1n, - knowledgeCollectionStorageContract: - await KnowledgeCollectionStorage.getAddress(), - epoch: currentEpoch, - activeProofPeriodStartBlock: activeBlock, - proofingPeriodDurationInBlocks: proofingPeriodDuration, - solved: true, - }; - - return challenge; - } - describe('Contract Initialization', () => { it('Should return the correct name and version of the RandomSampling contract', async () => { const name = await RandomSampling.name(); @@ -363,12 +305,12 @@ describe('@integration RandomSampling', () => { }); it('Should have the correct W1 after initialization', async () => { - const W1 = await RandomSampling.W1(); + const W1 = await RandomSampling.w1(); expect(W1).to.equal(0); }); it('Should have the correct W2 after initialization', async () => { - const W2 = await RandomSampling.W2(); + const W2 = await RandomSampling.w2(); expect(W2).to.equal(2); }); @@ -404,139 +346,256 @@ describe('@integration RandomSampling', () => { }); }); - describe('Proofing Period Management', () => { - it('Should return the correct proofing period status', async () => { - const status = await RandomSamplingStorage.getActiveProofPeriodStatus(); - expect(status.activeProofPeriodStartBlock).to.be.a('bigint'); - expect(status.isValid).to.be.a('boolean'); - }); + describe('Proofing Period Duration Management', () => { + it('Should add proofing period duration if none is pending', async () => { + // Setup + const currentEpoch = await Chronos.getCurrentEpoch(); + const initialDuration = + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + const newDuration = initialDuration + 10n; + const expectedEffectiveEpoch = currentEpoch + 1n; + const hubOwner = accounts[0]; - it('Should update activeProofPeriodStartBlock when period expires', async () => { - // Get initial active proof period using a view function - const initialTx = - await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); - await initialTx.wait(); + // Ensure no pending change initially + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect( + await RandomSamplingStorage.isPendingProofingPeriodDuration(), + 'Should be no pending duration initially', + ).to.be.false; - const initialStatus = - await RandomSamplingStorage.getActiveProofPeriodStatus(); - const initialPeriodStartBlock = initialStatus.activeProofPeriodStartBlock; + // Action + const setDurationTx = + await RandomSampling.connect( + hubOwner, + ).setProofingPeriodDurationInBlocks(newDuration); + + // Verification + // 1. Event Emission + await expect(setDurationTx) + .to.emit(RandomSamplingStorage, 'ProofingPeriodDurationAdded') + .withArgs(newDuration, expectedEffectiveEpoch); + + // 2. Pending state updated + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect( + await RandomSamplingStorage.isPendingProofingPeriodDuration(), + 'Should be a pending duration after setting', + ).to.be.true; - const currentBlock = await hre.ethers.provider.getBlockNumber(); - const diff = currentBlock - Number(initialPeriodStartBlock); + // 3. Active duration remains unchanged in the current epoch + expect( + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(), + 'Active duration should remain unchanged in current epoch', + ).to.equal(initialDuration); + }); - // Mine blocks to pass the proofing period - const proofingPeriodDuration = + it('Should replace pending proofing period duration if one exists', async () => { + // Setup + const currentEpoch = await Chronos.getCurrentEpoch(); + const avgBlockTimeInSeconds = + await RandomSampling.avgBlockTimeInSeconds(); + const initialDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); - const blocksToMine = Number(proofingPeriodDuration) - diff; + const firstNewDuration = initialDuration + 10n; + const secondNewDuration = firstNewDuration + 10n; + const expectedEffectiveEpoch = currentEpoch + 1n; + const hubOwner = accounts[0]; + + // Add the first pending change + await RandomSampling.connect(hubOwner).setProofingPeriodDurationInBlocks( + firstNewDuration, + ); + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect( + await RandomSamplingStorage.isPendingProofingPeriodDuration(), + 'Should have pending duration after first set', + ).to.be.true; + + // Action: Replace the pending change + const replaceDurationTx = + await RandomSampling.connect( + hubOwner, + ).setProofingPeriodDurationInBlocks(secondNewDuration); + + // Verification + // 1. Event Emission + await expect(replaceDurationTx) + .to.emit(RandomSamplingStorage, 'PendingProofingPeriodDurationReplaced') + .withArgs(firstNewDuration, secondNewDuration, expectedEffectiveEpoch); - for (let i = 0; i < blocksToMine; i++) { + // 2. Pending state remains true + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect( + await RandomSamplingStorage.isPendingProofingPeriodDuration(), + 'Should still have pending duration after replace', + ).to.be.true; + + // 3. Active duration remains unchanged in the current epoch + expect( + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(), + 'Active duration should remain unchanged', + ).to.equal(initialDuration); + + // 4. Check the actual pending value + // Advance to the effective epoch + const timeUntilNextEpoch = await Chronos.timeUntilNextEpoch(); + const blocksUntilNextEpoch = + Number(timeUntilNextEpoch) / Number(avgBlockTimeInSeconds) + 10; + for (let i = 0; i < blocksUntilNextEpoch; i++) { await hre.network.provider.send('evm_mine'); } - // Update and get the new active proof period - const tx = - await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); - await tx.wait(); + expect( + await Chronos.getCurrentEpoch(), + 'Should be in the next epoch', + ).to.equal(expectedEffectiveEpoch); + expect( + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(), + 'Active duration should be updated in effective epoch', + ).to.equal(secondNewDuration); + }); - const statusAfterUpdate = - await RandomSamplingStorage.getActiveProofPeriodStatus(); - const newPeriodStartBlock = statusAfterUpdate.activeProofPeriodStartBlock; + it('Should correctly apply the new duration only in the effective epoch', async () => { + // Setup + const currentEpoch = await Chronos.getCurrentEpoch(); + const effectiveEpoch = currentEpoch + 1n; + const initialDuration = + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + const newDuration = initialDuration + 20n; // Different new duration + const hubOwner = accounts[0]; + const avgBlockTime = await RandomSampling.avgBlockTimeInSeconds(); - // The new period should be different from the initial one - expect(newPeriodStartBlock).to.be.greaterThan(initialPeriodStartBlock); - expect(newPeriodStartBlock).to.be.equal( - initialPeriodStartBlock + BigInt(proofingPeriodDuration), + // Schedule change for next epoch + await RandomSampling.connect(hubOwner).setProofingPeriodDurationInBlocks( + newDuration, + ); + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect( + await RandomSamplingStorage.isPendingProofingPeriodDuration(), + 'Duration change should be pending', + ).to.be.true; + + // Ensure activeProofPeriodStartBlock is initialized if needed + let initialStartBlockE = ( + await RandomSamplingStorage.getActiveProofPeriodStatus() + ).activeProofPeriodStartBlock; + if (initialStartBlockE === 0n) { + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + initialStartBlockE = ( + await RandomSamplingStorage.getActiveProofPeriodStatus() + ).activeProofPeriodStartBlock; + } + expect(initialStartBlockE).to.be.greaterThan( + 0n, + 'Initial start block should be > 0', ); - }); - }); - describe('Challenge Creation and Proof Submission', () => { - it('Should create a challenge for a node', async () => { - const kcCreator = getDefaultKCCreator(accounts); - const publishingNode = getDefaultPublishingNode(accounts); - const receivingNodes = getDefaultReceivingNodes(accounts); + // --- Verification in Current Epoch (Epoch E) --- + expect( + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(), + 'Active duration should be initial in Epoch E', + ).to.equal(initialDuration); - // Create profiles and KC first - const { publishingNodeIdentityId } = await createProfilesAndKC( - kcCreator, - publishingNode, - receivingNodes, - { - Profile, - KnowledgeCollection, - Token, - }, + // Advance blocks within Epoch E by the initial duration + for (let i = 0; i < Number(initialDuration); i++) { + await hre.network.provider.send('evm_mine'); + } + + // Update period and check if it used the initial duration + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + const updatedStartBlockE = ( + await RandomSamplingStorage.getActiveProofPeriodStatus() + ).activeProofPeriodStartBlock; + expect(updatedStartBlockE).to.equal( + initialStartBlockE + initialDuration, + 'Start block should advance by initial duration in Epoch E', ); - // Update and get the new active proof period - const tx = - await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); - await tx.wait(); + // --- Advance to Next Epoch (Epoch E+1) --- + const timeUntilNextEpoch = await Chronos.timeUntilNextEpoch(); + const blocksUntilNextEpoch = + timeUntilNextEpoch > 0n + ? Number(timeUntilNextEpoch / avgBlockTime) + 1 // Ensure we pass the epoch boundary + : 1; // If already at boundary, just mine one block + for (let i = 0; i < blocksUntilNextEpoch; i++) { + await hre.network.provider.send('evm_mine'); + } - const proofPeriodStatus = - await RandomSamplingStorage.getActiveProofPeriodStatus(); - const proofPeriodStartBlock = - proofPeriodStatus.activeProofPeriodStartBlock; - // Create challenge - const challengeTx = await RandomSampling.connect( - publishingNode.operational, - ).createChallenge(); - await challengeTx.wait(); + expect( + await Chronos.getCurrentEpoch(), + 'Should now be in the effective epoch', + ).to.equal(effectiveEpoch); - // Get the challenge from storage to verify it - const challenge = await RandomSamplingStorage.getNodeChallenge( - publishingNodeIdentityId, - ); + // --- Verification in Effective Epoch (Epoch E+1) --- + expect( + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(), + 'Active duration should be new in Epoch E+1', + ).to.equal(newDuration); - const proofPeriodDuration = - await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + // Get the start block relevant for this new epoch + // It might have carried over or been updated by the block advance + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + const startBlockE1 = ( + await RandomSamplingStorage.getActiveProofPeriodStatus() + ).activeProofPeriodStartBlock; - // Verify challenge properties - expect(challenge.knowledgeCollectionId).to.be.a('bigint'); - expect(challenge.chunkId).to.be.a('bigint'); - expect(challenge.epoch).to.be.a('bigint'); - expect(challenge.activeProofPeriodStartBlock).to.be.a('bigint'); - expect(challenge.proofingPeriodDurationInBlocks).to.be.a('bigint'); - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - expect(challenge.solved).to.be.false; + // Advance blocks within Epoch E+1 by the *new* duration + for (let i = 0; i < Number(newDuration); i++) { + await hre.network.provider.send('evm_mine'); + } - expect(challenge.knowledgeCollectionId).to.be.equal(1n); - expect(challenge.epoch).to.be.equal(1n); - expect(challenge.activeProofPeriodStartBlock).to.be.equal( - proofPeriodStartBlock, - ); - expect(challenge.proofingPeriodDurationInBlocks).to.be.equal( - proofPeriodDuration, + // Update period and check if it used the new duration + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + const updatedStartBlockE1 = ( + await RandomSamplingStorage.getActiveProofPeriodStatus() + ).activeProofPeriodStartBlock; + expect(updatedStartBlockE1).to.equal( + startBlockE1 + newDuration, + 'Start block should advance by new duration in Epoch E+1', ); - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - expect(challenge.solved).to.be.false; }); + }); - it('Should return the same challenge if unsolved within the period', async () => { + describe('Challenge Creation', () => { + it('Should revert if an unsolved challenge already exists for this node in the current proof period', async () => { + // creator of the KC const kcCreator = getDefaultKCCreator(accounts); - const publishingNode = getDefaultPublishingNode(accounts); - const receivingNodes = getDefaultReceivingNodes(accounts); + // create a publishing node with stake and ask + const nodeAsk = 200000000000000000n; // Same as 0.2 ETH + const minStake = await ParametersStorage.minimumStake(); + const deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + const { node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, 100n, deps); + // create receiving nodes + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 10, + minStake, + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } - const { publishingNodeIdentityId } = await createProfilesAndKC( + await createKnowledgeCollection( kcCreator, publishingNode, + publishingNodeIdentityId, receivingNodes, - { Profile, KnowledgeCollection, Token }, + receivingNodesIdentityIds, + deps, merkleRoot, ); - const minStake = await ParametersStorage.minimumStake(); - await setNodeStake( - publishingNode, - BigInt(publishingNodeIdentityId), - BigInt(minStake), - accounts[0], - { Token, Staking, Ask }, - ); - await Profile.connect(publishingNode.operational).updateAsk( - publishingNodeIdentityId, - 100n, - ); - await Ask.connect(accounts[0]).recalculateActiveSet(); // Create first challenge const tx1 = await RandomSampling.connect( @@ -580,16 +639,72 @@ describe('@integration RandomSampling', () => { expect(challenge2.solved).to.equal(challenge1.solved); // Both false }); - it('Should revert if creating challenge when already solved for current period', async () => { + it('Should revert if the challenge for this proof period has already been solved', async () => { // Create profile and identity first - const publishingNode = getDefaultPublishingNode(accounts); - const { identityId } = await createProfile(Profile, publishingNode); + const kcCreator = getDefaultKCCreator(accounts); + const nodeAsk = 200000000000000000n; // Same as 0.2 ETH + const minStake = await ParametersStorage.minimumStake(); + const deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + const { node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps); + + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 10, + minStake, + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } - // Create a mock challenge that's marked as solved - const mockChallenge = await createMockChallenge(); // Uses helper which sets solved=true + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + ); + + // Create first challenge + const tx1 = await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + await tx1.wait(); + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Mark the challenge as solved + const solvedChallenge = { + knowledgeCollectionId: challenge.knowledgeCollectionId, + chunkId: challenge.chunkId, + knowledgeCollectionStorageContract: + challenge.knowledgeCollectionStorageContract, + epoch: challenge.epoch, + activeProofPeriodStartBlock: challenge.activeProofPeriodStartBlock, + proofingPeriodDurationInBlocks: + challenge.proofingPeriodDurationInBlocks, + solved: true, + }; // Store the mock challenge in the storage contract - await RandomSamplingStorage.setNodeChallenge(identityId, mockChallenge); + await RandomSamplingStorage.setNodeChallenge( + publishingNodeIdentityId, + solvedChallenge, + ); // Try to create a new challenge for the same period - should revert const challengeTx = RandomSampling.connect( @@ -600,36 +715,226 @@ describe('@integration RandomSampling', () => { ); }); - it('Should submit a valid proof successfully and calculate the correct score', async () => { + it('Should revert if no Knowledge Collections exist in the system', async () => { + // Setup a node profile + const publishingNode = getDefaultPublishingNode(accounts); + + const { identityId: publishingNodeIdentityId } = await createProfile( + Profile, + publishingNode, + ); + + const minStake = await ParametersStorage.minimumStake(); + await setNodeStake( + publishingNode, + BigInt(publishingNodeIdentityId), + BigInt(minStake), + { + Token, + Staking, + Ask, + }, + ); + await Profile.connect(publishingNode.operational).updateAsk( + BigInt(publishingNodeIdentityId), + 100n, + ); + await Ask.connect(accounts[0]).recalculateActiveSet(); + + // Ensure no KCs are created or they are expired (by default none are created here) + + // Attempt to create challenge + const createTx = RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + + // Verification + await expect(createTx).to.be.revertedWith( + 'No knowledge collections exist', + ); + }); + + it('Should set the node challenge successfully and emit ChallengeCreated event', async () => { const kcCreator = getDefaultKCCreator(accounts); const publishingNode = getDefaultPublishingNode(accounts); const receivingNodes = getDefaultReceivingNodes(accounts); - const { publishingNodeIdentityId } = await createProfilesAndKC( + // Create profiles and KC first + const contracts = { + Profile, + KnowledgeCollection, + Token, + }; + + const { identityId: publishingNodeIdentityId } = await createProfile( + contracts.Profile, + publishingNode, + ); + const receivingNodesIdentityIds = ( + await createProfiles(contracts.Profile, receivingNodes) + ).map((p) => p.identityId); + + await createKnowledgeCollection( kcCreator, publishingNode, + publishingNodeIdentityId, receivingNodes, - { Profile, KnowledgeCollection, Token }, - merkleRoot, + receivingNodesIdentityIds, + contracts, + ); + + // Update and get the new active proof period + const tx = + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + await tx.wait(); + + const proofPeriodStatus = + await RandomSamplingStorage.getActiveProofPeriodStatus(); + const proofPeriodStartBlock = + proofPeriodStatus.activeProofPeriodStartBlock; + // Create challenge + const challengeTx = await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + const receipt = await challengeTx.wait(); + + // Get the challenge from storage to verify it + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, ); - // Mint tokens and set stake + await expect(receipt) + .to.emit(RandomSampling, 'ChallengeCreated') + .withArgs( + publishingNodeIdentityId, + challenge.epoch, + challenge.knowledgeCollectionId, + challenge.chunkId, + proofPeriodStartBlock, + challenge.proofingPeriodDurationInBlocks, + ); + + const proofPeriodDuration = + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + + // Verify challenge properties + expect(challenge.knowledgeCollectionId) + .to.be.a('bigint') + .and.to.be.equal(1n); + expect(challenge.chunkId).to.be.a('bigint').and.to.be.greaterThan(0n); + expect(challenge.epoch).to.be.a('bigint').and.to.be.equal(1n); + expect(challenge.activeProofPeriodStartBlock) + .to.be.a('bigint') + .and.to.be.equal(proofPeriodStartBlock); + expect(challenge.proofingPeriodDurationInBlocks) + .to.be.a('bigint') + .and.to.be.equal(proofPeriodDuration); + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(challenge.solved).to.be.false; + }); + + it('Should revert if it fails to find a Knowledge Collection that is active in the current epoch', async () => { + // Setup: create node profile/stake/ask + const nodeAsk = 200000000000000000n; const minStake = await ParametersStorage.minimumStake(); - await setNodeStake( + const deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + const { node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps); + + // Create a KC but set its endEpoch to be in the past (e.g., epoch 0) + const kcCreator = getDefaultKCCreator(accounts); + const receivingNodes = getDefaultReceivingNodes(accounts); + const receivingNodesIdentityIds = ( + await createProfiles(Profile, receivingNodes) + ).map((p) => p.identityId); + const currentEpoch = await Chronos.getCurrentEpoch(); + expect(currentEpoch).to.be.greaterThan( + 0n, + 'Test requires current epoch > 0', + ); // Ensure test premise is valid + + // Use createKnowledgeCollection helper, setting endEpoch manually if possible, + // or directly interact with KnowledgeCollection contract + + const epochs = 1; + + await createKnowledgeCollection( + kcCreator, publishingNode, - BigInt(publishingNodeIdentityId), - BigInt(minStake), - accounts[0], - { Token, Staking, Ask }, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, ); - // Recalculate the active set - const newAsk = 200n; - await Profile.connect(publishingNode.operational).updateAsk( + // Advance to epochs + 10 + for (let i = 0; i < epochs + 10; i++) { + const timeUntilNextEpoch = await Chronos.timeUntilNextEpoch(); + const blocksUntilNextEpoch = + Number(timeUntilNextEpoch) / Number(avgBlockTimeInSeconds) + 5; + for (let i = 0; i < blocksUntilNextEpoch; i++) { + await hre.network.provider.send('evm_mine'); + } + } + + // Action: Call createChallenge + const createTx = RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + + // Verification: Expect revert with the specific message + await expect(createTx).to.be.revertedWith( + 'Failed to find a knowledge collection that is active in the current epoch', + ); + }); + }); + + describe('Proof Submission', () => { + it('Should submit a valid proof successfully and calculate the correct score', async () => { + const kcCreator = getDefaultKCCreator(accounts); + const minStake = await ParametersStorage.minimumStake(); + const nodeAsk = 200000000000000000n; // Same as 0.2 ETH + const deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + + const { node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps); + + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 10, + minStake, + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + + await createKnowledgeCollection( + kcCreator, + publishingNode, publishingNodeIdentityId, - newAsk, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, ); - await Ask.connect(accounts[0]).recalculateActiveSet(); // Update and get the new active proof period const tx = @@ -655,7 +960,7 @@ describe('@integration RandomSampling', () => { const { proof } = kcTools.calculateMerkleProof( quads, 32, - challenge.chunkId, + Number(challenge.chunkId), ); // Submit proof @@ -714,19 +1019,33 @@ describe('@integration RandomSampling', () => { const kcCreator = getDefaultKCCreator(accounts); const publishingNode = getDefaultPublishingNode(accounts); const receivingNodes = getDefaultReceivingNodes(accounts); - const { publishingNodeIdentityId } = await createProfilesAndKC( + const contracts = { + Profile, + KnowledgeCollection, + Token, + }; + + const { identityId: publishingNodeIdentityId } = await createProfile( + contracts.Profile, + publishingNode, + ); + const receivingNodesIdentityIds = ( + await createProfiles(contracts.Profile, receivingNodes) + ).map((p) => p.identityId); + + await createKnowledgeCollection( kcCreator, publishingNode, + publishingNodeIdentityId, receivingNodes, - { Profile, KnowledgeCollection, Token }, - merkleRoot, + receivingNodesIdentityIds, + contracts, ); const minStake = await ParametersStorage.minimumStake(); await setNodeStake( publishingNode, BigInt(publishingNodeIdentityId), BigInt(minStake), - accounts[0], { Token, Staking, Ask }, ); await Profile.connect(publishingNode.operational).updateAsk( @@ -776,19 +1095,33 @@ describe('@integration RandomSampling', () => { const kcCreator = getDefaultKCCreator(accounts); const publishingNode = getDefaultPublishingNode(accounts); const receivingNodes = getDefaultReceivingNodes(accounts); - const { publishingNodeIdentityId } = await createProfilesAndKC( + const contracts = { + Profile, + KnowledgeCollection, + Token, + }; + + const { identityId: publishingNodeIdentityId } = await createProfile( + contracts.Profile, + publishingNode, + ); + const receivingNodesIdentityIds = ( + await createProfiles(contracts.Profile, receivingNodes) + ).map((p) => p.identityId); + + await createKnowledgeCollection( kcCreator, publishingNode, + publishingNodeIdentityId, receivingNodes, - { Profile, KnowledgeCollection, Token }, - merkleRoot, + receivingNodesIdentityIds, + contracts, ); const minStake = await ParametersStorage.minimumStake(); await setNodeStake( publishingNode, BigInt(publishingNodeIdentityId), BigInt(minStake), - accounts[0], { Token, Staking, Ask }, ); await Profile.connect(publishingNode.operational).updateAsk( @@ -826,7 +1159,10 @@ describe('@integration RandomSampling', () => { const submitWrongChunkTx = RandomSampling.connect( publishingNode.operational, ).submitProof(wrongChunk, correctProof); - await expect(submitWrongChunkTx).to.be.revertedWith('Proof is not valid'); + await expect(submitWrongChunkTx).to.be.revertedWithCustomError( + RandomSampling, + 'MerkleRootMismatchError', + ); let finalChallenge = await RandomSamplingStorage.getNodeChallenge( publishingNodeIdentityId, ); @@ -837,58 +1173,16 @@ describe('@integration RandomSampling', () => { const submitWrongProofTx = RandomSampling.connect( publishingNode.operational, ).submitProof(correctChunk, wrongProof); - await expect(submitWrongProofTx).to.be.revertedWith('Proof is not valid'); + await expect(submitWrongProofTx).to.be.revertedWithCustomError( + RandomSampling, + 'MerkleRootMismatchError', + ); finalChallenge = await RandomSamplingStorage.getNodeChallenge( publishingNodeIdentityId, ); // eslint-disable-next-line @typescript-eslint/no-unused-expressions expect(finalChallenge.solved).to.be.false; // Ensure state unchanged }); - - it('Should fail challenge creation if no active Knowledge Collections exist', async () => { - // Setup a node profile - const publishingNode = getDefaultPublishingNode(accounts); - - const { identityId: publishingNodeIdentityId } = await createProfile( - Profile, - publishingNode, - ); - - const minStake = await ParametersStorage.minimumStake(); - await setNodeStake( - publishingNode, - BigInt(publishingNodeIdentityId), - BigInt(minStake), - accounts[0], - { - Token, - Staking, - Ask, - }, - ); - await Profile.connect(publishingNode.operational).updateAsk( - BigInt(publishingNodeIdentityId), - 100n, - ); - await Ask.connect(accounts[0]).recalculateActiveSet(); - - // Ensure no KCs are created or they are expired (by default none are created here) - - // Attempt to create challenge - const createTx = RandomSampling.connect( - publishingNode.operational, - ).createChallenge(); - - // Verification - await expect(createTx).to.be.revertedWith( - 'No knowledge collections exist', - ); - }); - }); - - describe('Score Calculation', () => { - // TODO: Should calculate node scores correctly upon valid proof submission - // TODO: Should calculate delegator scores correctly }); describe('Admin Functions', () => { From 0dbd0574fbc85ef387185a079c0b537160f1c10e Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 16 Apr 2025 14:54:07 +0200 Subject: [PATCH 064/106] Adapt RS deployments for all networks --- deploy/030_deploy_random_sampling_storage.ts | 18 +++- deploy/031_deploy_random_sampling.ts | 20 +++- deployments/parameters.json | 104 ++++++++++++++++++- 3 files changed, 133 insertions(+), 9 deletions(-) diff --git a/deploy/030_deploy_random_sampling_storage.ts b/deploy/030_deploy_random_sampling_storage.ts index 06f9108b..81c5fb9f 100644 --- a/deploy/030_deploy_random_sampling_storage.ts +++ b/deploy/030_deploy_random_sampling_storage.ts @@ -1,10 +1,22 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; +type RandomSamplingStorageNetworkConfig = { + proofingPeriodDurationInBlocks: string; +}; + const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const randomSamplingStorageParametersConfig = - hre.helpers.parametersConfig[hre.network.config.environment] - .RandomSamplingStorage; + const randomSamplingStorageParametersConfig = hre.helpers.parametersConfig[ + hre.network.config.environment + ].RandomSamplingStorage[ + hre.network.name + ] as unknown as RandomSamplingStorageNetworkConfig; + + if (!randomSamplingStorageParametersConfig) { + throw new Error( + `RandomSamplingStorage parameters config not found for network: ${hre.network.name}`, + ); + } await hre.helpers.deploy({ newContractName: 'RandomSamplingStorage', diff --git a/deploy/031_deploy_random_sampling.ts b/deploy/031_deploy_random_sampling.ts index f63a2cc1..67bd3879 100644 --- a/deploy/031_deploy_random_sampling.ts +++ b/deploy/031_deploy_random_sampling.ts @@ -1,9 +1,23 @@ import { HardhatRuntimeEnvironment } from 'hardhat/types'; import { DeployFunction } from 'hardhat-deploy/types'; +// Define an interface for the expected config structure +type RandomSamplingNetworkConfig = { + avgBlockTimeInSeconds: string; + W1: string; + W2: string; +}; + const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const randomSamplingParametersConfig = - hre.helpers.parametersConfig[hre.network.config.environment].RandomSampling; + const randomSamplingParametersConfig = hre.helpers.parametersConfig[ + hre.network.config.environment + ].RandomSampling[hre.network.name] as unknown as RandomSamplingNetworkConfig; + + if (!randomSamplingParametersConfig) { + throw new Error( + `RandomSampling parameters config not found for network: ${hre.network.name}`, + ); + } await hre.helpers.deploy({ newContractName: 'RandomSampling', @@ -28,4 +42,6 @@ func.dependencies = [ 'DelegatorsInfo', 'KnowledgeCollectionStorage', 'IdentityStorage', + 'ShardingTableStorage', + 'ParametersStorage', ]; diff --git a/deployments/parameters.json b/deployments/parameters.json index 8136ab5a..c304cef5 100644 --- a/deployments/parameters.json +++ b/deployments/parameters.json @@ -19,12 +19,24 @@ "uriBase": "did:dkg" }, "RandomSampling": { - "avgBlockTimeInSeconds": "1", - "W1": "0", - "W2": "2" + "hardhat": { + "avgBlockTimeInSeconds": "1", + "W1": "0", + "W2": "2" + }, + "localhost": { + "avgBlockTimeInSeconds": "1", + "W1": "0", + "W2": "2" + } }, "RandomSamplingStorage": { - "proofingPeriodDurationInBlocks": "100" + "hardhat": { + "proofingPeriodDurationInBlocks": "100" + }, + "localhost": { + "proofingPeriodDurationInBlocks": "100" + } } }, "devnet": { @@ -46,6 +58,34 @@ "KnowledgeCollectionStorage": { "knowledgeCollectionSize": "1000000", "uriBase": "did:dkg" + }, + "RandomSampling": { + "base_sepolia_dev": { + "avgBlockTimeInSeconds": "2", + "W1": "0", + "W2": "2" + }, + "base_sepolia_stable_dev_staging": { + "avgBlockTimeInSeconds": "2", + "W1": "0", + "W2": "2" + }, + "base_sepolia_stable_dev_prod": { + "avgBlockTimeInSeconds": "2", + "W1": "0", + "W2": "2" + } + }, + "RandomSamplingStorage": { + "base_sepolia_dev": { + "proofingPeriodDurationInBlocks": "900" + }, + "base_sepolia_stable_dev_staging": { + "proofingPeriodDurationInBlocks": "900" + }, + "base_sepolia_stable_dev_prod": { + "proofingPeriodDurationInBlocks": "900" + } } }, "testnet": { @@ -68,6 +108,34 @@ "KnowledgeCollectionStorage": { "knowledgeCollectionSize": "1000000", "uriBase": "did:dkg" + }, + "RandomSampling": { + "neuroweb_testnet": { + "avgBlockTimeInSeconds": "7", + "W1": "0", + "W2": "2" + }, + "gnosis_chiado_test": { + "avgBlockTimeInSeconds": "5", + "W1": "0", + "W2": "2" + }, + "base_sepolia_test": { + "avgBlockTimeInSeconds": "2", + "W1": "0", + "W2": "2" + } + }, + "RandomSamplingStorage": { + "neuroweb_testnet": { + "proofingPeriodDurationInBlocks": "257" + }, + "gnosis_chiado_test": { + "proofingPeriodDurationInBlocks": "360" + }, + "base_sepolia_test": { + "proofingPeriodDurationInBlocks": "900" + } } }, "mainnet": { @@ -90,6 +158,34 @@ "KnowledgeCollectionStorage": { "knowledgeCollectionSize": "1000000", "uriBase": "did:dkg" + }, + "RandomSampling": { + "neuroweb_mainnet": { + "avgBlockTimeInSeconds": "6", + "W1": "0", + "W2": "2" + }, + "gnosis_mainnet": { + "avgBlockTimeInSeconds": "5", + "W1": "0", + "W2": "2" + }, + "base_mainnet": { + "avgBlockTimeInSeconds": "2", + "W1": "0", + "W2": "2" + } + }, + "RandomSamplingStorage": { + "neuroweb_mainnet": { + "proofingPeriodDurationInBlocks": "300" + }, + "gnosis_mainnet": { + "proofingPeriodDurationInBlocks": "360" + }, + "base_mainnet": { + "proofingPeriodDurationInBlocks": "900" + } } } } From db506c3157ee671ce938f73f5caeb432d0e64994 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 16 Apr 2025 16:12:19 +0200 Subject: [PATCH 065/106] remove comment --- contracts/libraries/RandomSamplingLib.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/libraries/RandomSamplingLib.sol b/contracts/libraries/RandomSamplingLib.sol index 7c370886..b9661199 100644 --- a/contracts/libraries/RandomSamplingLib.sol +++ b/contracts/libraries/RandomSamplingLib.sol @@ -20,6 +20,6 @@ library RandomSamplingLib { struct ProofingPeriodDuration { uint16 durationInBlocks; - uint256 effectiveEpoch; // When this duration takes effect (by epoch instead of timestamp) + uint256 effectiveEpoch; } } From f3fc305c274a8a64a6b8ed8ba84237fe2cfeebe6 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 17 Apr 2025 10:16:48 +0200 Subject: [PATCH 066/106] Add more proof submission tests --- test/integration/RandomSampling.test.ts | 667 +++++++++++++++++++----- 1 file changed, 546 insertions(+), 121 deletions(-) diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index 5ea2d87d..fcf3c1ab 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -897,124 +897,7 @@ describe('@integration RandomSampling', () => { }); describe('Proof Submission', () => { - it('Should submit a valid proof successfully and calculate the correct score', async () => { - const kcCreator = getDefaultKCCreator(accounts); - const minStake = await ParametersStorage.minimumStake(); - const nodeAsk = 200000000000000000n; // Same as 0.2 ETH - const deps = { - accounts, - Profile, - Token, - Staking, - Ask, - KnowledgeCollection, - }; - - const { node: publishingNode, identityId: publishingNodeIdentityId } = - await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps); - - const receivingNodes = []; - const receivingNodesIdentityIds = []; - for (let i = 0; i < 5; i++) { - const { node, identityId } = await setupNodeWithStakeAndAsk( - i + 10, - minStake, - nodeAsk, - deps, - ); - receivingNodes.push(node); - receivingNodesIdentityIds.push(identityId); - } - - await createKnowledgeCollection( - kcCreator, - publishingNode, - publishingNodeIdentityId, - receivingNodes, - receivingNodesIdentityIds, - deps, - merkleRoot, - ); - - // Update and get the new active proof period - const tx = - await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); - await tx.wait(); - - // Create challenge - const challengeTx = await RandomSampling.connect( - publishingNode.operational, - ).createChallenge(); - await challengeTx.wait(); - - // Get the challenge from storage to verify it - let challenge = await RandomSamplingStorage.getNodeChallenge( - publishingNodeIdentityId, - ); - - // Get chunk from quads - const chunks = kcTools.splitIntoChunks(quads, 32); - const challengeChunk = chunks[challenge.chunkId]; - - // Generate a proof for our challenge chunk - const { proof } = kcTools.calculateMerkleProof( - quads, - 32, - Number(challenge.chunkId), - ); - - // Submit proof - const submitProofTx = await RandomSampling.connect( - publishingNode.operational, - ).submitProof(challengeChunk, proof); - const receipt = await submitProofTx.wait(); - - // Get the challenge from storage to verify it - challenge = await RandomSamplingStorage.getNodeChallenge( - publishingNodeIdentityId, - ); - - // Since the challenge was solved, the challenge should be marked as solved - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - expect(challenge.solved).to.be.true; - - await expect(receipt) - .to.emit(RandomSampling, 'ValidProofSubmitted') - .withArgs( - publishingNodeIdentityId, - challenge.epoch, - (score: bigint) => score > 0, // Just check score is positive, calculation checked elsewhere - ); - - const expectedScore = await calculateExpectedNodeScore( - BigInt(publishingNodeIdentityId), - BigInt(minStake), - { - ParametersStorage, - ProfileStorage, - AskStorage, - EpochStorage, - }, - ); - - expect( - await RandomSamplingStorage.getNodeEpochProofPeriodScore( - publishingNodeIdentityId, - challenge.epoch, - challenge.activeProofPeriodStartBlock, - ), - ).to.equal(expectedScore); - - expect( - await RandomSamplingStorage.getEpochAllNodesProofPeriodScore( - challenge.epoch, - - challenge.activeProofPeriodStartBlock, - ), - ).to.equal(expectedScore); - }); - - it('Should fail to submit proof for expired challenge', async () => { + it('Should revert if challenge is no longer active', async () => { // Setup const kcCreator = getDefaultKCCreator(accounts); const publishingNode = getDefaultPublishingNode(accounts); @@ -1055,10 +938,9 @@ describe('@integration RandomSampling', () => { await Ask.connect(accounts[0]).recalculateActiveSet(); // Create challenge - const challengeTx = await RandomSampling.connect( + await RandomSampling.connect( publishingNode.operational, ).createChallenge(); - await challengeTx.wait(); const challenge = await RandomSamplingStorage.getNodeChallenge( publishingNodeIdentityId, ); @@ -1090,7 +972,7 @@ describe('@integration RandomSampling', () => { ); }); - it('Should fail to submit invalid proof (wrong chunk/proof)', async () => { + it("Should revert with MerkleRootMismatchError if merkle roots don't match", async () => { // Setup const kcCreator = getDefaultKCCreator(accounts); const publishingNode = getDefaultPublishingNode(accounts); @@ -1183,6 +1065,549 @@ describe('@integration RandomSampling', () => { // eslint-disable-next-line @typescript-eslint/no-unused-expressions expect(finalChallenge.solved).to.be.false; // Ensure state unchanged }); + + it('Should submit a valid proof and successfully update challenge state (solved=true)', async () => { + const kcCreator = getDefaultKCCreator(accounts); + const minStake = await ParametersStorage.minimumStake(); + const nodeAsk = 200000000000000000n; // Same as 0.2 ETH + const deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + + const { node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps); + + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 10, + minStake, + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + ); + + // Update and get the new active proof period + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + + // Create challenge + const challengeTx = await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + await challengeTx.wait(); + + // Get the challenge from storage to verify it + let challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Get chunk from quads + const chunks = kcTools.splitIntoChunks(quads, 32); + const challengeChunk = chunks[challenge.chunkId]; + + // Generate a proof for our challenge chunk + const { proof } = kcTools.calculateMerkleProof( + quads, + 32, + Number(challenge.chunkId), + ); + + // Submit proof + await RandomSampling.connect(publishingNode.operational).submitProof( + challengeChunk, + proof, + ); + + // Get the challenge from storage to verify it + challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Since the challenge was solved, the challenge should be marked as solved + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(challenge.solved).to.be.true; + }); + + it('Should submit a valid proof and successfully increment epochNodeValidProofsCount', async () => { + const kcCreator = getDefaultKCCreator(accounts); + const minStake = await ParametersStorage.minimumStake(); + const nodeAsk = 200000000000000000n; // Same as 0.2 ETH + const deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + + const { node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps); + + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 10, + minStake, + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + ); + + // Update and get the new active proof period + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + + // Create challenge + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + + // Get the challenge from storage to verify it + let challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Get chunk from quads + const chunks = kcTools.splitIntoChunks(quads, 32); + const challengeChunk = chunks[challenge.chunkId]; + + // Generate a proof for our challenge chunk + const { proof } = kcTools.calculateMerkleProof( + quads, + 32, + Number(challenge.chunkId), + ); + + // Submit proof + await RandomSampling.connect(publishingNode.operational).submitProof( + challengeChunk, + proof, + ); + + // Get the challenge from storage to verify it + challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Verify that epochNodeValidProofsCount was incremented + const epochNodeValidProofsCount = + await RandomSamplingStorage.getEpochNodeValidProofsCount( + challenge.epoch, + publishingNodeIdentityId, + ); + expect(epochNodeValidProofsCount).to.equal(1n); + }); + + it('Should submit a valid proof and successfully emit ValidProofSubmitted event with correct parameters', async () => { + const kcCreator = getDefaultKCCreator(accounts); + const minStake = await ParametersStorage.minimumStake(); + const nodeAsk = 200000000000000000n; // Same as 0.2 ETH + const deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + + const { node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps); + + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 10, + minStake, + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + ); + + // Update and get the new active proof period + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + + // Create challenge + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + + // Get the challenge from storage to verify it + let challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Get chunk from quads + const chunks = kcTools.splitIntoChunks(quads, 32); + const challengeChunk = chunks[challenge.chunkId]; + + // Generate a proof for our challenge chunk + const { proof } = kcTools.calculateMerkleProof( + quads, + 32, + Number(challenge.chunkId), + ); + + // Submit proof + const receipt = await RandomSampling.connect( + publishingNode.operational, + ).submitProof(challengeChunk, proof); + + // Get the challenge from storage to verify it + challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Verify that epochNodeValidProofsCount was incremented + await expect(receipt) + .to.emit(RandomSampling, 'ValidProofSubmitted') + .withArgs( + publishingNodeIdentityId, + challenge.epoch, + (score: bigint) => score > 0, + ); + }); + + it('Should submit a valid proof and successfully and add score to nodeEpochProofPeriodScore and allNodesEpochProofPeriodScore', async () => { + const kcCreator = getDefaultKCCreator(accounts); + const minStake = await ParametersStorage.minimumStake(); + const nodeAsk = 200000000000000000n; // Same as 0.2 ETH + const deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + + const { node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps); + + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 10, + minStake, + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + ); + + // Update and get the new active proof period + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + + // Create challenge + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + + // Get the challenge from storage to verify it + let challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Get chunk from quads + const chunks = kcTools.splitIntoChunks(quads, 32); + const challengeChunk = chunks[challenge.chunkId]; + + // Generate a proof for our challenge chunk + const { proof } = kcTools.calculateMerkleProof( + quads, + 32, + Number(challenge.chunkId), + ); + + // Submit proof + await RandomSampling.connect(publishingNode.operational).submitProof( + challengeChunk, + proof, + ); + + // Get the challenge from storage to verify it + challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + const expectedScore = await calculateExpectedNodeScore( + BigInt(publishingNodeIdentityId), + BigInt(minStake), + { + ParametersStorage, + ProfileStorage, + AskStorage, + EpochStorage, + }, + ); + + expect( + await RandomSamplingStorage.getNodeEpochProofPeriodScore( + publishingNodeIdentityId, + challenge.epoch, + challenge.activeProofPeriodStartBlock, + ), + ).to.equal(expectedScore); + + expect( + await RandomSamplingStorage.getEpochAllNodesProofPeriodScore( + challenge.epoch, + + challenge.activeProofPeriodStartBlock, + ), + ).to.equal(expectedScore); + }); + + it('Should succeed if submitting proof exactly on the last block of the period', async () => { + // Setup + const kcCreator = getDefaultKCCreator(accounts); + const minStake = await ParametersStorage.minimumStake(); + const nodeAsk = 200000000000000000n; // 0.2 ETH + const deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + + const { node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps); + + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 10, + minStake, + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + ); + + // Create challenge + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + const startBlock = challenge.activeProofPeriodStartBlock; + const duration = challenge.proofingPeriodDurationInBlocks; + const targetBlock = startBlock + duration - 2n; + const currentBlock = BigInt(await hre.ethers.provider.getBlockNumber()); + + // Advance blocks to exactly S + D - 1 + if (targetBlock > currentBlock) { + const blocksToMine = Number(targetBlock - currentBlock); + for (let i = 0; i < blocksToMine; i++) { + await hre.network.provider.send('evm_mine'); + } + } + + expect(BigInt(await hre.ethers.provider.getBlockNumber())).to.equal( + targetBlock, + ); + + // Action: Prepare and submit proof + const chunks = kcTools.splitIntoChunks(quads, 32); + const challengeChunk = chunks[challenge.chunkId]; + const { proof } = kcTools.calculateMerkleProof( + quads, + 32, + Number(challenge.chunkId), + ); + + const submitTx = RandomSampling.connect( + publishingNode.operational, + ).submitProof(challengeChunk, proof); + + // Verification + await expect(submitTx).to.not.be.reverted; + + const updatedChallenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(updatedChallenge.solved).to.be.true; + + const expectedScore = await calculateExpectedNodeScore( + BigInt(publishingNodeIdentityId), + BigInt(minStake), + { + ParametersStorage, + ProfileStorage, + AskStorage, + EpochStorage, + }, + ); + expect( + await RandomSamplingStorage.getNodeEpochProofPeriodScore( + publishingNodeIdentityId, + challenge.epoch, + startBlock, + ), + ).to.equal(expectedScore); + + await expect(submitTx) + .to.emit(RandomSampling, 'ValidProofSubmitted') + .withArgs( + publishingNodeIdentityId, + challenge.epoch, + (score: bigint) => score.toString() === expectedScore.toString(), + ); + }); + + it('Should revert if submitting proof exactly on the first block of the next period', async () => { + // Setup + const kcCreator = getDefaultKCCreator(accounts); + const minStake = await ParametersStorage.minimumStake(); + const nodeAsk = 200000000000000000n; // 0.2 ETH + const deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + + const { node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps); + + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 10, + minStake, + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + ); + + // Create challenge + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + const startBlock = challenge.activeProofPeriodStartBlock; + const duration = challenge.proofingPeriodDurationInBlocks; + const targetBlock = startBlock + duration - 1n; + const currentBlock = BigInt(await hre.ethers.provider.getBlockNumber()); + + // Advance blocks to exactly S + D + if (targetBlock > currentBlock) { + const blocksToMine = Number(targetBlock - currentBlock); + for (let i = 0; i < blocksToMine; i++) { + await hre.network.provider.send('evm_mine'); + } + } + expect(BigInt(await hre.ethers.provider.getBlockNumber())).to.equal( + targetBlock, + ); + + // Action: Prepare and submit proof for the previous period + const chunks = kcTools.splitIntoChunks(quads, 32); + const challengeChunk = chunks[challenge.chunkId]; + const { proof } = kcTools.calculateMerkleProof( + quads, + 32, + Number(challenge.chunkId), + ); + + const submitTx = RandomSampling.connect( + publishingNode.operational, + ).submitProof(challengeChunk, proof); + + // Verification + await expect(submitTx).to.be.revertedWith( + 'This challenge is no longer active', + ); + }); }); describe('Admin Functions', () => { From 0f598b5b1847cabfe4314fdd1368402fcb714e6f Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 17 Apr 2025 15:28:22 +0200 Subject: [PATCH 067/106] Update assertion tools and bump version --- package-lock.json | 1219 ++++++++++++++++++++------------------------- package.json | 5 +- 2 files changed, 546 insertions(+), 678 deletions(-) diff --git a/package-lock.json b/package-lock.json index 099a84b9..792109d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "dkg-evm-module", - "version": "8.0.4", + "version": "8.0.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dkg-evm-module", - "version": "8.0.4", + "version": "8.0.5", "license": "Apache-2.0", "dependencies": { "@openzeppelin/contracts": "^5.1.0", @@ -24,6 +24,7 @@ "typescript": "^5.7.2" }, "devDependencies": { + "@nomicfoundation/ethereumjs-util": "^9.0.4", "@nomicfoundation/hardhat-chai-matchers": "^2.0.8", "@nomicfoundation/hardhat-network-helpers": "^1.0.12", "@nomiclabs/hardhat-solhint": "^4.0.1", @@ -34,7 +35,7 @@ "@types/node": "^22.10.2", "@typescript-eslint/eslint-plugin": "^8.18.1", "@typescript-eslint/parser": "^8.18.1", - "assertion-tools": "^8.0.1", + "assertion-tools": "^8.0.3", "chai": "^4.5.0", "cross-env": "^7.0.3", "eslint": "^8.17.0", @@ -128,21 +129,21 @@ } }, "node_modules/@emnapi/core": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.0.tgz", - "integrity": "sha512-H+N/FqT07NmLmt6OFFtDfwe8PNygprzBikrEMyQfgqSmT0vzE515Pz7R8izwB9q/zsH/MA64AKoul3sA6/CzVg==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", + "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.1", + "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.0.tgz", - "integrity": "sha512-64WYIf4UYcdLnbKn/umDlNjQDSS8AgZrI/R9+x5ilkUVFxXcA1Ebl+gQLc/6mERA4407Xof0R7wEyEuj091CVw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", + "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", "dev": true, "license": "MIT", "optional": true, @@ -151,9 +152,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", - "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", + "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", "dev": true, "license": "MIT", "optional": true, @@ -162,9 +163,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", - "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.6.1.tgz", + "integrity": "sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==", "dev": true, "license": "MIT", "dependencies": { @@ -249,38 +250,34 @@ } }, "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "dev": true, + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", + "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", "license": "MPL-2.0", "bin": { - "rlp": "bin/rlp" + "rlp": "bin/rlp.cjs" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", - "dev": true, + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-9.1.0.tgz", + "integrity": "sha512-XBEKsYqLGXLah9PNJbgdkigthkG7TAGvlD/sH12beMXEyHDyigfcbdvHhmLyDWgDyOJn4QwiQUaF7yeuhnjdog==", "license": "MPL-2.0", "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" + "@ethereumjs/rlp": "^5.0.2", + "ethereum-cryptography": "^2.2.1" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@ethereumjs/util/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": { "@noble/hashes": "1.4.0" @@ -293,7 +290,6 @@ "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" @@ -306,7 +302,6 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "dev": true, "license": "MIT", "funding": { "url": "https://paulmillr.com/funding/" @@ -316,7 +311,6 @@ "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", @@ -331,7 +325,6 @@ "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", @@ -345,7 +338,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", - "dev": true, "license": "MIT", "dependencies": { "@noble/curves": "1.4.2", @@ -1281,56 +1273,10 @@ "@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==", - "license": "ISC", - "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==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" - }, - "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==", - "license": "MPL-2.0", - "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/@napi-rs/wasm-runtime": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.8.tgz", - "integrity": "sha512-OBlgKdX7gin7OIq4fadsjpg+cp2ZphvAIKucHsNfTdJiqdOmOEwQd/bHi0VwNrcw5xpBJyUw6cK/QilCqy1BSg==", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz", + "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==", "dev": true, "license": "MIT", "optional": true, @@ -1341,12 +1287,12 @@ } }, "node_modules/@noble/curves": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", - "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.2.tgz", + "integrity": "sha512-vnI7V6lFNe0tLAuJMu+2sX+FcL14TaCWy1qiczg1VwRmPrpQCdq5ESXQMqUc2tluRNf6irBXrWbl1mGN8uaU/g==", "license": "MIT", "dependencies": { - "@noble/hashes": "1.7.1" + "@noble/hashes": "1.7.2" }, "engines": { "node": "^14.21.3 || >=16" @@ -1356,9 +1302,9 @@ } }, "node_modules/@noble/hashes": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", - "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.2.tgz", + "integrity": "sha512-biZ0NUSxyjLLqo6KxEJ1b+C2NAx0wtDoFvCaXHGgUkeHzf3Xc1xKumFKREuT7f7DARNZ/slvYUwFG6B0f2b6hQ==", "license": "MIT", "engines": { "node": "^14.21.3 || >=16" @@ -1428,99 +1374,91 @@ } }, "node_modules/@nomicfoundation/edr": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.8.0.tgz", - "integrity": "sha512-dwWRrghSVBQDpt0wP+6RXD8BMz2i/9TI34TcmZqeEAZuCLei3U9KZRgGTKVAM1rMRvrpf5ROfPqrWNetKVUTag==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.10.0.tgz", + "integrity": "sha512-ed9qHSNssgh+0hYUx4ilDoMxxgf/sNT8SjnzgmA5A/LSXHaq2ax68bkdQ8otLYTlxHCO9BS5Nhb8bfajV4FZeA==", "license": "MIT", "dependencies": { - "@nomicfoundation/edr-darwin-arm64": "0.8.0", - "@nomicfoundation/edr-darwin-x64": "0.8.0", - "@nomicfoundation/edr-linux-arm64-gnu": "0.8.0", - "@nomicfoundation/edr-linux-arm64-musl": "0.8.0", - "@nomicfoundation/edr-linux-x64-gnu": "0.8.0", - "@nomicfoundation/edr-linux-x64-musl": "0.8.0", - "@nomicfoundation/edr-win32-x64-msvc": "0.8.0" + "@nomicfoundation/edr-darwin-arm64": "0.10.0", + "@nomicfoundation/edr-darwin-x64": "0.10.0", + "@nomicfoundation/edr-linux-arm64-gnu": "0.10.0", + "@nomicfoundation/edr-linux-arm64-musl": "0.10.0", + "@nomicfoundation/edr-linux-x64-gnu": "0.10.0", + "@nomicfoundation/edr-linux-x64-musl": "0.10.0", + "@nomicfoundation/edr-win32-x64-msvc": "0.10.0" }, "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-darwin-arm64": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.8.0.tgz", - "integrity": "sha512-sKTmOu/P5YYhxT0ThN2Pe3hmCE/5Ag6K/eYoiavjLWbR7HEb5ZwPu2rC3DpuUk1H+UKJqt7o4/xIgJxqw9wu6A==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.10.0.tgz", + "integrity": "sha512-n0N+CVM4LKN9QeGZ5irr94Q4vwSs4u7W6jfuhNLmx1cpUxwE9RpeW+ym93JXDv62iVsbekeI5VsUEBHy0hymtA==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-darwin-x64": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.8.0.tgz", - "integrity": "sha512-8ymEtWw1xf1Id1cc42XIeE+9wyo3Dpn9OD/X8GiaMz9R70Ebmj2g+FrbETu8o6UM+aL28sBZQCiCzjlft2yWAg==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.10.0.tgz", + "integrity": "sha512-nmImWM/3qWopYzOmicMzK/MF3rFKpm2Biuc8GpQYTLjdXhmItpP9JwEPyjbAWv/1HI09C2pRzgNzKfTxoIgJ6w==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.8.0.tgz", - "integrity": "sha512-h/wWzS2EyQuycz+x/SjMRbyA+QMCCVmotRsgM1WycPARvVZWIVfwRRsKoXKdCftsb3S8NTprqBdJlOmsFyETFA==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.10.0.tgz", + "integrity": "sha512-B/N1IyrCU7J6H4QckkQ1cSWAq1jSrJcXpO8GzRaQD1bgOOvg8wrUOrCD+Mfw7MLa6+X9vdZoXtPZOaaOQ9LmhA==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-arm64-musl": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.8.0.tgz", - "integrity": "sha512-gnWxDgdkka0O9GpPX/gZT3REeKYV28Guyg13+Vj/bbLpmK1HmGh6Kx+fMhWv+Ht/wEmGDBGMCW1wdyT/CftJaQ==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.10.0.tgz", + "integrity": "sha512-NA9DFLB0LzcKy9mTCUzgnRDbmmSfW0CdO22ySwOy+MKt4Cr9eJi+XR5ZH933Rxpi6BWNkSPeS2ECETE25sJT3w==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-x64-gnu": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.8.0.tgz", - "integrity": "sha512-DTMiAkgAx+nyxcxKyxFZk1HPakXXUCgrmei7r5G7kngiggiGp/AUuBBWFHi8xvl2y04GYhro5Wp+KprnLVoAPA==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.10.0.tgz", + "integrity": "sha512-bDrbRTA9qZ9wSw5mqa8VpLFbf6ue2Z4qmRd08404eKm8RyBEFxjdHflFzCx46gz/Td0e+GLXy6KTVDj5D29r8w==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-linux-x64-musl": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.8.0.tgz", - "integrity": "sha512-iTITWe0Zj8cNqS0xTblmxPbHVWwEtMiDC+Yxwr64d7QBn/1W0ilFQ16J8gB6RVVFU3GpfNyoeg3tUoMpSnrm6Q==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.10.0.tgz", + "integrity": "sha512-wx7yOlC/hx4N1xuIeh5cAebpzCTx8ZH8/z0IyYMf2t4v52KHERz4IyzBz5OLfd+0IqTRg8ZU5EnFBacIoPeP/g==", "license": "MIT", "engines": { "node": ">= 18" } }, "node_modules/@nomicfoundation/edr-win32-x64-msvc": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.8.0.tgz", - "integrity": "sha512-mNRDyd/C3j7RMcwapifzv2K57sfA5xOw8g2U84ZDvgSrXVXLC99ZPxn9kmolb+dz8VMm9FONTZz9ESS6v8DTnA==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.10.0.tgz", + "integrity": "sha512-DpBdVMimb+BUEs0E+nLGQ5JFHdGHyxQQNA+nh9V1eKtgarsV21S6br/d1vlQBMLQqkIzwmc6n+/O9Zjk2KfB3g==", "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==", - "license": "MIT", - "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, "license": "MPL-2.0", "bin": { "rlp": "bin/rlp.cjs" @@ -1529,33 +1467,11 @@ "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==", - "license": "MPL-2.0", - "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, "license": "MPL-2.0", "dependencies": { "@nomicfoundation/ethereumjs-rlp": "5.0.4", @@ -1722,9 +1638,9 @@ } }, "node_modules/@openzeppelin/contracts": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.2.0.tgz", - "integrity": "sha512-bxjNie5z89W1Ea0NZLZluFh8PrFNn9DH8DQlujEok2yjsOlraUPKID5p1Wk3qdNbf6XkQ1Os2RvfiHrrXLHWKA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-5.3.0.tgz", + "integrity": "sha512-zj/KGoW7zxWUE8qOI++rUM18v+VeLTTzKs/DJFkSzHpQFPD/jKKF0TrMxBfGLl3kpdELCNccvB3zmofSzm4nlA==", "license": "MIT" }, "node_modules/@pkgjs/parseargs": { @@ -1739,16 +1655,16 @@ } }, "node_modules/@pkgr/core": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.1.tgz", - "integrity": "sha512-VzgHzGblFmUeBmmrk55zPyrQIArQN4vujc9shWytaPdB3P7qhi0cpaiKIr7tlCmFv2lYUwnLospIqjL9ZSAhhg==", + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.4.tgz", + "integrity": "sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==", "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://opencollective.com/pkgr" } }, "node_modules/@pnpm/config.env-replace": { @@ -1869,25 +1785,25 @@ "optional": true }, "node_modules/@polkadot/api": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-15.9.1.tgz", - "integrity": "sha512-VpS7ymL0kzUOXTocJa0AvrnAGUMgT2niyBa5oplItZf3nqF+gSyvdKkP1T9i9Tpp2sbvmwzcMBKUF4G/d+Q02w==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/api/-/api-15.9.2.tgz", + "integrity": "sha512-HjKI+na6f3oy9WZdLKVq4LXQoNZ3dhyQRp+7yibIq2MTwxPqlFOe/Be55IjeK2RAlSGIfLCw9rCCVA5aPBR2pA==", "license": "Apache-2.0", "dependencies": { - "@polkadot/api-augment": "15.9.1", - "@polkadot/api-base": "15.9.1", - "@polkadot/api-derive": "15.9.1", - "@polkadot/keyring": "^13.4.3", - "@polkadot/rpc-augment": "15.9.1", - "@polkadot/rpc-core": "15.9.1", - "@polkadot/rpc-provider": "15.9.1", - "@polkadot/types": "15.9.1", - "@polkadot/types-augment": "15.9.1", - "@polkadot/types-codec": "15.9.1", - "@polkadot/types-create": "15.9.1", - "@polkadot/types-known": "15.9.1", - "@polkadot/util": "^13.4.3", - "@polkadot/util-crypto": "^13.4.3", + "@polkadot/api-augment": "15.9.2", + "@polkadot/api-base": "15.9.2", + "@polkadot/api-derive": "15.9.2", + "@polkadot/keyring": "^13.4.4", + "@polkadot/rpc-augment": "15.9.2", + "@polkadot/rpc-core": "15.9.2", + "@polkadot/rpc-provider": "15.9.2", + "@polkadot/types": "15.9.2", + "@polkadot/types-augment": "15.9.2", + "@polkadot/types-codec": "15.9.2", + "@polkadot/types-create": "15.9.2", + "@polkadot/types-known": "15.9.2", + "@polkadot/util": "^13.4.4", + "@polkadot/util-crypto": "^13.4.4", "eventemitter3": "^5.0.1", "rxjs": "^7.8.1", "tslib": "^2.8.1" @@ -1897,17 +1813,17 @@ } }, "node_modules/@polkadot/api-augment": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-15.9.1.tgz", - "integrity": "sha512-LAA21O5AW1hlVaqPxEONAcU0PGcA3iUtFqgQSomH7eDkl3QwqNWgB/G2MfcI5/auXjXcN7Sd7SxAEnx0XQDf2g==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-augment/-/api-augment-15.9.2.tgz", + "integrity": "sha512-I7hUrrWEJ+pol6DgGRWfTM71b5hzonVmWyCkE7PaTVA1rL0CANo2hwSe24Qve8zUZqtiy6q1YrTXu6HLs9DhRQ==", "license": "Apache-2.0", "dependencies": { - "@polkadot/api-base": "15.9.1", - "@polkadot/rpc-augment": "15.9.1", - "@polkadot/types": "15.9.1", - "@polkadot/types-augment": "15.9.1", - "@polkadot/types-codec": "15.9.1", - "@polkadot/util": "^13.4.3", + "@polkadot/api-base": "15.9.2", + "@polkadot/rpc-augment": "15.9.2", + "@polkadot/types": "15.9.2", + "@polkadot/types-augment": "15.9.2", + "@polkadot/types-codec": "15.9.2", + "@polkadot/util": "^13.4.4", "tslib": "^2.8.1" }, "engines": { @@ -1915,14 +1831,14 @@ } }, "node_modules/@polkadot/api-base": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-15.9.1.tgz", - "integrity": "sha512-nIfM+txk/HH9N6w2b3dQ8LDBoxoJCGrcCUpJ1v0fGfeOccz7ioxGS4DG8JbH7r0RRZruT1SAXFEQIn/d40xz5A==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-base/-/api-base-15.9.2.tgz", + "integrity": "sha512-PExkdWIb7zlTkIzAC0PP0fsjaJcZeF1XuPIpSOBYi54om6VR9Ks6PlLB2XEOu6oj8mCdQbYPe5tSGtVhNVA7ig==", "license": "Apache-2.0", "dependencies": { - "@polkadot/rpc-core": "15.9.1", - "@polkadot/types": "15.9.1", - "@polkadot/util": "^13.4.3", + "@polkadot/rpc-core": "15.9.2", + "@polkadot/types": "15.9.2", + "@polkadot/util": "^13.4.4", "rxjs": "^7.8.1", "tslib": "^2.8.1" }, @@ -1931,19 +1847,19 @@ } }, "node_modules/@polkadot/api-derive": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-15.9.1.tgz", - "integrity": "sha512-BXQudyPET/neHwgjoLBt7apCO7HvYj0ZNHHSOeCgrzVIwfQ/NEOou3oIyPU4+ENEH+kdfwKTXNx2KYFu9M7X2Q==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/api-derive/-/api-derive-15.9.2.tgz", + "integrity": "sha512-/MMu8kRv30BQZzXavvRvnejRTfOHncN0HVxtlYj7hbzfUf6zxvVqpygPJszcH+/IZhuU8y31oZ2E3Wy2dGsdKA==", "license": "Apache-2.0", "dependencies": { - "@polkadot/api": "15.9.1", - "@polkadot/api-augment": "15.9.1", - "@polkadot/api-base": "15.9.1", - "@polkadot/rpc-core": "15.9.1", - "@polkadot/types": "15.9.1", - "@polkadot/types-codec": "15.9.1", - "@polkadot/util": "^13.4.3", - "@polkadot/util-crypto": "^13.4.3", + "@polkadot/api": "15.9.2", + "@polkadot/api-augment": "15.9.2", + "@polkadot/api-base": "15.9.2", + "@polkadot/rpc-core": "15.9.2", + "@polkadot/types": "15.9.2", + "@polkadot/types-codec": "15.9.2", + "@polkadot/util": "^13.4.4", + "@polkadot/util-crypto": "^13.4.4", "rxjs": "^7.8.1", "tslib": "^2.8.1" }, @@ -1952,30 +1868,30 @@ } }, "node_modules/@polkadot/keyring": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-13.4.3.tgz", - "integrity": "sha512-2ePNcvBTznDN2luKbZM5fdxgAnj7V8m276qSTgrHlqKVvg9FsQpRCR6CAU+AjhnHzpe7uiZO+UH+jlXWefI3AA==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@polkadot/keyring/-/keyring-13.4.4.tgz", + "integrity": "sha512-pIm+u1lat+mGUABsCZyTm1/qgwL3NS94SC7TPtSzhzFZq6faUFNMyq1gBfTicrb7MjGFc8FlrKlGxFtudnQC9Q==", "license": "Apache-2.0", "dependencies": { - "@polkadot/util": "13.4.3", - "@polkadot/util-crypto": "13.4.3", + "@polkadot/util": "13.4.4", + "@polkadot/util-crypto": "13.4.4", "tslib": "^2.8.0" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@polkadot/util": "13.4.3", - "@polkadot/util-crypto": "13.4.3" + "@polkadot/util": "13.4.4", + "@polkadot/util-crypto": "13.4.4" } }, "node_modules/@polkadot/networks": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-13.4.3.tgz", - "integrity": "sha512-Z+YZkltBt//CtkVH8ZYJ1z66qYxdI0yPamzkzZAqw6gj3gjgSxKtxB4baA/rcAw05QTvN2R3dLkkmKr2mnHovQ==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@polkadot/networks/-/networks-13.4.4.tgz", + "integrity": "sha512-I3g9OX3CpZbFKa1C4xQPYOJ2Y209oEb5x9lzgHuAzg64m5vr2y4azWDSQnoOrlFK5ztSrijkWe1gSME1lzy8iA==", "license": "Apache-2.0", "dependencies": { - "@polkadot/util": "13.4.3", + "@polkadot/util": "13.4.4", "@substrate/ss58-registry": "^1.51.0", "tslib": "^2.8.0" }, @@ -1984,15 +1900,15 @@ } }, "node_modules/@polkadot/rpc-augment": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-15.9.1.tgz", - "integrity": "sha512-+hQHQpUGoE3syT6jTfRAJ/Brt5eO8ma4zD/CRL2vrgcE9Jdfpg3kskCDnYfCr5qMDCI1Sa380xxxbNQJFCdRjA==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-augment/-/rpc-augment-15.9.2.tgz", + "integrity": "sha512-wQKo5apcBA0ab1S8aZiZ6CueFsIgrV1MJoXSBa7u+AhEv0Z79h42j8jQyKD//HKEqq06fMWgjDb8djFrRjd65A==", "license": "Apache-2.0", "dependencies": { - "@polkadot/rpc-core": "15.9.1", - "@polkadot/types": "15.9.1", - "@polkadot/types-codec": "15.9.1", - "@polkadot/util": "^13.4.3", + "@polkadot/rpc-core": "15.9.2", + "@polkadot/types": "15.9.2", + "@polkadot/types-codec": "15.9.2", + "@polkadot/util": "^13.4.4", "tslib": "^2.8.1" }, "engines": { @@ -2000,15 +1916,15 @@ } }, "node_modules/@polkadot/rpc-core": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-15.9.1.tgz", - "integrity": "sha512-Wat4Qkw6USBzUpGCqIMH3uebOb3orUmaczIxVvKrV6VhFsm4QfQwkSgOROiJdOjIiS2sZxvtwzK8+l1U4c5MgA==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-core/-/rpc-core-15.9.2.tgz", + "integrity": "sha512-mRrD3EdIe0r+Qd5kf8hHlK2Ft4HjNDnPBrRNH531bIUTP/fUysjuOaQb1b8y+aHGNloi3VQ+kV39gqcsErrBvQ==", "license": "Apache-2.0", "dependencies": { - "@polkadot/rpc-augment": "15.9.1", - "@polkadot/rpc-provider": "15.9.1", - "@polkadot/types": "15.9.1", - "@polkadot/util": "^13.4.3", + "@polkadot/rpc-augment": "15.9.2", + "@polkadot/rpc-provider": "15.9.2", + "@polkadot/types": "15.9.2", + "@polkadot/util": "^13.4.4", "rxjs": "^7.8.1", "tslib": "^2.8.1" }, @@ -2017,19 +1933,19 @@ } }, "node_modules/@polkadot/rpc-provider": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-15.9.1.tgz", - "integrity": "sha512-FlWVI0q4RmQbLnB9O36WY/4zyMdpK4YyQyiskK06SyhfuKMwaXJdphKWz6wkKspvinW9duGJcittrC3wMKj6Ug==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/rpc-provider/-/rpc-provider-15.9.2.tgz", + "integrity": "sha512-yKakGPz+x1GDqWi2sI6KrAApIYEya6LvUetQ/00d85vK49x8dyy9tHyVmF6abakIOf/eJ16sYgLQj8K6tlbnyg==", "license": "Apache-2.0", "dependencies": { - "@polkadot/keyring": "^13.4.3", - "@polkadot/types": "15.9.1", - "@polkadot/types-support": "15.9.1", - "@polkadot/util": "^13.4.3", - "@polkadot/util-crypto": "^13.4.3", - "@polkadot/x-fetch": "^13.4.3", - "@polkadot/x-global": "^13.4.3", - "@polkadot/x-ws": "^13.4.3", + "@polkadot/keyring": "^13.4.4", + "@polkadot/types": "15.9.2", + "@polkadot/types-support": "15.9.2", + "@polkadot/util": "^13.4.4", + "@polkadot/util-crypto": "^13.4.4", + "@polkadot/x-fetch": "^13.4.4", + "@polkadot/x-global": "^13.4.4", + "@polkadot/x-ws": "^13.4.4", "eventemitter3": "^5.0.1", "mock-socket": "^9.3.1", "nock": "^13.5.5", @@ -2043,17 +1959,17 @@ } }, "node_modules/@polkadot/types": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-15.9.1.tgz", - "integrity": "sha512-F1cbpQeGaoBXm40re6idspqXeKQ/MVnC3Y2zGeJW6huXCz1QDfl+pMbFBCBTvU8uSoV2ii+F28vpmIOO9aDkQQ==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/types/-/types-15.9.2.tgz", + "integrity": "sha512-8Xv1t1SeT1r00vRCbYEUCAkFxh34zHPlQQXXeuMqoLTaBEldsrMohm5oYZTOKfIemBZGjraNBAVmXv9NMsrRrQ==", "license": "Apache-2.0", "dependencies": { - "@polkadot/keyring": "^13.4.3", - "@polkadot/types-augment": "15.9.1", - "@polkadot/types-codec": "15.9.1", - "@polkadot/types-create": "15.9.1", - "@polkadot/util": "^13.4.3", - "@polkadot/util-crypto": "^13.4.3", + "@polkadot/keyring": "^13.4.4", + "@polkadot/types-augment": "15.9.2", + "@polkadot/types-codec": "15.9.2", + "@polkadot/types-create": "15.9.2", + "@polkadot/util": "^13.4.4", + "@polkadot/util-crypto": "^13.4.4", "rxjs": "^7.8.1", "tslib": "^2.8.1" }, @@ -2062,14 +1978,14 @@ } }, "node_modules/@polkadot/types-augment": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-15.9.1.tgz", - "integrity": "sha512-jEyDECSC6ww+5RLeVl32CZdtAQpWqgOv1HneXhvF15b0fRxSZgzHJ11hdYBw6I6aWJroPSgj32BNBG4qW1R2jw==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-augment/-/types-augment-15.9.2.tgz", + "integrity": "sha512-Dw+rs85hPoK3QU9xrzIS7Fk/40YmnUYWtesBzDjBFr+fOENocnPMKeqaI4UrHMmhbcxCA58n0Uhydqf6ZyHvgw==", "license": "Apache-2.0", "dependencies": { - "@polkadot/types": "15.9.1", - "@polkadot/types-codec": "15.9.1", - "@polkadot/util": "^13.4.3", + "@polkadot/types": "15.9.2", + "@polkadot/types-codec": "15.9.2", + "@polkadot/util": "^13.4.4", "tslib": "^2.8.1" }, "engines": { @@ -2077,13 +1993,13 @@ } }, "node_modules/@polkadot/types-codec": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-15.9.1.tgz", - "integrity": "sha512-HtfbTSRualmOZQnil2+8Ff6OHJXv67ndN8f92+cbL1VhnesKbbgDK3TE64YqKlZfZkOTNy4q/2a1P9E1LTCBNA==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-codec/-/types-codec-15.9.2.tgz", + "integrity": "sha512-O7N6kBa87Hs2oMjWy+xeA4HnXf1oep6BPzMYkgK84e2H7VqasWDymBQ2medm3A2h+53EOMfePZOE/JQfIBTuqg==", "license": "Apache-2.0", "dependencies": { - "@polkadot/util": "^13.4.3", - "@polkadot/x-bigint": "^13.4.3", + "@polkadot/util": "^13.4.4", + "@polkadot/x-bigint": "^13.4.4", "tslib": "^2.8.1" }, "engines": { @@ -2091,13 +2007,13 @@ } }, "node_modules/@polkadot/types-create": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-15.9.1.tgz", - "integrity": "sha512-qL3SDZpwlzjD5obBBjMapOTtEV34z+OC66jHL+DoOcUeecZ4e5j1fVZMyRmsWe32ER/MuHWhxVWRCTzdpUwtOg==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-create/-/types-create-15.9.2.tgz", + "integrity": "sha512-dyzP7ShI40ofkgBtP/9aZE86g4i5BIkZK7RdW6XifzQyWBgCRmDnI9k6+wGljzU/FmwdmPmYPxKpNGvjTQ7z9A==", "license": "Apache-2.0", "dependencies": { - "@polkadot/types-codec": "15.9.1", - "@polkadot/util": "^13.4.3", + "@polkadot/types-codec": "15.9.2", + "@polkadot/util": "^13.4.4", "tslib": "^2.8.1" }, "engines": { @@ -2105,16 +2021,16 @@ } }, "node_modules/@polkadot/types-known": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-15.9.1.tgz", - "integrity": "sha512-9w+ycPJKLiKpcmXACeiRKK43PBuK11ZBOUkmRTwyQuK9OHW2XImHecOASAZaAuRzSA675wZaJ8ntvvVeMQ5+vw==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-known/-/types-known-15.9.2.tgz", + "integrity": "sha512-46LVfW0KNpj6nzEobyCYglj075FokSqACrDOq+i2zTGywNpBSix+XkCs0m3ExrIlIVage+WI4Dg3IlB5T9mxmg==", "license": "Apache-2.0", "dependencies": { - "@polkadot/networks": "^13.4.3", - "@polkadot/types": "15.9.1", - "@polkadot/types-codec": "15.9.1", - "@polkadot/types-create": "15.9.1", - "@polkadot/util": "^13.4.3", + "@polkadot/networks": "^13.4.4", + "@polkadot/types": "15.9.2", + "@polkadot/types-codec": "15.9.2", + "@polkadot/types-create": "15.9.2", + "@polkadot/util": "^13.4.4", "tslib": "^2.8.1" }, "engines": { @@ -2122,12 +2038,12 @@ } }, "node_modules/@polkadot/types-support": { - "version": "15.9.1", - "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-15.9.1.tgz", - "integrity": "sha512-KpJ/q5Bc0kYvGVK6cUJQmaq+zAFpTJB3cv+C7EgeBowgWRzz9tPKG9kEFlEw6ZumOz2jk/1eVMJ8dajFSeqs4w==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@polkadot/types-support/-/types-support-15.9.2.tgz", + "integrity": "sha512-0pt5vN5qcSWkzodzZimtPirAEYCSmE3YpzCLL81PEgfUyCf7gzWACvgFK7D9lC8S6Qz7Eg5pOQvSBNscFhnLXA==", "license": "Apache-2.0", "dependencies": { - "@polkadot/util": "^13.4.3", + "@polkadot/util": "^13.4.4", "tslib": "^2.8.1" }, "engines": { @@ -2135,15 +2051,15 @@ } }, "node_modules/@polkadot/util": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-13.4.3.tgz", - "integrity": "sha512-6v2zvg8l7W22XvjYf7qv9tPQdYl2E6aXY94M4TZKsXZxmlS5BoG+A9Aq0+Gw8zBUjupjEmUkA6Y//msO8Zisug==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@polkadot/util/-/util-13.4.4.tgz", + "integrity": "sha512-Lveu+8pZLBoAyyv+8X7FI4aTOwLaNXRc9gz1wVaUoGzk5VgmKp/qbPg0a+mfJD8usjf748OVbShhjXvhV3MLiA==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-bigint": "13.4.3", - "@polkadot/x-global": "13.4.3", - "@polkadot/x-textdecoder": "13.4.3", - "@polkadot/x-textencoder": "13.4.3", + "@polkadot/x-bigint": "13.4.4", + "@polkadot/x-global": "13.4.4", + "@polkadot/x-textdecoder": "13.4.4", + "@polkadot/x-textencoder": "13.4.4", "@types/bn.js": "^5.1.6", "bn.js": "^5.2.1", "tslib": "^2.8.0" @@ -2153,19 +2069,19 @@ } }, "node_modules/@polkadot/util-crypto": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-13.4.3.tgz", - "integrity": "sha512-Ml0mjhKVetMrRCIosmVNMa6lbFPa3fSAeOggf34NsDIIQOKt9FL644iGz1ZSMOnBwN9qk2qHYmcFMTDXX2yKVQ==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@polkadot/util-crypto/-/util-crypto-13.4.4.tgz", + "integrity": "sha512-xuXBNdK3Axlj1ItR6n1kH9zgaDNWri9pb/w1HDFx89bHvw6Bl79wA/oHtVGLbHZ1y/bunpsuapznyswhnsaVog==", "license": "Apache-2.0", "dependencies": { "@noble/curves": "^1.3.0", "@noble/hashes": "^1.3.3", - "@polkadot/networks": "13.4.3", - "@polkadot/util": "13.4.3", + "@polkadot/networks": "13.4.4", + "@polkadot/util": "13.4.4", "@polkadot/wasm-crypto": "^7.4.1", "@polkadot/wasm-util": "^7.4.1", - "@polkadot/x-bigint": "13.4.3", - "@polkadot/x-randomvalues": "13.4.3", + "@polkadot/x-bigint": "13.4.4", + "@polkadot/x-randomvalues": "13.4.4", "@scure/base": "^1.1.7", "tslib": "^2.8.0" }, @@ -2173,7 +2089,7 @@ "node": ">=18" }, "peerDependencies": { - "@polkadot/util": "13.4.3" + "@polkadot/util": "13.4.4" } }, "node_modules/@polkadot/wasm-bridge": { @@ -2281,12 +2197,12 @@ } }, "node_modules/@polkadot/x-bigint": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-13.4.3.tgz", - "integrity": "sha512-8NbjF5Q+5lflhvDFve58wULjCVcvXa932LKFtI5zL2gx5VDhMgyfkNcYRjHB18Ecl21963JuGzvGVTZNkh/i6g==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@polkadot/x-bigint/-/x-bigint-13.4.4.tgz", + "integrity": "sha512-XjChwagc8TbIoWx9N1JwCMOyte417ngobin6vTmLQsgaOlK84LU0/3uc0ea9qUurPopc/Spf1mSMOFp7lRBrIA==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.4.3", + "@polkadot/x-global": "13.4.4", "tslib": "^2.8.0" }, "engines": { @@ -2294,12 +2210,12 @@ } }, "node_modules/@polkadot/x-fetch": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-13.4.3.tgz", - "integrity": "sha512-EwhcwROqWa7mvNTbLVNH71Hbyp5PW5j9lV2UpII5MZzRO95eYwV4oP/xgtTxC+60nC8lrvzAw0JxEHrmNzmtlg==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@polkadot/x-fetch/-/x-fetch-13.4.4.tgz", + "integrity": "sha512-F7awPlvMgu7kW7p4/TWTH18l14zS/8Og71lVO2WZ7HD1ofGG9SQiiNDmNbXl28L1ECOBGcOD1qjVAGEEXPva0Q==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.4.3", + "@polkadot/x-global": "13.4.4", "node-fetch": "^3.3.2", "tslib": "^2.8.0" }, @@ -2308,9 +2224,9 @@ } }, "node_modules/@polkadot/x-global": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-13.4.3.tgz", - "integrity": "sha512-6c98kxZdoGRct3ua9Dz6/qz8wb3XFRUkaY+4+RzIgehKMPhu19pGWTrzmbJSyY9FtIpThuWKuDaBEvd5KgSxjA==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@polkadot/x-global/-/x-global-13.4.4.tgz", + "integrity": "sha512-kwXpzTXOgL2GdMWMzynj9ZpZdjfNvDlpQdlWzDNqTBeIeuklhmhDCA7ZFj3p5OkNUnZoTxNj4zgArYO3VKmQ1g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" @@ -2320,29 +2236,29 @@ } }, "node_modules/@polkadot/x-randomvalues": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-13.4.3.tgz", - "integrity": "sha512-pskXP/S2jROZ6aASExsUFlNp7GbJvQikKogvyvMMCzNIbUYLxpLuquLRa3MOORx2c0SNsENg90cx/zHT+IjPRQ==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@polkadot/x-randomvalues/-/x-randomvalues-13.4.4.tgz", + "integrity": "sha512-y6sMx2VrXi+V6SLTsd21DJ2Un9s2S7/G1MLDu6IiDBSKcnmOHPV6X43+Y8g+r8B7d9+1+ee/hn1JV+VY+SKSdg==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.4.3", + "@polkadot/x-global": "13.4.4", "tslib": "^2.8.0" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@polkadot/util": "13.4.3", + "@polkadot/util": "13.4.4", "@polkadot/wasm-util": "*" } }, "node_modules/@polkadot/x-textdecoder": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-13.4.3.tgz", - "integrity": "sha512-k7Wg6csAPxfNtpBt3k5yUuPHYmRl/nl7H2OMr40upMjbZXbQ1RJW9Z3GBkLmQczG7NwwfAXHwQE9FYOMUtbuRQ==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@polkadot/x-textdecoder/-/x-textdecoder-13.4.4.tgz", + "integrity": "sha512-fXvM2ts0IUx6F/Fd1Yg4ypHCffmUtTSwOtFpqBPvWghKYnmvTbGVrSidGizu6as7KAp4dsum9mYKdRmScBHHzg==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.4.3", + "@polkadot/x-global": "13.4.4", "tslib": "^2.8.0" }, "engines": { @@ -2350,12 +2266,12 @@ } }, "node_modules/@polkadot/x-textencoder": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-13.4.3.tgz", - "integrity": "sha512-byl2LbN1rnEXKmnsCzEDaIjSIHAr+1ciSe2yj3M0K+oWEEcaFZEovJaf/uoyzkcjn+/l8rDv3nget6mPuQ/DSw==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@polkadot/x-textencoder/-/x-textencoder-13.4.4.tgz", + "integrity": "sha512-WpPR2vMAiXS2AN8MfolzWbo5WPEmy5FVZFgwZraJZP8RKfzEuntbY5Nb25p/PIjsPJ1zKU0DE8uVvDcGjxIo7A==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.4.3", + "@polkadot/x-global": "13.4.4", "tslib": "^2.8.0" }, "engines": { @@ -2363,12 +2279,12 @@ } }, "node_modules/@polkadot/x-ws": { - "version": "13.4.3", - "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-13.4.3.tgz", - "integrity": "sha512-GS0I6MYLD/xNAAjODZi/pbG7Ba0e/5sbvDIrT01iKH3SPGN+PZoyAsc04t2IOXA6QmPa1OBHnaU3N4K8gGmJ+w==", + "version": "13.4.4", + "resolved": "https://registry.npmjs.org/@polkadot/x-ws/-/x-ws-13.4.4.tgz", + "integrity": "sha512-qfbFb0Tdjsx5QawICduPTc3326SP+lEdggfyT4HmfrM50nvmCR/82TRAtEWKK7EPhXjoE/cBL/i5VO4d68DBQQ==", "license": "Apache-2.0", "dependencies": { - "@polkadot/x-global": "13.4.3", + "@polkadot/x-global": "13.4.4", "tslib": "^2.8.0", "ws": "^8.18.0" }, @@ -2412,106 +2328,34 @@ } }, "node_modules/@scure/bip32": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz", - "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@noble/curves": "~1.2.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.6.2.tgz", + "integrity": "sha512-t96EPDMbtGgtb7onKKqxRLfE5g05k7uHnHRM2xdE6BP/ZmxaLtPek4J4KfVn/90IQNrU1IOAqMgiDtUdtbe3nw==", "dev": true, "license": "MIT", "dependencies": { - "@noble/hashes": "1.3.2" + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.2" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@scure/bip32/node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32/node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.5.4.tgz", + "integrity": "sha512-TFM4ni0vKvCfBpohoh+/lY05i9gRbSwXWngAsF4CABQxoaOHijxuaZ2R6cStDQ5CHtHO9aGJTr4ksVJASRRyMA==", "dev": true, "license": "MIT", "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" + "@noble/hashes": "~1.7.1", + "@scure/base": "~1.2.4" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@scure/bip39/node_modules/@scure/base": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", - "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@sentry/core": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", @@ -2692,9 +2536,9 @@ "optional": true }, "node_modules/@substrate/connect-known-chains": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@substrate/connect-known-chains/-/connect-known-chains-1.9.3.tgz", - "integrity": "sha512-CPcykiKcVuG4J424gNUFak4AdIJ1sXbu/Bk1IGVPOz74NlBO8EvUyRlpPA7IY0vEf7/n4HQ1gEN5lfgERo4q3w==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@substrate/connect-known-chains/-/connect-known-chains-1.10.0.tgz", + "integrity": "sha512-k0GwwxJE1twaob6qMOBalENDfOEnMt/zdAuUjbrqhjBD6EL1SAWVuTu+bpwXrznd/ims6NSN4TLp9aTf1yE5tg==", "license": "GPL-3.0-only", "optional": true }, @@ -2891,9 +2735,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.14.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", - "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", + "version": "22.14.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.1.tgz", + "integrity": "sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -2903,6 +2747,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" @@ -2925,23 +2770,24 @@ "version": "4.0.6", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.29.1.tgz", - "integrity": "sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.30.1.tgz", + "integrity": "sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/type-utils": "8.29.1", - "@typescript-eslint/utils": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/type-utils": "8.30.1", + "@typescript-eslint/utils": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2961,16 +2807,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.29.1.tgz", - "integrity": "sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.30.1.tgz", + "integrity": "sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/typescript-estree": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", "debug": "^4.3.4" }, "engines": { @@ -2986,14 +2832,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.29.1.tgz", - "integrity": "sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.30.1.tgz", + "integrity": "sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1" + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3004,14 +2850,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.29.1.tgz", - "integrity": "sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.30.1.tgz", + "integrity": "sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.29.1", - "@typescript-eslint/utils": "8.29.1", + "@typescript-eslint/typescript-estree": "8.30.1", + "@typescript-eslint/utils": "8.30.1", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -3028,9 +2874,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.29.1.tgz", - "integrity": "sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.30.1.tgz", + "integrity": "sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==", "dev": true, "license": "MIT", "engines": { @@ -3042,14 +2888,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.1.tgz", - "integrity": "sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.30.1.tgz", + "integrity": "sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/visitor-keys": "8.29.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/visitor-keys": "8.30.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3069,16 +2915,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.29.1.tgz", - "integrity": "sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.30.1.tgz", + "integrity": "sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.29.1", - "@typescript-eslint/types": "8.29.1", - "@typescript-eslint/typescript-estree": "8.29.1" + "@typescript-eslint/scope-manager": "8.30.1", + "@typescript-eslint/types": "8.30.1", + "@typescript-eslint/typescript-estree": "8.30.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3093,13 +2939,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.29.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.1.tgz", - "integrity": "sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==", + "version": "8.30.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.30.1.tgz", + "integrity": "sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.29.1", + "@typescript-eslint/types": "8.30.1", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -3131,9 +2977,9 @@ "license": "ISC" }, "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.4.1.tgz", - "integrity": "sha512-8Tv+Bsd0BjGwfEedIyor4inw8atppRxM5BdUnIt+3mAm/QXUm7Dw74CHnXpfZKXkp07EXJGiA8hStqCINAWhdw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.5.0.tgz", + "integrity": "sha512-YmocNlEcX/AgJv8gI41bhjMOTcKcea4D2nRIbZj+MhRtSH5+vEU8r/pFuTuoF+JjVplLsBueU+CILfBPVISyGQ==", "cpu": [ "arm64" ], @@ -3145,9 +2991,9 @@ ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.4.1.tgz", - "integrity": "sha512-X8c3PhWziEMKAzZz+YAYWfwawi5AEgzy/hmfizAB4C70gMHLKmInJcp1270yYAOs7z07YVFI220pp50z24Jk3A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.5.0.tgz", + "integrity": "sha512-qpUrXgH4e/0xu1LOhPEdfgSY3vIXOxDQv370NEL8npN8h40HcQDA+Pl2r4HBW6tTXezWIjxUFcP7tj529RZtDw==", "cpu": [ "x64" ], @@ -3159,9 +3005,9 @@ ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.4.1.tgz", - "integrity": "sha512-UUr/nREy1UdtxXQnmLaaTXFGOcGxPwNIzeJdb3KXai3TKtC1UgNOB9s8KOA4TaxOUBR/qVgL5BvBwmUjD5yuVA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.5.0.tgz", + "integrity": "sha512-3tX8r8vgjvZzaJZB4jvxUaaFCDCb3aWDCpZN3EjhGnnwhztslI05KSG5NY/jNjlcZ5QWZ7dEZZ/rNBFsmTaSPw==", "cpu": [ "x64" ], @@ -3173,9 +3019,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.4.1.tgz", - "integrity": "sha512-e3pII53dEeS8inkX6A1ad2UXE0nuoWCqik4kOxaDnls0uJUq0ntdj5d9IYd+bv5TDwf9DSge/xPOvCmRYH+Tsw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.5.0.tgz", + "integrity": "sha512-FH+ixzBKaUU9fWOj3TYO+Yn/eO6kYvMLV9eNJlJlkU7OgrxkCmiMS6wUbyT0KA3FOZGxnEQ2z3/BHgYm2jqeLA==", "cpu": [ "arm" ], @@ -3187,9 +3033,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.4.1.tgz", - "integrity": "sha512-e/AKKd9gR+HNmVyDEPI/PIz2t0DrA3cyonHNhHVjrkxe8pMCiYiqhtn1+h+yIpHUtUlM6Y1FNIdivFa+r7wrEQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.5.0.tgz", + "integrity": "sha512-pxCgXMgwB/4PfqFQg73lMhmWwcC0j5L+dNXhZoz/0ek0iS/oAWl65fxZeT/OnU7fVs52MgdP2q02EipqJJXHSg==", "cpu": [ "arm" ], @@ -3201,9 +3047,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.4.1.tgz", - "integrity": "sha512-vtIu34luF1jRktlHtiwm2mjuE8oJCsFiFr8hT5+tFQdqFKjPhbJXn83LswKsOhy0GxAEevpXDI4xxEwkjuXIPA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.5.0.tgz", + "integrity": "sha512-FX2FV7vpLE/+Z0NZX9/1pwWud5Wocm/2PgpUXbT5aSV3QEB10kBPJAzssOQylvdj8mOHoKl5pVkXpbCwww/T2g==", "cpu": [ "arm64" ], @@ -3215,9 +3061,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.4.1.tgz", - "integrity": "sha512-H3PaOuGyhFXiyJd+09uPhGl4gocmhyi1BRzvsP8Lv5AQO3p3/ZY7WjV4t2NkBksm9tMjf3YbOVHyPWi2eWsNYw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.5.0.tgz", + "integrity": "sha512-+gF97xst1BZb28T3nwwzEtq2ewCoMDGKsenYsZuvpmNrW0019G1iUAunZN+FG55L21y+uP7zsGX06OXDQ/viKw==", "cpu": [ "arm64" ], @@ -3229,9 +3075,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.4.1.tgz", - "integrity": "sha512-4+GmJcaaFntCi1S01YByqp8wLMjV/FyQyHVGm0vedIhL1Vfx7uHkz/sZmKsidRwokBGuxi92GFmSzqT2O8KcNA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.5.0.tgz", + "integrity": "sha512-5bEmVcQw9js8JYM2LkUBw5SeELSIxX+qKf9bFrfFINKAp4noZ//hUxLpbF7u/3gTBN1GsER6xOzIZlw/VTdXtA==", "cpu": [ "ppc64" ], @@ -3242,10 +3088,24 @@ "linux" ] }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.5.0.tgz", + "integrity": "sha512-GGk/8TPUsf1Q99F+lzMdjE6sGL26uJCwQ9TlvBs8zR3cLQNw/MIumPN7zrs3GFGySjnwXc8gA6J3HKbejywmqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.4.1.tgz", - "integrity": "sha512-6RDQVCmtFYTlhy89D5ixTqo9bTQqFhvNN0Ey1wJs5r+01Dq15gPHRXv2jF2bQATtMrOfYwv+R2ZR9ew1N1N3YQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.5.0.tgz", + "integrity": "sha512-5uRkFYYVNAeVaA4W/CwugjFN3iDOHCPqsBLCCOoJiMfFMMz4evBRsg+498OFa9w6VcTn2bD5aI+RRayaIgk2Sw==", "cpu": [ "s390x" ], @@ -3257,9 +3117,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.4.1.tgz", - "integrity": "sha512-XpU9uzIkD86+19NjCXxlVPISMUrVXsXo5htxtuG+uJ59p5JauSRZsIxQxzzfKzkxEjdvANPM/lS1HFoX6A6QeA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.5.0.tgz", + "integrity": "sha512-j905CZH3nehYy6NimNqC2B14pxn4Ltd7guKMyPTzKehbFXTUgihQS/ZfHQTdojkMzbSwBOSgq1dOrY+IpgxDsA==", "cpu": [ "x64" ], @@ -3271,9 +3131,9 @@ ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.4.1.tgz", - "integrity": "sha512-3CDjG/spbTKCSHl66QP2ekHSD+H34i7utuDIM5gzoNBcZ1gTO0Op09Wx5cikXnhORRf9+HyDWzm37vU1PLSM1A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.5.0.tgz", + "integrity": "sha512-dmLevQTuzQRwu5A+mvj54R5aye5I4PVKiWqGxg8tTaYP2k2oTs/3Mo8mgnhPk28VoYCi0fdFYpgzCd4AJndQvQ==", "cpu": [ "x64" ], @@ -3285,9 +3145,9 @@ ] }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.4.1.tgz", - "integrity": "sha512-50tYhvbCTnuzMn7vmP8IV2UKF7ITo1oihygEYq9wW2DUb/Y+QMqBHJUSCABRngATjZ4shOK6f2+s0gQX6ElENQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.5.0.tgz", + "integrity": "sha512-LtJMhwu7avhoi+kKfAZOKN773RtzLBVVF90YJbB0wyMpUj9yQPeA+mteVUI9P70OG/opH47FeV5AWeaNWWgqJg==", "cpu": [ "wasm32" ], @@ -3302,9 +3162,9 @@ } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.4.1.tgz", - "integrity": "sha512-KyJiIne/AqV4IW0wyQO34wSMuJwy3VxVQOfIXIPyQ/Up6y/zi2P/WwXb78gHsLiGRUqCA9LOoCX+6dQZde0g1g==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.5.0.tgz", + "integrity": "sha512-FTZBxLL4SO1mgIM86KykzJmPeTPisBDHQV6xtfDXbTMrentuZ6SdQKJUV5BWaoUK3p8kIULlrCcucqdCnk8Npg==", "cpu": [ "arm64" ], @@ -3316,9 +3176,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.4.1.tgz", - "integrity": "sha512-y2NUD7pygrBolN2NoXUrwVqBpKPhF8DiSNE5oB5/iFO49r2DpoYqdj5HPb3F42fPBH5qNqj6Zg63+xCEzAD2hw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.5.0.tgz", + "integrity": "sha512-i5bB7vJ1waUsFciU/FKLd4Zw0VnAkvhiJ4//jYQXyDUuiLKodmtQZVTcOPU7pp97RrNgCFtXfC1gnvj/DHPJTw==", "cpu": [ "ia32" ], @@ -3330,9 +3190,9 @@ ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.4.1.tgz", - "integrity": "sha512-hVXaObGI2lGFmrtT77KSbPQ3I+zk9IU500wobjk0+oX59vg/0VqAzABNtt3YSQYgXTC2a/LYxekLfND/wlt0yQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.5.0.tgz", + "integrity": "sha512-wAvXp4k7jhioi4SebXW/yfzzYwsUCr9kIX4gCsUFKpCTUf8Mi7vScJXI3S+kupSUf0LbVHudR8qBbe2wFMSNUw==", "cpu": [ "x64" ], @@ -3351,9 +3211,9 @@ "license": "ISC" }, "node_modules/abitype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", - "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.8.tgz", + "integrity": "sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==", "dev": true, "license": "MIT", "funding": { @@ -3742,9 +3602,9 @@ } }, "node_modules/assertion-tools": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/assertion-tools/-/assertion-tools-8.0.1.tgz", - "integrity": "sha512-9LJf5O3X30/UcDs5FyBJ+pLJl3dWbIKgTC3REMuJjhqtTMu7W3Dl0AOPg/HBxWYIYMPjBQtSK6KUKdpX6QrHHg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/assertion-tools/-/assertion-tools-8.0.3.tgz", + "integrity": "sha512-Z+GFFmEv7ZU7OxjnE/e9d2r4YlBZW7lT7GB4AxtkqsonxUMb24PL/3lOJd17OC7louN6Gx0NbzeVIwqtVOwIgg==", "dev": true, "hasInstallScript": true, "license": "ISC", @@ -3891,6 +3751,7 @@ "version": "3.0.11", "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" @@ -3924,9 +3785,9 @@ "license": "MIT" }, "node_modules/bignumber.js": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.2.0.tgz", - "integrity": "sha512-JocpCSOixzy5XFJi2ub6IMmV/G9i8Lrm2lZvwBv9xPdglmZM0ufDVBbjbrfU/zuLvBfD7Bv2eYxz9i+OHTgkew==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.2.1.tgz", + "integrity": "sha512-+NzaKgOUvInq9TIUZ1+DRspzf/HApkCwD4btfuasFTdrfnOxqx853TgDpMolp+uv4RpRp7bPcEU2zKr9+fRmyw==", "dev": true, "license": "MIT", "engines": { @@ -3949,6 +3810,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==", + "dev": true, "license": "MIT" }, "node_modules/bn.js": { @@ -4023,6 +3885,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", @@ -4037,6 +3900,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dev": true, "license": "MIT", "dependencies": { "base-x": "^3.0.2" @@ -4046,6 +3910,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dev": true, "license": "MIT", "dependencies": { "bs58": "^4.0.0", @@ -4095,6 +3960,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true, "license": "MIT" }, "node_modules/bytes": { @@ -4321,6 +4187,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", + "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.4", @@ -4706,6 +4573,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", @@ -4719,6 +4587,7 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", @@ -5134,9 +5003,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -5963,6 +5832,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -5982,47 +5852,6 @@ "setimmediate": "^1.0.5" } }, - "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.", - "license": "MIT", - "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==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", - "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", - "license": "MIT" - }, - "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==", - "license": "MPL-2.0", - "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", @@ -6156,20 +5985,6 @@ "dev": true, "license": "MIT" }, - "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==", - "license": "MIT", - "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, "node_modules/event-target-shim": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", @@ -6200,6 +6015,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, "license": "MIT", "dependencies": { "md5.js": "^1.3.4", @@ -7079,17 +6895,14 @@ } }, "node_modules/hardhat": { - "version": "2.22.19", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.19.tgz", - "integrity": "sha512-jptJR5o6MCgNbhd7eKa3mrteR+Ggq1exmE5RUL5ydQEVKcZm0sss5laa86yZ0ixIavIvF4zzS7TdGDuyopj0sQ==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.23.0.tgz", + "integrity": "sha512-xnORx1LgX46TxylOFme96JmSAIjXuHUVpOlUnaCt8MKMGsgy0NGsfPo5rJI/ncCBPLFLURGfZUQ2Uc6ZYN4kYg==", "license": "MIT", "dependencies": { + "@ethereumjs/util": "^9.1.0", "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/edr": "^0.8.0", - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", + "@nomicfoundation/edr": "^0.10.0", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", @@ -7104,7 +6917,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", @@ -7113,6 +6925,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", @@ -7331,9 +7144,9 @@ } }, "node_modules/hardhat-gas-reporter": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-2.2.2.tgz", - "integrity": "sha512-xlg3d00wrgUvP2S5tw3Zf6nO7OyS5crK3P6/ZP69i24pz4grM+6oFHGW/eJPSGqiDWBYX+gKp9XoqP4rwRXrdQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-2.2.3.tgz", + "integrity": "sha512-/52fDR0WOgPTjImmx4j179SAgxPv/499TD0o0qnMhaRr24i2cqlcmCW92FJi0QAKu7HcnxdBGZWQP/5aPjQqUw==", "dev": true, "license": "MIT", "dependencies": { @@ -7351,7 +7164,7 @@ "lodash": "^4.17.21", "markdown-table": "2.0.0", "sha1": "^1.1.1", - "viem": "2.7.14" + "viem": "^2.27.0" }, "peerDependencies": { "hardhat": "^2.16.0" @@ -7735,6 +7548,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, "license": "MIT", "dependencies": { "inherits": "^2.0.4", @@ -8259,6 +8073,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.5.0", @@ -8508,14 +8323,14 @@ "license": "ISC" }, "node_modules/isows": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz", - "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", + "integrity": "sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw==", "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" + "url": "https://github.com/sponsors/wevm" } ], "license": "MIT", @@ -8796,9 +8611,9 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "15.5.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.0.tgz", - "integrity": "sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==", + "version": "15.5.1", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.5.1.tgz", + "integrity": "sha512-6m7u8mue4Xn6wK6gZvSCQwBvMBR36xfY24nF5bMTf2MHDYG6S3yhJuOgdYVw99hsjyDt2d4z168b3naI8+NWtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8837,9 +8652,9 @@ } }, "node_modules/listr2": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", - "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.2.tgz", + "integrity": "sha512-vsBzcU4oE+v0lj4FhVLzr9dBTv4/fHIa57l+GCwovP8MoFNZJTOhGU8PXd4v2VJCbECAaijBiHntiekFMLvo0g==", "dev": true, "license": "MIT", "dependencies": { @@ -9240,6 +9055,7 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, "license": "MIT", "dependencies": { "hash-base": "^3.0.0", @@ -9289,6 +9105,17 @@ "node": ">= 7.6.0" } }, + "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==", + "license": "MIT", + "dependencies": { + "@noble/curves": "~1.8.1", + "@noble/hashes": "~1.7.1", + "micro-packed": "~0.7.2" + } + }, "node_modules/micro-ftch": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", @@ -9296,6 +9123,18 @@ "dev": true, "license": "MIT" }, + "node_modules/micro-packed": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/micro-packed/-/micro-packed-0.7.2.tgz", + "integrity": "sha512-HJ/u8+tMzgrJVAl6P/4l8KGjJSA3SCZaRb1m4wpbovNScCSmVOGUYbkkcoPPcknCHWPpRAdjy+yqXqyQWf+k8g==", + "license": "MIT", + "dependencies": { + "@scure/base": "~1.2.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -9597,14 +9436,13 @@ } }, "node_modules/n3": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/n3/-/n3-1.24.2.tgz", - "integrity": "sha512-j/3PKmK0MA3tAohDCl9y1JDaNxp8wCnhTtrOOgZ1O17JVtWLkzHsp2jZ8YhY2uS4FWQAm6mExcXvl7C8lwXyaw==", + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/n3/-/n3-1.25.1.tgz", + "integrity": "sha512-5vqp6Wcolb57WLC4DC0Nf6ieFPnTOLWwvIG0mmSzTpcRcNyd7xquVSlYSU6clvAZUEfs/OHWGNDRNwQi+m912Q==", "dev": true, "license": "MIT", "dependencies": { "buffer": "^6.0.3", - "queue-microtask": "^1.1.2", "readable-stream": "^4.0.0" }, "engines": { @@ -9985,6 +9823,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ox": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", + "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "license": "MIT", + "dependencies": { + "@adraffy/ens-normalize": "^1.10.1", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0", + "@scure/bip32": "^1.5.0", + "@scure/bip39": "^1.4.0", + "abitype": "^1.0.6", + "eventemitter3": "5.0.1" + }, + "peerDependencies": { + "typescript": ">=5.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -10191,6 +10059,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, "license": "MIT", "dependencies": { "create-hash": "^1.1.2", @@ -10852,6 +10721,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, "license": "MIT", "dependencies": { "hash-base": "^3.0.0", @@ -10862,6 +10732,7 @@ "version": "2.2.7", "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dev": true, "license": "MPL-2.0", "dependencies": { "bn.js": "^5.2.0" @@ -11150,6 +11021,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz", "integrity": "sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==", + "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -11165,6 +11037,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "dev": true, "license": "MIT" }, "node_modules/semver": { @@ -11242,6 +11115,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, "license": "MIT" }, "node_modules/setprototypeof": { @@ -11254,6 +11128,7 @@ "version": "2.4.11", "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", @@ -11654,9 +11529,9 @@ } }, "node_modules/solidity-coverage": { - "version": "0.8.14", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.14.tgz", - "integrity": "sha512-ItAAObe5GaEOp20kXC2BZRnph+9P7Rtoqg2mQc2SXGEHgSDF2wWd1Wxz3ntzQWXkbCtIIGdJT918HG00cObwbA==", + "version": "0.8.15", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.15.tgz", + "integrity": "sha512-qH7290NKww4/t/qFvnSEePEzON0k025IGVlwc8wo8Q6p+h1Tt6fV2M0k3yfsps3TomZYTROsfPXjx7MSnwD5uA==", "dev": true, "license": "ISC", "dependencies": { @@ -12063,6 +11938,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dev": true, "license": "MIT", "dependencies": { "is-hex-prefixed": "1.0.0" @@ -12110,13 +11986,13 @@ } }, "node_modules/synckit": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.3.tgz", - "integrity": "sha512-szhWDqNNI9etJUvbZ1/cx1StnZx8yMmFxme48SwR4dty4ioSY50KEZlpv0qAfgc1fpRzuh9hBXEzoCpJ779dLg==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.4.tgz", + "integrity": "sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.2.1", + "@pkgr/core": "^0.2.3", "tslib": "^2.8.1" }, "engines": { @@ -12439,18 +12315,6 @@ "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==", "license": "MIT" }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "license": "Unlicense" - }, - "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==", - "license": "Unlicense" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -12792,30 +12656,31 @@ } }, "node_modules/unrs-resolver": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.4.1.tgz", - "integrity": "sha512-MhPB3wBI5BR8TGieTb08XuYlE8oFVEXdSAgat3psdlRyejl8ojQ8iqPcjh094qCZ1r+TnkxzP6BeCd/umfHckQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.5.0.tgz", + "integrity": "sha512-6aia3Oy7SEe0MuUGQm2nsyob0L2+g57w178K5SE/3pvSGAIp28BB2O921fKx424Ahc/gQ6v0DXFbhcpyhGZdOA==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/JounQin" }, "optionalDependencies": { - "@unrs/resolver-binding-darwin-arm64": "1.4.1", - "@unrs/resolver-binding-darwin-x64": "1.4.1", - "@unrs/resolver-binding-freebsd-x64": "1.4.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.4.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.4.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.4.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.4.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.4.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.4.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.4.1", - "@unrs/resolver-binding-linux-x64-musl": "1.4.1", - "@unrs/resolver-binding-wasm32-wasi": "1.4.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.4.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.4.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.4.1" + "@unrs/resolver-binding-darwin-arm64": "1.5.0", + "@unrs/resolver-binding-darwin-x64": "1.5.0", + "@unrs/resolver-binding-freebsd-x64": "1.5.0", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.5.0", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.5.0", + "@unrs/resolver-binding-linux-arm64-gnu": "1.5.0", + "@unrs/resolver-binding-linux-arm64-musl": "1.5.0", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.5.0", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.5.0", + "@unrs/resolver-binding-linux-s390x-gnu": "1.5.0", + "@unrs/resolver-binding-linux-x64-gnu": "1.5.0", + "@unrs/resolver-binding-linux-x64-musl": "1.5.0", + "@unrs/resolver-binding-wasm32-wasi": "1.5.0", + "@unrs/resolver-binding-win32-arm64-msvc": "1.5.0", + "@unrs/resolver-binding-win32-ia32-msvc": "1.5.0", + "@unrs/resolver-binding-win32-x64-msvc": "1.5.0" } }, "node_modules/uri-js": { @@ -12857,9 +12722,9 @@ "license": "MIT" }, "node_modules/viem": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.7.14.tgz", - "integrity": "sha512-5b1KB1gXli02GOQHZIUsRluNUwssl2t4hqdFAzyWPwJ744N83jAOBOjOkrGz7K3qMIv9b0GQt3DoZIErSQTPkQ==", + "version": "2.27.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.27.2.tgz", + "integrity": "sha512-VwsB+RswcflbwBNPMvzTHuafDA51iT8v4SuIFcudTP2skmxcdodbgoOLP4dYELVnCzcedxoSJDOeext4V3zdnA==", "dev": true, "funding": [ { @@ -12869,14 +12734,14 @@ ], "license": "MIT", "dependencies": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@scure/bip32": "1.3.2", - "@scure/bip39": "1.2.1", - "abitype": "1.0.0", - "isows": "1.0.3", - "ws": "8.13.0" + "@noble/curves": "1.8.1", + "@noble/hashes": "1.7.1", + "@scure/bip32": "1.6.2", + "@scure/bip39": "1.5.4", + "abitype": "1.0.8", + "isows": "1.0.6", + "ox": "0.6.9", + "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -12887,61 +12752,35 @@ } } }, - "node_modules/viem/node_modules/@adraffy/ens-normalize": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", - "dev": true, - "license": "MIT" - }, "node_modules/viem/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.8.1.tgz", + "integrity": "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ==", "dev": true, "license": "MIT", "dependencies": { - "@noble/hashes": "1.3.2" + "@noble/hashes": "1.7.1" + }, + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/viem/node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.7.1.tgz", + "integrity": "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/viem/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -12971,6 +12810,34 @@ "node": ">=8.0.0" } }, + "node_modules/web3-utils/node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "dev": true, + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/web3-utils/node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/web3-utils/node_modules/@noble/curves": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", diff --git a/package.json b/package.json index f6ce11e4..a5d8e573 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dkg-evm-module", - "version": "8.0.4", + "version": "8.0.5", "description": "Smart contracts for OriginTrail V8", "main": "index.ts", "files": [ @@ -28,6 +28,7 @@ "author": "", "license": "Apache-2.0", "devDependencies": { + "@nomicfoundation/ethereumjs-util": "^9.0.4", "@nomicfoundation/hardhat-chai-matchers": "^2.0.8", "@nomicfoundation/hardhat-network-helpers": "^1.0.12", "@nomiclabs/hardhat-solhint": "^4.0.1", @@ -38,7 +39,7 @@ "@types/node": "^22.10.2", "@typescript-eslint/eslint-plugin": "^8.18.1", "@typescript-eslint/parser": "^8.18.1", - "assertion-tools": "^8.0.1", + "assertion-tools": "^8.0.3", "chai": "^4.5.0", "cross-env": "^7.0.3", "eslint": "^8.17.0", From 9086d672d83a3d011ad9e0f68c080d91ef69b515 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 17 Apr 2025 16:55:06 +0200 Subject: [PATCH 068/106] Add DelegatorsInfo events --- abi/DelegatorsInfo.json | 38 ++++++++++++++++++++++++++++ contracts/storage/DelegatorsInfo.sol | 10 ++++++++ 2 files changed, 48 insertions(+) diff --git a/abi/DelegatorsInfo.json b/abi/DelegatorsInfo.json index 27171de5..886e3ff2 100644 --- a/abi/DelegatorsInfo.json +++ b/abi/DelegatorsInfo.json @@ -26,6 +26,44 @@ "name": "ZeroAddressHub", "type": "error" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "DelegatorAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + } + ], + "name": "DelegatorRemoved", + "type": "event" + }, { "inputs": [ { diff --git a/contracts/storage/DelegatorsInfo.sol b/contracts/storage/DelegatorsInfo.sol index 0736a077..428e411b 100644 --- a/contracts/storage/DelegatorsInfo.sol +++ b/contracts/storage/DelegatorsInfo.sol @@ -19,6 +19,9 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { // IdentityId => Delegator => IsDelegator mapping(uint72 => mapping(address => bool)) public isDelegatorMap; + event DelegatorAdded(uint72 indexed identityId, address indexed delegator); + event DelegatorRemoved(uint72 indexed identityId, address indexed delegator); + // solhint-disable-next-line no-empty-blocks constructor(address hubAddress) ContractStatus(hubAddress) {} @@ -36,6 +39,8 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { nodeDelegatorIndex[identityId][delegator] = nodeDelegatorAddresses[identityId].length; nodeDelegatorAddresses[identityId].push(delegator); isDelegatorMap[identityId][delegator] = true; + + emit DelegatorAdded(identityId, delegator); } function removeDelegator(uint72 identityId, address delegator) external onlyContracts { @@ -55,6 +60,8 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { nodeDelegatorAddresses[identityId].pop(); delete nodeDelegatorIndex[identityId][delegator]; delete isDelegatorMap[identityId][delegator]; + + emit DelegatorRemoved(identityId, delegator); } function getDelegators(uint72 identityId) external view returns (address[] memory) { @@ -85,6 +92,9 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { .length; nodeDelegatorAddresses[delegatorNodes[j]].push(newAddresses[i]); isDelegatorMap[delegatorNodes[j]][newAddresses[i]] = true; + + emit DelegatorAdded(delegatorNodes[j], newAddresses[i]); + unchecked { j++; } From 2df2c7c270d4676b688593fb45951abc11e5cd70 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 18 Apr 2025 17:08:51 +0200 Subject: [PATCH 069/106] new contract addresses --- deployments/base_sepolia_test_contracts.json | 27 ++++++++++++++++ deployments/gnosis_chiado_test_contracts.json | 27 ++++++++++++++++ deployments/neuroweb_testnet_contracts.json | 32 ++++++++++++++++++- 3 files changed, 85 insertions(+), 1 deletion(-) diff --git a/deployments/base_sepolia_test_contracts.json b/deployments/base_sepolia_test_contracts.json index f4f22961..787df850 100644 --- a/deployments/base_sepolia_test_contracts.json +++ b/deployments/base_sepolia_test_contracts.json @@ -261,6 +261,33 @@ "deploymentBlock": 22788786, "deploymentTimestamp": 1741345864175, "deployed": true + }, + "DelegatorsInfo": { + "evmAddress": "0x4B5a565d33eB20fb7aD66572402edB14cA2b43e2", + "version": "1.0.0", + "gitBranch": "release/v8.0.7-testnet", + "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", + "deploymentBlock": 24609693, + "deploymentTimestamp": 1744987678184, + "deployed": true + }, + "RandomSamplingStorage": { + "evmAddress": "0x0E4d6dAef761D281f67Bc02D0c55c26305Ffc766", + "version": "1.0.0", + "gitBranch": "release/v8.0.7-testnet", + "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", + "deploymentBlock": 24607118, + "deploymentTimestamp": 1744982528388, + "deployed": true + }, + "RandomSampling": { + "evmAddress": "0x1A51F6f5c9c23F08652F4482b299A3529C7597ca", + "version": "1.0.0", + "gitBranch": "release/v8.0.7-testnet", + "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", + "deploymentBlock": 24607121, + "deploymentTimestamp": 1744982531809, + "deployed": true } } } diff --git a/deployments/gnosis_chiado_test_contracts.json b/deployments/gnosis_chiado_test_contracts.json index 3964285a..5e811bb7 100644 --- a/deployments/gnosis_chiado_test_contracts.json +++ b/deployments/gnosis_chiado_test_contracts.json @@ -261,6 +261,33 @@ "deploymentBlock": 14659414, "deploymentTimestamp": 1741345656892, "deployed": true + }, + "DelegatorsInfo": { + "evmAddress": "0xdBB1114F0979a8f326Eb170d5cb6416572f056DD", + "version": "1.0.0", + "gitBranch": "release/v8.0.7-testnet", + "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", + "deploymentBlock": 15339076, + "deploymentTimestamp": 1744987709380, + "deployed": true + }, + "RandomSamplingStorage": { + "evmAddress": "0x0E4d6dAef761D281f67Bc02D0c55c26305Ffc766", + "version": "1.0.0", + "gitBranch": "release/v8.0.7-testnet", + "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", + "deploymentBlock": 15338147, + "deploymentTimestamp": 1744982791617, + "deployed": true + }, + "RandomSampling": { + "evmAddress": "0x1A51F6f5c9c23F08652F4482b299A3529C7597ca", + "version": "1.0.0", + "gitBranch": "release/v8.0.7-testnet", + "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", + "deploymentBlock": 15338148, + "deploymentTimestamp": 1744982804147, + "deployed": true } } } diff --git a/deployments/neuroweb_testnet_contracts.json b/deployments/neuroweb_testnet_contracts.json index 0f8c2bd8..d2dc3480 100644 --- a/deployments/neuroweb_testnet_contracts.json +++ b/deployments/neuroweb_testnet_contracts.json @@ -209,7 +209,7 @@ "gitCommitHash": "04baf6bee66a9023a60acedf00b82d1152e31a17", "deploymentBlock": 7064218, "deploymentTimestamp": 1744106244945, - "deployed": true + "deployed": false }, "ParanetsRegistry": { "evmAddress": "0x17bb588fdE9e2F69aceAb9A24deE753245E3EAFE", @@ -290,6 +290,36 @@ "deploymentBlock": 7064217, "deploymentTimestamp": 1744106239694, "deployed": true + }, + "DelegatorsInfo": { + "evmAddress": "0x40A822a830Fc3a63C8F042A10F5346C46C05BC7d", + "substrateAddress": "5EMjsczZ8YhqTH7HWSXZ3nnD4oCfhEx9pXmrKCFR6R5VCVfb", + "version": "1.0.0", + "gitBranch": "release/v8.0.7-testnet", + "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", + "deploymentBlock": 7195336, + "deploymentTimestamp": 1744987580235, + "deployed": true + }, + "RandomSamplingStorage": { + "evmAddress": "0x63ec38B6816F2855cAA0Cb735b17Db933a15d11d", + "substrateAddress": "5EMjsczgCPtztnDBmaoAKGHUa1NB9veqR9eHWuTeapkSJ7er", + "version": "1.0.0", + "gitBranch": "release/v8.0.7-testnet", + "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", + "deploymentBlock": 7194647, + "deploymentTimestamp": 1744983074858, + "deployed": true + }, + "RandomSampling": { + "evmAddress": "0x99aaf878f85A6aD905159c9D1c12BFFc58454501", + "substrateAddress": "5EMjsczry13xcRnpRYdcq4tGJEkYCK5W4pT6JGFc5ja2DmaC", + "version": "1.0.0", + "gitBranch": "release/v8.0.7-testnet", + "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", + "deploymentBlock": 7194648, + "deploymentTimestamp": 1744983079796, + "deployed": true } } } From dbc6d28863f816e6ea8dee1fe0c908662f48f687 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 18 Apr 2025 17:10:00 +0200 Subject: [PATCH 070/106] Remove migrator deployment --- deploy/029_deploy_migrator.ts | 34 ------------------- ... => 029_deploy_random_sampling_storage.ts} | 0 ...pling.ts => 030_deploy_random_sampling.ts} | 0 3 files changed, 34 deletions(-) delete mode 100644 deploy/029_deploy_migrator.ts rename deploy/{030_deploy_random_sampling_storage.ts => 029_deploy_random_sampling_storage.ts} (100%) rename deploy/{031_deploy_random_sampling.ts => 030_deploy_random_sampling.ts} (100%) diff --git a/deploy/029_deploy_migrator.ts b/deploy/029_deploy_migrator.ts deleted file mode 100644 index 6a06ea38..00000000 --- a/deploy/029_deploy_migrator.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { HardhatRuntimeEnvironment } from 'hardhat/types'; -import { DeployFunction } from 'hardhat-deploy/types'; - -const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) { - const oldHubAddress = - hre.helpers.contractDeployments.contracts['OldHub']?.evmAddress; - - if (hre.network.config.environment === 'development' || !oldHubAddress) { - return; - } - - const Migrator = await hre.helpers.deploy({ - newContractName: 'Migrator', - additionalArgs: [oldHubAddress], - }); - - hre.helpers.setParametersEncodedData.push({ - contractName: 'Migrator', - encodedData: [ - Migrator.interface.encodeFunctionData('initializeOldContracts', []), - Migrator.interface.encodeFunctionData('initializeNewContracts', []), - ], - }); -}; - -export default func; -func.tags = ['Migrator']; -func.dependencies = [ - 'Hub', - 'IdentityStorage', - 'ProfileStorage', - 'StakingStorage', - 'Ask', -]; diff --git a/deploy/030_deploy_random_sampling_storage.ts b/deploy/029_deploy_random_sampling_storage.ts similarity index 100% rename from deploy/030_deploy_random_sampling_storage.ts rename to deploy/029_deploy_random_sampling_storage.ts diff --git a/deploy/031_deploy_random_sampling.ts b/deploy/030_deploy_random_sampling.ts similarity index 100% rename from deploy/031_deploy_random_sampling.ts rename to deploy/030_deploy_random_sampling.ts From dfeedfaf5fe6431a13b2ac0255dd038f411f63f5 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 18 Apr 2025 17:10:19 +0200 Subject: [PATCH 071/106] update readme --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index fd62bb61..3ba83e9d 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ npm install ``` ## NPM Scripts + This project utilizes a variety of NPM scripts to run various tasks and processes. The scripts are defined in the package.json file and are designed to be used with the Hardhat CLI, leveraging Hardhat plugins for additional functionality. Here's a brief description of the scripts: - `clean`: Removes the cache and artifacts folders generated by Hardhat. @@ -65,6 +66,7 @@ npm run compile ``` ## Additional Hardhat tasks + Hardhat has plenty of other useful commands, extended by the installed plugins. Here's a brief description of the most useful tasks: - `decode`: Decodes encoded ABI data (e.g. input data of transaction). @@ -79,14 +81,17 @@ npx hardhat decode --data ``` Usage example of `encode_data` task. Here we want to call ProofManagerV1 function called setReq, and this function can be called only through `forwardCall` in HubController and encoding arguments for this function can be done by using this task: + ```sh npx hardhat encode_data --contract-name ProofManagerV1 --function-name setReq 1 true ``` + Alternatively, encoded data can be produced from Remix by copying prepared calldata from ProofManagerV1 setReq call. ## Contracts deployment on parachains Update environment use NEUROWEB_DEVNET/NEUROWEB_TESTNET/NEUROWEB_MAINNET + ```dotenv RPC_NEUROWEB_DEVNET='' EVM_PRIVATE_KEY_NEUROWEB_DEVNET='<0x_ethereum_private_key>' @@ -96,6 +101,7 @@ ACCOUNT_WITH_NEURO_URI_NEUROWEB_DEVNET=''
OriginTrail Parachain Devnet + ```sh npm run deploy:neuroweb_devnet ``` @@ -103,6 +109,7 @@ npm run deploy:neuroweb_devnet
OriginTrail Parachain Testnet + ```sh npm run deploy:neuroweb_testnet ``` @@ -110,6 +117,7 @@ npm run deploy:neuroweb_testnet
OriginTrail Parachain Mainnet + ```sh npm run deploy:neuroweb_mainnet ``` @@ -117,6 +125,7 @@ npm run deploy:neuroweb_mainnet
Gnosis Chiado Dev + ```sh npm run deploy:gnosis_chiado_dev ``` @@ -124,6 +133,7 @@ npm run deploy:gnosis_chiado_dev
Gnosis Chiado Test + ```sh npm run deploy:gnosis_chiado_test ``` @@ -131,12 +141,29 @@ npm run deploy:gnosis_chiado_test
Gnosis Mainnet + ```sh npm run deploy:gnosis_mainnet ```
+Base Sepolia Test + +```sh +npm run deploy:base_sepolia_test +``` + +
+ +Base Mainnet + +```sh +npm run deploy:base_mainnet +``` + +
+ ### Redeploy contract In order to redeploy desired contract, set `deployed` to `false` in `deployments/_contracts.json`. From 858afe10cc7b3499f23a193000e0c647f0c05177 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 18 Apr 2025 17:10:40 +0200 Subject: [PATCH 072/106] change migrate to public --- contracts/storage/DelegatorsInfo.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/storage/DelegatorsInfo.sol b/contracts/storage/DelegatorsInfo.sol index 428e411b..26a76085 100644 --- a/contracts/storage/DelegatorsInfo.sol +++ b/contracts/storage/DelegatorsInfo.sol @@ -76,7 +76,7 @@ contract DelegatorsInfo is INamed, IVersioned, ContractStatus, IInitializable { return isDelegatorMap[identityId][delegator]; } - function migrate(address[] memory newAddresses) external onlyContracts { + function migrate(address[] memory newAddresses) public { StakingStorage ss = StakingStorage(hub.getContractAddress("StakingStorage")); for (uint256 i = 0; i < newAddresses.length; ) { bytes32 addressHash = keccak256(abi.encodePacked(newAddresses[i])); From be4c63d7f0e3768d3b52e0aebe05bc68786b417d Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 18 Apr 2025 17:11:15 +0200 Subject: [PATCH 073/106] add onlyHub to initialize in RandomSampling.sol --- contracts/RandomSampling.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 368af8ed..24edcc8a 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -60,7 +60,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { w2 = _w2; } - function initialize() external { + function initialize() public onlyHub { identityStorage = IdentityStorage(hub.getContractAddress("IdentityStorage")); randomSamplingStorage = RandomSamplingStorage(hub.getContractAddress("RandomSamplingStorage")); knowledgeCollectionStorage = KnowledgeCollectionStorage( From 7facf3efa9bfd7a88f639d98f1c4478caf479e75 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Fri, 18 Apr 2025 17:13:55 +0200 Subject: [PATCH 074/106] use ContractStatus instead of HubDependent --- abi/RandomSamplingStorage.json | 26 +++++++++++++++++++++ contracts/storage/RandomSamplingStorage.sol | 7 +++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json index 1e9090eb..f31fe73b 100644 --- a/abi/RandomSamplingStorage.json +++ b/abi/RandomSamplingStorage.json @@ -734,6 +734,32 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bool", + "name": "_status", + "type": "bool" + } + ], + "name": "setStatus", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "status", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "updateAndGetActiveProofPeriodStartBlock", diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 9a5bf93c..1742d27e 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -6,10 +6,10 @@ import {INamed} from "../interfaces/INamed.sol"; import {IVersioned} from "../interfaces/IVersioned.sol"; import {IInitializable} from "../interfaces/IInitializable.sol"; import {RandomSamplingLib} from "../libraries/RandomSamplingLib.sol"; -import {HubDependent} from "../abstract/HubDependent.sol"; import {Chronos} from "../storage/Chronos.sol"; +import {ContractStatus} from "../abstract/ContractStatus.sol"; -contract RandomSamplingStorage is INamed, IVersioned, IInitializable, HubDependent { +contract RandomSamplingStorage is INamed, IVersioned, IInitializable, ContractStatus { string private constant _NAME = "RandomSamplingStorage"; string private constant _VERSION = "1.0.0"; uint8 public constant CHUNK_BYTE_SIZE = 32; @@ -36,7 +36,7 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, HubDepende uint256 indexed effectiveEpoch ); - constructor(address hubAddress, uint16 _proofingPeriodDurationInBlocks) HubDependent(hubAddress) { + constructor(address hubAddress, uint16 _proofingPeriodDurationInBlocks) ContractStatus(hubAddress) { require(_proofingPeriodDurationInBlocks > 0, "Proofing period duration in blocks must be greater than 0"); proofingPeriodDurations.push( RandomSamplingLib.ProofingPeriodDuration({ @@ -49,6 +49,7 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, HubDepende function initialize() public onlyHub { chronos = Chronos(hub.getContractAddress("Chronos")); // update the last proofing period duration with the current epoch + // TODO: What happens when contract is initialized twice? proofingPeriodDurations[proofingPeriodDurations.length - 1] = RandomSamplingLib.ProofingPeriodDuration({ durationInBlocks: proofingPeriodDurations[proofingPeriodDurations.length - 1].durationInBlocks, effectiveEpoch: chronos.getCurrentEpoch() From 3ecd97a579170b6b3d587a59bafa9721f78b23c1 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 22 Apr 2025 11:34:24 +0200 Subject: [PATCH 075/106] bump version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a5d8e573..c95222a5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dkg-evm-module", - "version": "8.0.5", + "version": "8.0.6", "description": "Smart contracts for OriginTrail V8", "main": "index.ts", "files": [ From 262ba06f642a05ef13e21b6c61e6a3a9adc91e4c Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 22 Apr 2025 11:35:25 +0200 Subject: [PATCH 076/106] revert to old version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c95222a5..a5d8e573 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dkg-evm-module", - "version": "8.0.6", + "version": "8.0.5", "description": "Smart contracts for OriginTrail V8", "main": "index.ts", "files": [ From 7eba96d93008f7cd0a62d955319080ff023f6ef4 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 29 Apr 2025 13:49:22 +0200 Subject: [PATCH 077/106] Add claimRewards function --- abi/RandomSampling.json | 49 ++++++++++++ abi/RandomSamplingStorage.json | 86 +++++++++++++++++++++ contracts/RandomSampling.sol | 75 ++++++++++++------ contracts/storage/RandomSamplingStorage.sol | 21 +++++ 4 files changed, 209 insertions(+), 22 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index 72cf9a25..dcd3393f 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -126,6 +126,37 @@ "name": "ProofingPeriodDurationInBlocksUpdated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "delegator", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "RewardsClaimed", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -203,6 +234,24 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + } + ], + "name": "claimRewards", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "createChallenge", diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json index f31fe73b..8c6c2f6b 100644 --- a/abi/RandomSamplingStorage.json +++ b/abi/RandomSamplingStorage.json @@ -199,6 +199,35 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "", + "type": "uint72" + }, + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "epochNodeDelegatorRewardsClaimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -314,6 +343,35 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "bytes32", + "name": "delegatorKey", + "type": "bytes32" + } + ], + "name": "getEpochNodeDelegatorRewardsClaimed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -679,6 +737,34 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "bytes32", + "name": "delegatorKey", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "claimed", + "type": "bool" + } + ], + "name": "setEpochNodeDelegatorRewardsClaimed", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 24edcc8a..3e1104b2 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -52,6 +52,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { event ValidProofSubmitted(uint72 indexed identityId, uint256 indexed epoch, uint256 score); event AvgBlockTimeUpdated(uint8 avgBlockTimeInSeconds); event ProofingPeriodDurationInBlocksUpdated(uint8 durationInBlocks); + event RewardsClaimed(uint72 indexed identityId, uint256 indexed epoch, address indexed delegator, uint256 amount); constructor(address hubAddress, uint8 _avgBlockTimeInSeconds, uint256 _w1, uint256 _w2) ContractStatus(hubAddress) { require(_avgBlockTimeInSeconds > 0, "Average block time in seconds must be greater than 0"); @@ -182,34 +183,35 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { } function getDelegatorEpochRewardsAmount(uint72 identityId, uint256 epoch) public view returns (uint256) { - require(chronos.getCurrentEpoch() > epoch, "Epoch is not over yet"); - - uint256 epochNodeValidProofsCount = randomSamplingStorage.getEpochNodeValidProofsCount(epoch, identityId); - - uint256 proofingPeriodDurationInBlocks = randomSamplingStorage.getEpochProofingPeriodDurationInBlocks(epoch); - - uint256 maxNodeProofsInEpoch = chronos.epochLength() / (proofingPeriodDurationInBlocks * avgBlockTimeInSeconds); - - uint256 allExpectedEpochProofsCount = shardingTableStorage.nodesCount() * maxNodeProofsInEpoch; + return _getDelegatorEpochRewardsAmount(identityId, epoch, msg.sender); + } - if (allExpectedEpochProofsCount == 0) { - revert("All expected epoch proofs count is 0"); - } + function claimRewards(uint72 identityId, uint256 epoch) external { + // make sure the epoch is over and it is finalized + require(chronos.getCurrentEpoch() > epoch, "Epoch is not over yet"); + require(epochStorage.lastFinalizedEpoch(1) >= epoch, "Epoch is not finalized yet"); + // get delegator key bytes32 delegatorKey = keccak256(abi.encodePacked(msg.sender)); - uint256 epochNodeDelegatorScore = randomSamplingStorage.getEpochNodeDelegatorScore( - epoch, - identityId, - delegatorKey + + // make sure the delegator has not claimed the rewards yet + require( + !randomSamplingStorage.getEpochNodeDelegatorRewardsClaimed(epoch, identityId, delegatorKey), + "Rewards already claimed" ); - uint256 totalEpochTracFees = epochStorage.getEpochPool(1, epoch); + // get rewards amount + uint256 rewardAmount = _getDelegatorEpochRewardsAmount(identityId, epoch, msg.sender); + require(rewardAmount > 0, "No rewards to claim"); + require(rewardAmount <= type(uint96).max, "Reward amount exceeds uint96"); - uint256 reward = ((totalEpochTracFees / 2) * - (w1 * (epochNodeValidProofsCount / allExpectedEpochProofsCount) + w2 * epochNodeDelegatorScore)) / - SCALING_FACTOR ** 2; + // Mark as claimed - before transfer to avoid reentrancy + randomSamplingStorage.setEpochNodeDelegatorRewardsClaimed(epoch, identityId, delegatorKey, true); - return reward; + // Transfer the rewards to the delegator via StakingStorage + stakingStorage.transferStake(msg.sender, uint96(rewardAmount)); + + emit RewardsClaimed(identityId, epoch, msg.sender, rewardAmount); } function _computeMerkleRootFromProof( @@ -375,5 +377,34 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { } } } - // claim rewards + + function _getDelegatorEpochRewardsAmount( + uint72 identityId, + uint256 epoch, + address delegator + ) internal view returns (uint256) { + uint256 epochNodeValidProofsCount = randomSamplingStorage.getEpochNodeValidProofsCount(epoch, identityId); + + uint256 proofingPeriodDurationInBlocks = randomSamplingStorage.getEpochProofingPeriodDurationInBlocks(epoch); + + uint256 maxNodeProofsInEpoch = chronos.epochLength() / (proofingPeriodDurationInBlocks * avgBlockTimeInSeconds); + + uint256 allExpectedEpochProofsCount = shardingTableStorage.nodesCount() * maxNodeProofsInEpoch; + if (allExpectedEpochProofsCount == 0) { + revert("All expected epoch proofs count is 0"); + } + + bytes32 delegatorKey = keccak256(abi.encodePacked(delegator)); + uint256 epochNodeDelegatorScore = randomSamplingStorage.getEpochNodeDelegatorScore( + epoch, + identityId, + delegatorKey + ); + uint256 totalEpochTracFees = epochStorage.getEpochPool(1, epoch); + + uint256 reward = ((totalEpochTracFees / 2) * + (w1 * (epochNodeValidProofsCount / allExpectedEpochProofsCount) + w2 * epochNodeDelegatorScore)) / + SCALING_FACTOR ** 2; + return reward; + } } diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 1742d27e..633e7dd6 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -28,6 +28,8 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, ContractSt mapping(uint256 => mapping(uint256 => uint256)) public allNodesEpochProofPeriodScore; // epoch => identityId => delegatorKey => score mapping(uint256 => mapping(uint72 => mapping(bytes32 => uint256))) public epochNodeDelegatorScore; + // epoch => identityId => delegatorKey => rewards claimed status + mapping(uint256 => mapping(uint72 => mapping(bytes32 => bool))) public epochNodeDelegatorRewardsClaimed; event ProofingPeriodDurationAdded(uint16 durationInBlocks, uint256 indexed effectiveEpoch); event PendingProofingPeriodDurationReplaced( @@ -220,4 +222,23 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, ContractSt ) external onlyContracts { epochNodeDelegatorScore[epoch][identityId][delegatorKey] += score; } + + // --- Rewards Claimed Status --- + + function getEpochNodeDelegatorRewardsClaimed( + uint256 epoch, + uint72 identityId, + bytes32 delegatorKey + ) external view returns (bool) { + return epochNodeDelegatorRewardsClaimed[epoch][identityId][delegatorKey]; + } + + function setEpochNodeDelegatorRewardsClaimed( + uint256 epoch, + uint72 identityId, + bytes32 delegatorKey, + bool claimed + ) external onlyContracts { + epochNodeDelegatorRewardsClaimed[epoch][identityId][delegatorKey] = claimed; + } } From 825f177ffa43bd74f91e9e92dae9af4f4826069c Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 29 Apr 2025 13:51:13 +0200 Subject: [PATCH 078/106] Add claimRewards tests --- test/integration/RandomSampling.test.ts | 484 +++++++++++++++++++++++- 1 file changed, 480 insertions(+), 4 deletions(-) diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index fcf3c1ab..c1be4dcb 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -557,7 +557,7 @@ describe('@integration RandomSampling', () => { }); describe('Challenge Creation', () => { - it('Should revert if an unsolved challenge already exists for this node in the current proof period', async () => { + it('Should revert if an unsolved challenge already exists for this node in the current proof period', async () => { // creator of the KC const kcCreator = getDefaultKCCreator(accounts); // create a publishing node with stake and ask @@ -754,7 +754,7 @@ describe('@integration RandomSampling', () => { ); }); - it('Should set the node challenge successfully and emit ChallengeCreated event', async () => { + it('Should set the node challenge successfully and emit ChallengeCreated event', async () => { const kcCreator = getDefaultKCCreator(accounts); const publishingNode = getDefaultPublishingNode(accounts); const receivingNodes = getDefaultReceivingNodes(accounts); @@ -932,7 +932,7 @@ describe('@integration RandomSampling', () => { { Token, Staking, Ask }, ); await Profile.connect(publishingNode.operational).updateAsk( - publishingNodeIdentityId, + BigInt(publishingNodeIdentityId), 100n, ); await Ask.connect(accounts[0]).recalculateActiveSet(); @@ -958,7 +958,7 @@ describe('@integration RandomSampling', () => { const { proof } = kcTools.calculateMerkleProof( quads, 32, - challenge.chunkId, + Number(challenge.chunkId), ); const submitProofTx = RandomSampling.connect( @@ -1630,4 +1630,480 @@ describe('@integration RandomSampling', () => { ); }); }); + + describe('Reward Claiming', () => { + let publishingNode: { + operational: SignerWithAddress; + admin: SignerWithAddress; + }; + let publishingNodeIdentityId: number; + let delegatorAccount: SignerWithAddress; + let delegatorKey: string; + let epochToClaim: bigint; + let deps: { + accounts: SignerWithAddress[]; + Profile: Profile; + Token: Token; + Staking: Staking; + Ask: Ask; + KnowledgeCollection: KnowledgeCollection; + ParametersStorage: ParametersStorage; + RandomSampling: RandomSampling; + RandomSamplingStorage: RandomSamplingStorage; + EpochStorage: EpochStorage; + Chronos: Chronos; + StakingStorage: StakingStorage; + IdentityStorage: IdentityStorage; + ShardingTableStorage: ShardingTableStorage; + }; + + // Helper function to advance to the next epoch + const advanceToNextEpoch = async () => { + const timeUntil = await Chronos.timeUntilNextEpoch(); + const avgBlockTime = await RandomSampling.avgBlockTimeInSeconds(); + const blocksToMine = + timeUntil > 0n ? Number(timeUntil / BigInt(avgBlockTime)) + 2 : 2; // Add buffer + for (let i = 0; i < blocksToMine; i++) { + await hre.network.provider.send('evm_mine'); + } + }; + + // Setup common scenario for reward claiming tests + beforeEach(async () => { + delegatorAccount = accounts[1]; + delegatorKey = hre.ethers.keccak256( + hre.ethers.solidityPacked(['address'], [delegatorAccount.address]), + ); + + // Dependencies for setup + deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + ParametersStorage, + RandomSampling, + RandomSamplingStorage, + EpochStorage, + Chronos, + StakingStorage, + IdentityStorage, + ShardingTableStorage, + }; + + const nodeAsk = 200000000000000000n; // 0.2 TRAC ask + const nodeStake = (await ParametersStorage.minimumStake()) * 2n; // Stake more than min + const delegatorStake = nodeStake / 10n; // Delegate a tenth of node's stake + + // 1. Setup Node + ({ node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk( + 2, // Account index offset for setup helper + nodeStake, + nodeAsk, + deps, + )); + + // 2. Setup Receiving Nodes + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 3, + await ParametersStorage.minimumStake(), + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + + // 3. Setup Delegator + await Token.mint(delegatorAccount.address, delegatorStake * 2n); + await Token.connect(delegatorAccount).approve( + await Staking.getAddress(), + delegatorStake, + ); + await Staking.connect(delegatorAccount).stake( + publishingNodeIdentityId, + delegatorStake, + ); + + // Verify delegation + expect( + await StakingStorage.getDelegatorTotalStake( + publishingNodeIdentityId, + delegatorKey, + ), + ).to.equal(delegatorStake); + + // 3. Create Knowledge Collection (generates fees for rewards) + const kcCreator = getDefaultKCCreator(accounts); + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, // Use predefined merkleRoot + 'test-operation-id', + 10, + 1000, + 10, // epochsDuration + ); + + // 4. Node submits a proof in the current epoch + epochToClaim = await Chronos.getCurrentEpoch(); + + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + let challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + let chunks = kcTools.splitIntoChunks(quads, 32); + let challengeChunk = chunks[challenge.chunkId]; + const { proof } = kcTools.calculateMerkleProof( + quads, + 32, + Number(challenge.chunkId), + ); + await RandomSampling.connect(publishingNode.operational).submitProof( + challengeChunk, + proof, + ); + + // Verify proof was counted + expect( + await RandomSamplingStorage.getEpochNodeValidProofsCount( + epochToClaim, + publishingNodeIdentityId, + ), + ).to.equal(1n); + + // Advance to the next proofing period + const proofingPeriodDurationInBlocks = + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + for (let i = 0; i < Number(proofingPeriodDurationInBlocks); i++) { + await hre.network.provider.send('evm_mine'); + } + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + chunks = kcTools.splitIntoChunks(quads, 32); + challengeChunk = chunks[challenge.chunkId]; + const { proof: proof2 } = kcTools.calculateMerkleProof( + quads, + 32, + Number(challenge.chunkId), + ); + await RandomSampling.connect(publishingNode.operational).submitProof( + challengeChunk, + proof2, + ); + + // 5. Advance time past the epoch and finalize it + await advanceToNextEpoch(); // Advance to epoch + 1 + await advanceToNextEpoch(); // Advance to epoch + 2 to ensure epoch is finalizable + + await expect( + RandomSampling.connect(delegatorAccount).claimRewards( + publishingNodeIdentityId, + epochToClaim, + ), + ).to.be.revertedWith('Epoch is not finalized yet'); + + // Create another KC to initialize the lazy finalization + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + ); + + // Check finalization (using pool 1 as per RandomSampling logic) + expect( + await EpochStorage.lastFinalizedEpoch(1), + 'Epoch should be finalized', + ).to.be.gte(epochToClaim); + }); + + it('Should allow a delegator to successfully claim their rewards', async () => { + // Arrange + const expectedReward = await RandomSampling.connect( + delegatorAccount, + ).getDelegatorEpochRewardsAmount(publishingNodeIdentityId, epochToClaim); + expect(expectedReward).to.be.greaterThan( + 0n, + 'Expected reward should be positive', + ); + + const delegatorInitialBalance = await Token.balanceOf( + delegatorAccount.address, + ); + const stakingStorageInitialBalance = await Token.balanceOf( + await StakingStorage.getAddress(), + ); + + // Act + const claimTx = await RandomSampling.connect( + delegatorAccount, + ).claimRewards(publishingNodeIdentityId, epochToClaim); + await claimTx.wait(); + + // Assert + // 1. Event Emission + await expect(claimTx) + .to.emit(RandomSampling, 'RewardsClaimed') + .withArgs( + publishingNodeIdentityId, + epochToClaim, + delegatorAccount.address, + expectedReward, + ); + + // 2. Balance Check + const delegatorFinalBalance = await Token.balanceOf( + delegatorAccount.address, + ); + const stakingStorageFinalBalance = await Token.balanceOf( + await StakingStorage.getAddress(), + ); + expect(delegatorFinalBalance).to.equal( + delegatorInitialBalance + expectedReward, + ); + expect(stakingStorageFinalBalance).to.equal( + stakingStorageInitialBalance - expectedReward, + ); + + // 3. Claim Status Update + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect( + await RandomSamplingStorage.getEpochNodeDelegatorRewardsClaimed( + epochToClaim, + publishingNodeIdentityId, + delegatorKey, + ), + ).to.be.true; + }); + + it('Should revert if the epoch to claim is not yet over', async () => { + // Arrange: Need a scenario where epoch is *not* over. Let's setup again without advancing time. + await hre.deployments.fixture(['RandomSampling']); // Redeploy for clean state relative to time + ({ + accounts, + IdentityStorage, + StakingStorage, + ProfileStorage, + EpochStorage, + Chronos, + AskStorage, + DelegatorsInfo, + Profile, + Hub, + RandomSampling, + RandomSamplingStorage, + ParanetKnowledgeMinersRegistry, + ParanetKnowledgeCollectionsRegistry, + Staking, + ShardingTableStorage, + ShardingTable, + ParametersStorage, + Ask, + Token, + KnowledgeCollection, + } = await loadFixture(deployRandomSamplingFixture)); // Reload all contracts + + // Redo minimal setup for node and KC within the current epoch + publishingNode = { operational: accounts[1], admin: accounts[1] }; + delegatorAccount = accounts[2]; + deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + ParametersStorage, + RandomSampling, + RandomSamplingStorage, + EpochStorage, + Chronos, + StakingStorage, + IdentityStorage, + ShardingTableStorage, + }; + const nodeStake = await ParametersStorage.minimumStake(); + const nodeAsk = 200000000000000000n; // 0.2 TRAC ask + + ({ identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, nodeStake, nodeAsk, deps)); + + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 3, + await ParametersStorage.minimumStake(), + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + + const kcCreator = getDefaultKCCreator(accounts); + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + 'test-operation-id', + 10, + 1000, + 10, + ); + const currentEpoch = await Chronos.getCurrentEpoch(); + + // Act & Assert + await expect( + RandomSampling.connect(delegatorAccount).claimRewards( + publishingNodeIdentityId, + currentEpoch, // Try claiming for the *current*, not-yet-over epoch + ), + ).to.be.revertedWith('Epoch is not over yet'); + }); + + it('Should revert if rewards have already been claimed', async () => { + // Arrange: Claim rewards once successfully first + const expectedReward = await RandomSampling.connect( + delegatorAccount, + ).getDelegatorEpochRewardsAmount(publishingNodeIdentityId, epochToClaim); + expect(expectedReward).to.be.greaterThan(0n); + await RandomSampling.connect(delegatorAccount).claimRewards( + publishingNodeIdentityId, + epochToClaim, + ); + + // Verify claimed status + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect( + await RandomSamplingStorage.getEpochNodeDelegatorRewardsClaimed( + epochToClaim, + publishingNodeIdentityId, + delegatorKey, + ), + ).to.be.true; + + // Act & Assert: Try claiming again + await expect( + RandomSampling.connect(delegatorAccount).claimRewards( + publishingNodeIdentityId, + epochToClaim, + ), + ).to.be.revertedWith('Rewards already claimed'); + }); + + it('Should revert if the delegator has no rewards to claim for the epoch (e.g., node submitted no proofs)', async () => { + const nodeStake = await ParametersStorage.minimumStake(); + const nodeAsk = 200000000000000000n; // 0.2 TRAC ask + const delegatorStake = nodeStake / 2n; + ({ node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(15, nodeStake, nodeAsk, deps)); + + // Setup receiving nodes + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 20, + await ParametersStorage.minimumStake(), + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + + await Token.connect(accounts[0]).transfer( + delegatorAccount.address, + delegatorStake * 2n, + ); + await Token.connect(delegatorAccount).approve( + await Staking.getAddress(), + delegatorStake, + ); + await Staking.connect(delegatorAccount).stake( + publishingNodeIdentityId, + delegatorStake, + ); + const kcCreator = getDefaultKCCreator(accounts); + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + 'test-operation-id', + 10, + 1000, + 10, + ); + epochToClaim = await Chronos.getCurrentEpoch(); + + // *** Crucially, DO NOT submit proof *** + + // Advance past epoch and finalize + await advanceToNextEpoch(); + await advanceToNextEpoch(); + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + 'test-operation-id', + 10, + 1000, + 10, + ); + + // Verify no proofs were counted + expect( + await RandomSamplingStorage.getEpochNodeValidProofsCount( + epochToClaim, + publishingNodeIdentityId, + ), + ).to.equal(0n); + + // Check expected reward is zero + const expectedReward = await RandomSampling.connect( + delegatorAccount, + ).getDelegatorEpochRewardsAmount(publishingNodeIdentityId, epochToClaim); + expect(expectedReward).to.equal(0n); + + // Act & Assert + await expect( + RandomSampling.connect(delegatorAccount).claimRewards( + publishingNodeIdentityId, + epochToClaim, + ), + ).to.be.revertedWith('No rewards to claim'); + }); + }); }); From f63cdc5a082ed681aa056ab3769443f67877f253 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 29 Apr 2025 14:16:53 +0200 Subject: [PATCH 079/106] Add TRAC fees added to stakingStorage check --- test/integration/RandomSampling.test.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index c1be4dcb..439aae15 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -3,7 +3,7 @@ import { loadFixture } from '@nomicfoundation/hardhat-network-helpers'; // @ts-expect-error: No type definitions available for assertion-tools import { kcTools } from 'assertion-tools'; import { expect } from 'chai'; -import hre from 'hardhat'; +import hre, { ethers } from 'hardhat'; import { RandomSampling, @@ -1739,6 +1739,12 @@ describe('@integration RandomSampling', () => { ), ).to.equal(delegatorStake); + const stakingStorageAmount = await Token.balanceOf( + await StakingStorage.getAddress(), + ); + + const tokenAmount = ethers.parseEther('100'); + // 3. Create Knowledge Collection (generates fees for rewards) const kcCreator = getDefaultKCCreator(accounts); await createKnowledgeCollection( @@ -1753,6 +1759,16 @@ describe('@integration RandomSampling', () => { 10, 1000, 10, // epochsDuration + tokenAmount, + ); + + const stakingStorageAmountAfter = await Token.balanceOf( + await StakingStorage.getAddress(), + ); + + // Verify that the staking storage received the token amount + expect(stakingStorageAmountAfter).to.equal( + stakingStorageAmount + tokenAmount, ); // 4. Node submits a proof in the current epoch From ac883235aa31794456dd45e1f77ee464c5e0fc80 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 30 Apr 2025 10:45:59 +0200 Subject: [PATCH 080/106] Add delegatorScore > 0 check --- contracts/RandomSampling.sol | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 3e1104b2..5690c018 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -194,11 +194,17 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { // get delegator key bytes32 delegatorKey = keccak256(abi.encodePacked(msg.sender)); + // Check if a delegator has >0 score in the epoch + uint256 delegatorScore = randomSamplingStorage.getEpochNodeDelegatorScore(epoch, identityId, delegatorKey); + require(delegatorScore > 0, "Delegator has no score for the given epoch"); + // make sure the delegator has not claimed the rewards yet - require( - !randomSamplingStorage.getEpochNodeDelegatorRewardsClaimed(epoch, identityId, delegatorKey), - "Rewards already claimed" + bool rewardsClaimed = randomSamplingStorage.getEpochNodeDelegatorRewardsClaimed( + epoch, + identityId, + delegatorKey ); + require(!rewardsClaimed, "Rewards already claimed"); // get rewards amount uint256 rewardAmount = _getDelegatorEpochRewardsAmount(identityId, epoch, msg.sender); From c0dd34380f3d37a1f3e12acb62a4a2de77ebd563 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 30 Apr 2025 11:20:58 +0200 Subject: [PATCH 081/106] change revert to require --- contracts/RandomSampling.sol | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 5690c018..9af2c169 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -396,9 +396,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { uint256 maxNodeProofsInEpoch = chronos.epochLength() / (proofingPeriodDurationInBlocks * avgBlockTimeInSeconds); uint256 allExpectedEpochProofsCount = shardingTableStorage.nodesCount() * maxNodeProofsInEpoch; - if (allExpectedEpochProofsCount == 0) { - revert("All expected epoch proofs count is 0"); - } + require(allExpectedEpochProofsCount > 0, "All expected epoch proofs count must be greater than 0"); bytes32 delegatorKey = keccak256(abi.encodePacked(delegator)); uint256 epochNodeDelegatorScore = randomSamplingStorage.getEpochNodeDelegatorScore( From 3eeb7a88bd40f213ae2b4fc428c94e2b572207e0 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 30 Apr 2025 11:49:12 +0200 Subject: [PATCH 082/106] v8.0.12 testnet release new deployments --- deployments/base_sepolia_test_contracts.json | 20 ++++++++-------- deployments/gnosis_chiado_test_contracts.json | 20 ++++++++-------- deployments/neuroweb_testnet_contracts.json | 24 +++++++++---------- 3 files changed, 32 insertions(+), 32 deletions(-) diff --git a/deployments/base_sepolia_test_contracts.json b/deployments/base_sepolia_test_contracts.json index 787df850..0f706f16 100644 --- a/deployments/base_sepolia_test_contracts.json +++ b/deployments/base_sepolia_test_contracts.json @@ -272,21 +272,21 @@ "deployed": true }, "RandomSamplingStorage": { - "evmAddress": "0x0E4d6dAef761D281f67Bc02D0c55c26305Ffc766", + "evmAddress": "0x56a20e30420E84dD247e2F3Bc0dF35BBEf611cA2", "version": "1.0.0", - "gitBranch": "release/v8.0.7-testnet", - "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", - "deploymentBlock": 24607118, - "deploymentTimestamp": 1744982528388, + "gitBranch": "release/v8.0.12-testnet", + "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", + "deploymentBlock": 25118992, + "deploymentTimestamp": 1746006275989, "deployed": true }, "RandomSampling": { - "evmAddress": "0x1A51F6f5c9c23F08652F4482b299A3529C7597ca", + "evmAddress": "0x0aDa7817F6f99E3110bc0bFb2944A0f5e91FF359", "version": "1.0.0", - "gitBranch": "release/v8.0.7-testnet", - "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", - "deploymentBlock": 24607121, - "deploymentTimestamp": 1744982531809, + "gitBranch": "release/v8.0.12-testnet", + "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", + "deploymentBlock": 25118995, + "deploymentTimestamp": 1746006282587, "deployed": true } } diff --git a/deployments/gnosis_chiado_test_contracts.json b/deployments/gnosis_chiado_test_contracts.json index 5e811bb7..8c07a797 100644 --- a/deployments/gnosis_chiado_test_contracts.json +++ b/deployments/gnosis_chiado_test_contracts.json @@ -272,21 +272,21 @@ "deployed": true }, "RandomSamplingStorage": { - "evmAddress": "0x0E4d6dAef761D281f67Bc02D0c55c26305Ffc766", + "evmAddress": "0x0aDa7817F6f99E3110bc0bFb2944A0f5e91FF359", "version": "1.0.0", - "gitBranch": "release/v8.0.7-testnet", - "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", - "deploymentBlock": 15338147, - "deploymentTimestamp": 1744982791617, + "gitBranch": "release/v8.0.12-testnet", + "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", + "deploymentBlock": 15529899, + "deploymentTimestamp": 1746006388957, "deployed": true }, "RandomSampling": { - "evmAddress": "0x1A51F6f5c9c23F08652F4482b299A3529C7597ca", + "evmAddress": "0xF060fFf3dd7F1B086C433Cf5869b6E1425f138b2", "version": "1.0.0", - "gitBranch": "release/v8.0.7-testnet", - "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", - "deploymentBlock": 15338148, - "deploymentTimestamp": 1744982804147, + "gitBranch": "release/v8.0.12-testnet", + "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", + "deploymentBlock": 15529901, + "deploymentTimestamp": 1746006397631, "deployed": true } } diff --git a/deployments/neuroweb_testnet_contracts.json b/deployments/neuroweb_testnet_contracts.json index d2dc3480..9461b2a1 100644 --- a/deployments/neuroweb_testnet_contracts.json +++ b/deployments/neuroweb_testnet_contracts.json @@ -302,23 +302,23 @@ "deployed": true }, "RandomSamplingStorage": { - "evmAddress": "0x63ec38B6816F2855cAA0Cb735b17Db933a15d11d", - "substrateAddress": "5EMjsczgCPtztnDBmaoAKGHUa1NB9veqR9eHWuTeapkSJ7er", + "evmAddress": "0x12646a90358Cc55d1Eec825a7abEfF59cF2EF6eC", + "substrateAddress": "5EMjsczPrssjMnmPEtKEZ3z8NEUqE5phC64vmvJyGX9VCQAC", "version": "1.0.0", - "gitBranch": "release/v8.0.7-testnet", - "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", - "deploymentBlock": 7194647, - "deploymentTimestamp": 1744983074858, + "gitBranch": "release/v8.0.12-testnet", + "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", + "deploymentBlock": 7346685, + "deploymentTimestamp": 1746006490032, "deployed": true }, "RandomSampling": { - "evmAddress": "0x99aaf878f85A6aD905159c9D1c12BFFc58454501", - "substrateAddress": "5EMjsczry13xcRnpRYdcq4tGJEkYCK5W4pT6JGFc5ja2DmaC", + "evmAddress": "0x9E0BaBb23c37F140254fa60671a14e1582D10AF5", + "substrateAddress": "5EMjsczsqstHxKwLvfrc7a53ZtRxWtg8hm1aoL4vZDXkH16G", "version": "1.0.0", - "gitBranch": "release/v8.0.7-testnet", - "gitCommitHash": "9086d672d83a3d011ad9e0f68c080d91ef69b515", - "deploymentBlock": 7194648, - "deploymentTimestamp": 1744983079796, + "gitBranch": "release/v8.0.12-testnet", + "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", + "deploymentBlock": 7346686, + "deploymentTimestamp": 1746006495168, "deployed": true } } From d3f4e69972bf91f9beee1f4bbf69591c1e2178e8 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Mon, 5 May 2025 11:15:28 +0200 Subject: [PATCH 083/106] Update to new staking --- deployments/base_sepolia_test_contracts.json | 12 ++++++------ deployments/gnosis_chiado_test_contracts.json | 12 ++++++------ deployments/neuroweb_testnet_contracts.json | 14 +++++++------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/deployments/base_sepolia_test_contracts.json b/deployments/base_sepolia_test_contracts.json index 0f706f16..55330c44 100644 --- a/deployments/base_sepolia_test_contracts.json +++ b/deployments/base_sepolia_test_contracts.json @@ -155,12 +155,12 @@ "deployed": true }, "Staking": { - "evmAddress": "0x53206d344C47c4A8b3AACF99273342331928cb06", - "version": "1.0.0", - "gitBranch": "v8-contracts", - "gitCommitHash": "ddb3f9e1ef7c2f9f7ca8554b19fae7d521a5507f", - "deploymentBlock": 19684799, - "deploymentTimestamp": 1735137892397, + "evmAddress": "0x6FA4D9d4BFE4Af84dde2ab37b6B9397D89a3E636", + "version": "1.0.1", + "gitBranch": "feature/random-sampling", + "gitCommitHash": "3eeb7a88bd40f213ae2b4fc428c94e2b572207e0", + "deploymentBlock": 25334008, + "deploymentTimestamp": 1746436308475, "deployed": true }, "Profile": { diff --git a/deployments/gnosis_chiado_test_contracts.json b/deployments/gnosis_chiado_test_contracts.json index 8c07a797..871ba882 100644 --- a/deployments/gnosis_chiado_test_contracts.json +++ b/deployments/gnosis_chiado_test_contracts.json @@ -155,12 +155,12 @@ "deployed": true }, "Staking": { - "evmAddress": "0x379160686f3f31c26BcF0b033374601556cB5f96", - "version": "1.0.0", - "gitBranch": "v8-contracts", - "gitCommitHash": "ddb3f9e1ef7c2f9f7ca8554b19fae7d521a5507f", - "deploymentBlock": 13494293, - "deploymentTimestamp": 1735137944317, + "evmAddress": "0xC2EAbF33d9F44a901251B12515d5e4f75E92831c", + "version": "1.0.1", + "gitBranch": "feature/random-sampling", + "gitCommitHash": "3eeb7a88bd40f213ae2b4fc428c94e2b572207e0", + "deploymentBlock": 15609993, + "deploymentTimestamp": 1746436357435, "deployed": true }, "Profile": { diff --git a/deployments/neuroweb_testnet_contracts.json b/deployments/neuroweb_testnet_contracts.json index 9461b2a1..d99791e4 100644 --- a/deployments/neuroweb_testnet_contracts.json +++ b/deployments/neuroweb_testnet_contracts.json @@ -172,13 +172,13 @@ "deployed": true }, "Staking": { - "evmAddress": "0xF8da4B3BbEBFdEf157BbF4E35A203b41B3F1aca9", - "substrateAddress": "5EMjsd1C3CsC2vPhB8GdqED5kw42tu46VyGhLynXjXVGsE4s", - "version": "1.0.0", - "gitBranch": "main", - "gitCommitHash": "04baf6bee66a9023a60acedf00b82d1152e31a17", - "deploymentBlock": 7064210, - "deploymentTimestamp": 1744106196840, + "evmAddress": "0xC5F6A39480968B8d09315d749375855B550CF5D2", + "substrateAddress": "5EMjsd11qnhgNLT5duwng79dvuj2MZ2FJamu2ij9nLMazEn7", + "version": "1.0.1", + "gitBranch": "feature/random-sampling", + "gitCommitHash": "3eeb7a88bd40f213ae2b4fc428c94e2b572207e0", + "deploymentBlock": 7410137, + "deploymentTimestamp": 1746436405046, "deployed": true }, "Profile": { From 718f8097dfe002ae89ea25740e6a15b769b22791 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 7 May 2025 15:11:20 +0200 Subject: [PATCH 084/106] extract constant in Ask.sol --- contracts/Ask.sol | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/Ask.sol b/contracts/Ask.sol index 11df8577..f550f61f 100644 --- a/contracts/Ask.sol +++ b/contracts/Ask.sol @@ -16,6 +16,8 @@ contract Ask is INamed, IVersioned, ContractStatus, IInitializable { string private constant _NAME = "Ask"; string private constant _VERSION = "1.0.0"; + uint256 public constant ASK_SCALING_FACTOR = 1e18; + AskStorage public askStorage; ShardingTableStorage public shardingTableStorage; ParametersStorage public parametersStorage; @@ -76,9 +78,9 @@ contract Ask is INamed, IVersioned, ContractStatus, IInitializable { } stake = stake > maximumStake ? maximumStake : stake; - uint256 nodeAskScaled = uint256(ps.getAsk(nodeIdentityId)) * 1e18; + uint256 nodeAskScaled = uint256(ps.getAsk(nodeIdentityId)) * ASK_SCALING_FACTOR; if (nodeAskScaled >= askLowerBound && nodeAskScaled <= askUpperBound) { - newWeightedActiveAskSum += (nodeAskScaled / 1e18) * stake; + newWeightedActiveAskSum += (nodeAskScaled / ASK_SCALING_FACTOR) * stake; newTotalActiveStake += stake; } } From f9a27fe39e560294dfaa3035a3977eb52aea9a8f Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 7 May 2025 15:32:55 +0200 Subject: [PATCH 085/106] new Ask abi --- abi/Ask.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/abi/Ask.json b/abi/Ask.json index 24ea9095..53cb3a38 100644 --- a/abi/Ask.json +++ b/abi/Ask.json @@ -26,6 +26,19 @@ "name": "ZeroAddressHub", "type": "error" }, + { + "inputs": [], + "name": "ASK_SCALING_FACTOR", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "askStorage", From 81327252d8e344675ee1922a52abd5362f73bab3 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 7 May 2025 15:39:23 +0200 Subject: [PATCH 086/106] fix staking on gnosis and base testnet --- deployments/base_sepolia_test_contracts.json | 10 +++++----- deployments/gnosis_chiado_test_contracts.json | 10 +++++----- deployments/neuroweb_testnet_contracts.json | 12 ++++++------ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/deployments/base_sepolia_test_contracts.json b/deployments/base_sepolia_test_contracts.json index 55330c44..0c22c7a3 100644 --- a/deployments/base_sepolia_test_contracts.json +++ b/deployments/base_sepolia_test_contracts.json @@ -146,12 +146,12 @@ "deployed": true }, "Ask": { - "evmAddress": "0x55c8d5AB131286Fc09bD586131449756a69C4e8E", + "evmAddress": "0x99aaf878f85A6aD905159c9D1c12BFFc58454501", "version": "1.0.0", - "gitBranch": "v8-contracts", - "gitCommitHash": "ddb3f9e1ef7c2f9f7ca8554b19fae7d521a5507f", - "deploymentBlock": 19684794, - "deploymentTimestamp": 1735137882248, + "gitBranch": "feature/random-sampling", + "gitCommitHash": "f9a27fe39e560294dfaa3035a3977eb52aea9a8f", + "deploymentBlock": 25428283, + "deploymentTimestamp": 1746624858072, "deployed": true }, "Staking": { diff --git a/deployments/gnosis_chiado_test_contracts.json b/deployments/gnosis_chiado_test_contracts.json index 871ba882..d5ba7564 100644 --- a/deployments/gnosis_chiado_test_contracts.json +++ b/deployments/gnosis_chiado_test_contracts.json @@ -146,12 +146,12 @@ "deployed": true }, "Ask": { - "evmAddress": "0xAB454CAC31f29c714dF7d61bbf0EA877889f4c25", + "evmAddress": "0x99aaf878f85A6aD905159c9D1c12BFFc58454501", "version": "1.0.0", - "gitBranch": "v8-contracts", - "gitCommitHash": "ddb3f9e1ef7c2f9f7ca8554b19fae7d521a5507f", - "deploymentBlock": 13494291, - "deploymentTimestamp": 1735137931936, + "gitBranch": "feature/random-sampling", + "gitCommitHash": "f9a27fe39e560294dfaa3035a3977eb52aea9a8f", + "deploymentBlock": 15645173, + "deploymentTimestamp": 1746624945008, "deployed": true }, "Staking": { diff --git a/deployments/neuroweb_testnet_contracts.json b/deployments/neuroweb_testnet_contracts.json index d99791e4..b67c2eb5 100644 --- a/deployments/neuroweb_testnet_contracts.json +++ b/deployments/neuroweb_testnet_contracts.json @@ -162,13 +162,13 @@ "deployed": true }, "Ask": { - "evmAddress": "0x4F823cfFa6b051Fa0321FA2963F4073589A27B54", - "substrateAddress": "5EMjsczc79k5aRA7wb1CLiCy6E51RHLoLTkvDk49iLkJ6BL9", + "evmAddress": "0x16cE77136A6bdf09a622665E8c626C3aE4a9d5D4", + "substrateAddress": "5EMjsczQkBKmabbzKnXMCtmV3RLWkA3Uxoo9WhpPQgcdhKvj", "version": "1.0.0", - "gitBranch": "main", - "gitCommitHash": "04baf6bee66a9023a60acedf00b82d1152e31a17", - "deploymentBlock": 7064209, - "deploymentTimestamp": 1744106191737, + "gitBranch": "feature/random-sampling", + "gitCommitHash": "f9a27fe39e560294dfaa3035a3977eb52aea9a8f", + "deploymentBlock": 7437670, + "deploymentTimestamp": 1746625028380, "deployed": true }, "Staking": { From 9069d5f67cae0591634d7ccf2df0566484d9fb0a Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 7 May 2025 16:04:58 +0200 Subject: [PATCH 087/106] fix same challenge submitted multiple times --- abi/RandomSampling.json | 38 +++++++++++ contracts/RandomSampling.sol | 18 ++++-- test/integration/RandomSampling.test.ts | 84 ++++++++++++++++++++++++- 3 files changed, 134 insertions(+), 6 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index dcd3393f..e7a1ce21 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -182,6 +182,44 @@ "name": "ValidProofSubmitted", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldW1", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newW1", + "type": "uint256" + } + ], + "name": "W1Updated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "oldW2", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newW2", + "type": "uint256" + } + ], + "name": "W2Updated", + "type": "event" + }, { "inputs": [], "name": "SCALING_FACTOR", diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 9af2c169..dab2f722 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -53,6 +53,8 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { event AvgBlockTimeUpdated(uint8 avgBlockTimeInSeconds); event ProofingPeriodDurationInBlocksUpdated(uint8 durationInBlocks); event RewardsClaimed(uint72 indexed identityId, uint256 indexed epoch, address indexed delegator, uint256 amount); + event W1Updated(uint256 oldW1, uint256 newW1); + event W2Updated(uint256 oldW2, uint256 newW2); constructor(address hubAddress, uint8 _avgBlockTimeInSeconds, uint256 _w1, uint256 _w2) ContractStatus(hubAddress) { require(_avgBlockTimeInSeconds > 0, "Average block time in seconds must be greater than 0"); @@ -86,11 +88,15 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { } function setW1(uint256 _w1) external onlyHubOwner { + uint256 oldW1 = w1; w1 = _w1; + emit W1Updated(oldW1, w1); } function setW2(uint256 _w2) external onlyHubOwner { + uint256 oldW2 = w2; w2 = _w2; + emit W2Updated(oldW2, w2); } function setAvgBlockTimeInSeconds(uint8 blockTimeInSeconds) external onlyHubOwner { @@ -123,7 +129,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { nodeChallenge.activeProofPeriodStartBlock == randomSamplingStorage.updateAndGetActiveProofPeriodStartBlock() ) { // Revert if node has already solved the challenge for this period - if (nodeChallenge.solved == true) { + if (nodeChallenge.solved) { revert("The challenge for this proof period has already been solved"); } @@ -140,13 +146,17 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { randomSamplingStorage.setNodeChallenge(identityId, challenge); } - function submitProof(string memory chunk, bytes32[] calldata merkleProof) public { + function submitProof(string memory chunk, bytes32[] calldata merkleProof) external { // Get node identityId uint72 identityId = identityStorage.getIdentityId(msg.sender); // Get node challenge RandomSamplingLib.Challenge memory challenge = randomSamplingStorage.getNodeChallenge(identityId); + if (challenge.solved) { + revert("This challenge has already been solved"); + } + uint256 activeProofPeriodStartBlock = randomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); // verify that the challengeId matches the current challenge @@ -182,7 +192,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { } } - function getDelegatorEpochRewardsAmount(uint72 identityId, uint256 epoch) public view returns (uint256) { + function getDelegatorEpochRewardsAmount(uint72 identityId, uint256 epoch) external view returns (uint256) { return _getDelegatorEpochRewardsAmount(identityId, epoch, msg.sender); } @@ -320,7 +330,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { // 2. Node ask factor calculation // Formula: nodeStake * ((upperAskBound - nodeAsk) / (upperAskBound - lowerAskBound))^2 / 2,000,000 - uint256 nodeAskScaled = uint256(profileStorage.getAsk(identityId)) * 1e18; + uint256 nodeAskScaled = uint256(profileStorage.getAsk(identityId)) * SCALING_FACTOR; (uint256 askLowerBound, uint256 askUpperBound) = askStorage.getAskBounds(); uint256 nodeAskFactor = 0; if (nodeAskScaled <= askUpperBound && nodeAskScaled >= askLowerBound) { diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index 439aae15..298189d3 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -1608,6 +1608,86 @@ describe('@integration RandomSampling', () => { 'This challenge is no longer active', ); }); + + it('Should revert if proof for the same challenge is submitted twice', async () => { + const kcCreator = getDefaultKCCreator(accounts); + const minStake = await ParametersStorage.minimumStake(); + const nodeAsk = 200000000000000000n; // Same as 0.2 ETH + const deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + + const { node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps); + + const receivingNodes = []; + const receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 10, + minStake, + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + ); + + // Update and get the new active proof period + await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + + // Create challenge + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + + // Get the challenge from storage to verify it + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Get chunk from quads + const chunks = kcTools.splitIntoChunks(quads, 32); + const challengeChunk = chunks[challenge.chunkId]; + + // Generate a proof for our challenge chunk + const { proof } = kcTools.calculateMerkleProof( + quads, + 32, + Number(challenge.chunkId), + ); + + // Submit proof + await RandomSampling.connect(publishingNode.operational).submitProof( + challengeChunk, + proof, + ); + + // Submit proof again + const submitTx = RandomSampling.connect( + publishingNode.operational, + ).submitProof(challengeChunk, proof); + + // Expect revert + await expect(submitTx).to.be.revertedWith( + 'This challenge has already been solved', + ); + }); }); describe('Admin Functions', () => { @@ -2031,7 +2111,7 @@ describe('@integration RandomSampling', () => { ).to.be.revertedWith('Rewards already claimed'); }); - it('Should revert if the delegator has no rewards to claim for the epoch (e.g., node submitted no proofs)', async () => { + it('Should revert if the delegator has no score for the given epoch (e.g., node submitted no proofs)', async () => { const nodeStake = await ParametersStorage.minimumStake(); const nodeAsk = 200000000000000000n; // 0.2 TRAC ask const delegatorStake = nodeStake / 2n; @@ -2119,7 +2199,7 @@ describe('@integration RandomSampling', () => { publishingNodeIdentityId, epochToClaim, ), - ).to.be.revertedWith('No rewards to claim'); + ).to.be.revertedWith('Delegator has no score for the given epoch'); }); }); }); From 27d0c760b3ff597709d3f60865b83c9c2292d247 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 8 May 2025 10:13:18 +0200 Subject: [PATCH 088/106] change public to external --- contracts/storage/RandomSamplingStorage.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index 633e7dd6..a66a20a3 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -108,7 +108,7 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, ContractSt return proofPeriodStartBlock - offset * getActiveProofingPeriodDurationInBlocks(); } - function isPendingProofingPeriodDuration() public view returns (bool) { + function isPendingProofingPeriodDuration() external view returns (bool) { return chronos.getCurrentEpoch() < proofingPeriodDurations[proofingPeriodDurations.length - 1].effectiveEpoch; } From c9af784863ee04c6e45347f46c750f37b2cd9f6e Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 8 May 2025 11:40:00 +0200 Subject: [PATCH 089/106] RandomSampling submitProof bugfix deployments --- deployments/base_sepolia_test_contracts.json | 10 +++++----- deployments/gnosis_chiado_test_contracts.json | 10 +++++----- deployments/neuroweb_testnet_contracts.json | 12 ++++++------ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/deployments/base_sepolia_test_contracts.json b/deployments/base_sepolia_test_contracts.json index 0c22c7a3..15706348 100644 --- a/deployments/base_sepolia_test_contracts.json +++ b/deployments/base_sepolia_test_contracts.json @@ -281,12 +281,12 @@ "deployed": true }, "RandomSampling": { - "evmAddress": "0x0aDa7817F6f99E3110bc0bFb2944A0f5e91FF359", + "evmAddress": "0xE0630dbAB710A03BCb35a58c1A5AD76B846beA0B", "version": "1.0.0", - "gitBranch": "release/v8.0.12-testnet", - "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", - "deploymentBlock": 25118995, - "deploymentTimestamp": 1746006282587, + "gitBranch": "feature/random-sampling", + "gitCommitHash": "27d0c760b3ff597709d3f60865b83c9c2292d247", + "deploymentBlock": 25464358, + "deploymentTimestamp": 1746697007978, "deployed": true } } diff --git a/deployments/gnosis_chiado_test_contracts.json b/deployments/gnosis_chiado_test_contracts.json index d5ba7564..6a5bde4a 100644 --- a/deployments/gnosis_chiado_test_contracts.json +++ b/deployments/gnosis_chiado_test_contracts.json @@ -281,12 +281,12 @@ "deployed": true }, "RandomSampling": { - "evmAddress": "0xF060fFf3dd7F1B086C433Cf5869b6E1425f138b2", + "evmAddress": "0xE0630dbAB710A03BCb35a58c1A5AD76B846beA0B", "version": "1.0.0", - "gitBranch": "release/v8.0.12-testnet", - "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", - "deploymentBlock": 15529901, - "deploymentTimestamp": 1746006397631, + "gitBranch": "feature/random-sampling", + "gitCommitHash": "27d0c760b3ff597709d3f60865b83c9c2292d247", + "deploymentBlock": 15658602, + "deploymentTimestamp": 1746697129077, "deployed": true } } diff --git a/deployments/neuroweb_testnet_contracts.json b/deployments/neuroweb_testnet_contracts.json index b67c2eb5..6a9c3904 100644 --- a/deployments/neuroweb_testnet_contracts.json +++ b/deployments/neuroweb_testnet_contracts.json @@ -312,13 +312,13 @@ "deployed": true }, "RandomSampling": { - "evmAddress": "0x9E0BaBb23c37F140254fa60671a14e1582D10AF5", - "substrateAddress": "5EMjsczsqstHxKwLvfrc7a53ZtRxWtg8hm1aoL4vZDXkH16G", + "evmAddress": "0xb7a36895808d90E4A8B9a4996C5cC76c9e129DA3", + "substrateAddress": "5EMjsczxyJnZBr2koPcG45U6udBCdBxJa5f8ovmv9Ua9jC1q", "version": "1.0.0", - "gitBranch": "release/v8.0.12-testnet", - "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", - "deploymentBlock": 7346686, - "deploymentTimestamp": 1746006495168, + "gitBranch": "feature/random-sampling", + "gitCommitHash": "27d0c760b3ff597709d3f60865b83c9c2292d247", + "deploymentBlock": 7448501, + "deploymentTimestamp": 1746697150169, "deployed": true } } From fe9bbabe286d436b0b6408031f70623b677cc818 Mon Sep 17 00:00:00 2001 From: FilipJoksimovic29 <153454929+FilipJoksimovic29@users.noreply.github.com> Date: Mon, 12 May 2025 14:16:23 +0200 Subject: [PATCH 090/106] Unit tests for random sampling and random sampling storage --- .github/workflows/test.yml | 34 + test/helpers/blockchain-helpers.ts | 38 + test/unit/RandomSampling.test.ts | 150 ++++ test/unit/RandomSamplingStorage.test.ts | 1025 +++++++++++++++++++++++ 4 files changed, 1247 insertions(+) create mode 100644 .github/workflows/test.yml create mode 100644 test/helpers/blockchain-helpers.ts create mode 100644 test/unit/RandomSampling.test.ts create mode 100644 test/unit/RandomSamplingStorage.test.ts diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..816f81f4 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,34 @@ +name: Random Sampling Tests + +on: + pull_request: + branches: [ main, feature/random-sampling-unit-tests ] + push: + branches: [ feature/random-sampling-unit-tests ] + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run Random Sampling Tests + run: | + echo "Running RandomSamplingStorage tests..." + npx hardhat test test/unit/RandomSamplingStorage.test.ts + echo "Running RandomSampling tests..." + npx hardhat test test/unit/RandomSampling.test.ts + env: + REPORT_GAS: true + COVERAGE: true \ No newline at end of file diff --git a/test/helpers/blockchain-helpers.ts b/test/helpers/blockchain-helpers.ts new file mode 100644 index 00000000..7da88c8a --- /dev/null +++ b/test/helpers/blockchain-helpers.ts @@ -0,0 +1,38 @@ +import hre from 'hardhat'; + +/** + * Mines a specified number of blocks + * @param blocks Number of blocks to mine + */ +export async function mineBlocks(blocks: number) { + for (let i = 0; i < blocks; i++) { + await hre.network.provider.send("evm_mine"); + } +} + +/** + * Mines blocks until a specific block number is reached + * @param targetBlockNumber Target block number to mine to + */ +export async function mineToBlock(targetBlockNumber: number) { + const currentBlock = await hre.ethers.provider.getBlockNumber(); + if (currentBlock >= targetBlockNumber) { + return; + } + await mineBlocks(targetBlockNumber - currentBlock); +} + +/** + * Mines blocks for a proof period + * @param startBlock Starting block number + * @param randomSamplingStorage RandomSamplingStorage contract instance + * @returns The number of blocks mined + */ +export async function mineProofPeriodBlocks( + startBlock: bigint, + randomSamplingStorage: any +): Promise { + const proofingPeriodDuration = await randomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + await mineBlocks(Number(proofingPeriodDuration)); + return BigInt(proofingPeriodDuration); +} \ No newline at end of file diff --git a/test/unit/RandomSampling.test.ts b/test/unit/RandomSampling.test.ts new file mode 100644 index 00000000..fa11cc2b --- /dev/null +++ b/test/unit/RandomSampling.test.ts @@ -0,0 +1,150 @@ +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { loadFixture, time } from '@nomicfoundation/hardhat-network-helpers'; +import { expect } from 'chai'; +import hre from 'hardhat'; + +import { Hub, RandomSampling } from '../../typechain'; + +type RandomSamplingFixture = { + accounts: SignerWithAddress[]; + RandomSampling: RandomSampling; + Hub: Hub; + avgBlockTimeInSeconds: number; + w1: bigint; + w2: bigint; +}; + +describe('@unit RandomSampling', () => { + let accounts: SignerWithAddress[]; + let RandomSampling: RandomSampling; + let Hub: Hub; + let avgBlockTimeInSeconds: number; + let w1: bigint; + let w2: bigint; + + async function deployRandomSamplingFixture(): Promise { + await hre.deployments.fixture(['Hub']); + Hub = await hre.ethers.getContract('Hub'); + accounts = await hre.ethers.getSigners(); + + avgBlockTimeInSeconds = 12; + w1 = hre.ethers.parseUnits('1', 18); + w2 = hre.ethers.parseUnits('1', 18); + + const RandomSamplingFactory = await hre.ethers.getContractFactory('RandomSampling'); + RandomSampling = await RandomSamplingFactory.deploy( + Hub.target, // use actual hub address + avgBlockTimeInSeconds, + w1, + w2 + ); + + await Hub.setContractAddress('HubOwner', accounts[0].address); + + return { accounts, RandomSampling, Hub, avgBlockTimeInSeconds, w1, w2 }; + } + + beforeEach(async () => { + ({ accounts, RandomSampling, Hub, avgBlockTimeInSeconds, w1, w2 } = await loadFixture(deployRandomSamplingFixture)); + }); + + describe('constructor', () => { + it('Should set correct initial values', async () => { + // Check initial values set in constructor + expect(await RandomSampling.avgBlockTimeInSeconds()).to.equal(avgBlockTimeInSeconds); + expect(await RandomSampling.w1()).to.equal(w1); + expect(await RandomSampling.w2()).to.equal(w2); + }); + + it('Should revert if avgBlockTimeInSeconds is 0', async () => { + const RandomSamplingFactory = await hre.ethers.getContractFactory('RandomSampling'); + await expect( + RandomSamplingFactory.deploy( + Hub.target, + 0, // avgBlockTimeInSeconds = 0 + w1, + w2 + ) + ).to.be.revertedWith('Average block time in seconds must be greater than 0'); + }); + + it('Should set correct Hub reference', async () => { + // Check that Hub reference is set correctly + const hubAddress = await RandomSampling.hub(); + expect(hubAddress).to.equal(Hub.target); + }); + }); + + describe('name()', () => { + it('Should return correct name', async () => { + expect(await RandomSampling.name()).to.equal('RandomSampling'); + }); + }); + + describe('version()', () => { + it('Should return correct version', async () => { + expect(await RandomSampling.version()).to.equal('1.0.0'); + }); + }); + + describe('setProofingPeriodDurationInBlocks()', () => { + it('Should revert if durationInBlocks is 0', async () => { + await expect( + RandomSampling.setProofingPeriodDurationInBlocks(0) + ).to.be.revertedWith('Duration in blocks must be greater than 0'); + }); + }); + + describe('setW1() and W1 getter', () => { + it('Should update W1 correctly and revert for non-owners', async () => { + // Test successful update by owner (accounts[0] is set as Hub owner in fixture) + const newW1 = hre.ethers.parseUnits('2', 18); + const oldW1 = await RandomSampling.w1(); + const tx = RandomSampling.setW1(newW1); + await expect(tx).to.emit(RandomSampling, 'W1Updated').withArgs(oldW1, newW1); + expect(await RandomSampling.w1()).to.equal(newW1); + + // Test revert for non-owner (accounts[1] is not the Hub owner) + await expect(RandomSampling.connect(accounts[1]).setW1(newW1)) + .to.be.revertedWithCustomError(RandomSampling, 'UnauthorizedAccess') + .withArgs('Only Hub Owner'); + }); + }); + + describe('setW2() and W2 getter', () => { + it('Should update W2 correctly and revert for non-owners', async () => { + // Test successful update by owner (accounts[0] is set as Hub owner in fixture) + const newW2 = hre.ethers.parseUnits('3', 18); + const oldW2 = await RandomSampling.w2(); + const tx = RandomSampling.setW2(newW2); + await expect(tx).to.emit(RandomSampling, 'W2Updated').withArgs(oldW2, newW2); + expect(await RandomSampling.w2()).to.equal(newW2); + + // Test revert for non-owner (accounts[1] is not the Hub owner) + await expect(RandomSampling.connect(accounts[1]).setW2(newW2)) + .to.be.revertedWithCustomError(RandomSampling, 'UnauthorizedAccess') + .withArgs('Only Hub Owner'); + }); + }); + + describe('setAvgBlockTimeInSeconds()', () => { + it('Should update avgBlockTimeInSeconds and revert for non-owners', async () => { + // Test successful update by owner (accounts[0] is set as Hub owner in fixture) + const newAvg = 15; + await expect(RandomSampling.setAvgBlockTimeInSeconds(newAvg)) + .to.emit(RandomSampling, 'AvgBlockTimeUpdated') + .withArgs(newAvg); + expect(await RandomSampling.avgBlockTimeInSeconds()).to.equal(newAvg); + + // Test revert for non-owner (accounts[1] is not the Hub owner) + await expect(RandomSampling.connect(accounts[1]).setAvgBlockTimeInSeconds(newAvg)) + .to.be.revertedWithCustomError(RandomSampling, 'UnauthorizedAccess') + .withArgs('Only Hub Owner'); + }); + + it('Should revert if blockTimeInSeconds is 0', async () => { + await expect(RandomSampling.setAvgBlockTimeInSeconds(0)) + .to.be.revertedWith('Block time in seconds must be greater than 0'); + }); + }); +}); \ No newline at end of file diff --git a/test/unit/RandomSamplingStorage.test.ts b/test/unit/RandomSamplingStorage.test.ts new file mode 100644 index 00000000..34f03346 --- /dev/null +++ b/test/unit/RandomSamplingStorage.test.ts @@ -0,0 +1,1025 @@ +import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; +import { loadFixture, time } from '@nomicfoundation/hardhat-network-helpers'; +import { expect } from 'chai'; +import hre, { ethers } from 'hardhat'; + +import parameters from '../../deployments/parameters.json'; +import { + Hub, + RandomSamplingStorage, + Chronos, + KnowledgeCollectionStorage, + RandomSampling, +} from '../../typechain'; +import { RandomSamplingLib } from '../../typechain/contracts/storage/RandomSamplingStorage'; +import { mineBlocks, mineProofPeriodBlocks } from '../../test/helpers/blockchain-helpers'; + +// Helper functions for random sampling +async function createMockChallenge( + randomSamplingStorage: RandomSamplingStorage, + knowledgeCollectionStorage: KnowledgeCollectionStorage, + chronos: Chronos +): Promise { + const currentEpoch = await chronos.getCurrentEpoch(); + await randomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + const { activeProofPeriodStartBlock } = await randomSamplingStorage.getActiveProofPeriodStatus(); + const proofingPeriodDuration = await randomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + + return { + knowledgeCollectionId: 1n, + chunkId: 1n, + knowledgeCollectionStorageContract: await knowledgeCollectionStorage.getAddress(), + epoch: currentEpoch, + activeProofPeriodStartBlock, + proofingPeriodDurationInBlocks: proofingPeriodDuration, + solved: false + }; +} + +type RandomStorageFixture = { + accounts: SignerWithAddress[]; + RandomSamplingStorage: RandomSamplingStorage; + Hub: Hub; + Chronos: Chronos; +}; + +const PANIC_ARITHMETIC_OVERFLOW = 0x11; + +describe('@unit RandomSamplingStorage', function () { + let Hub: Hub; + let RandomSamplingStorage: RandomSamplingStorage; + let RandomSampling: RandomSampling; + let Chronos: Chronos; + let KnowledgeCollectionStorage: KnowledgeCollectionStorage; + let MockChallenge: RandomSamplingLib.ChallengeStruct; + let accounts: SignerWithAddress[]; + + const proofingPeriodDurationInBlocks = + parameters.development.RandomSamplingStorage.hardhat.proofingPeriodDurationInBlocks; + + async function deployRandomSamplingFixture(): Promise { + await hre.deployments.fixture([ + 'Token', + 'ParanetKnowledgeCollectionsRegistry', + 'ParanetKnowledgeMinersRegistry', + 'KnowledgeCollectionStorage', + 'KnowledgeCollection', + 'RandomSamplingStorage', + 'RandomSampling', + 'ShardingTableStorage', + 'EpochStorage', + 'Profile', + ]); + + Hub = await hre.ethers.getContract('Hub'); + accounts = await ethers.getSigners(); + Chronos = await hre.ethers.getContract('Chronos'); + RandomSamplingStorage = await hre.ethers.getContract( + 'RandomSamplingStorage', + ); + RandomSampling = + await hre.ethers.getContract('RandomSampling'); + KnowledgeCollectionStorage = + await hre.ethers.getContract( + 'KnowledgeCollectionStorage', + ); + + await Hub.setContractAddress('HubOwner', accounts[0].address); + + return { accounts, RandomSamplingStorage, Hub, Chronos }; + } + + async function updateAndGetActiveProofPeriod() { + const tx = await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + await tx.wait(); + return await RandomSamplingStorage.getActiveProofPeriodStatus(); + } + + beforeEach(async () => { + hre.helpers.resetDeploymentsJson(); + ({ RandomSamplingStorage, Chronos } = await loadFixture( + deployRandomSamplingFixture, + )); + + MockChallenge = await createMockChallenge( + RandomSamplingStorage, + KnowledgeCollectionStorage, + Chronos, + ); + }); + + describe('Scoring System', () => { + it('Should increment and get epoch node valid proofs count', async () => { + const nodeId = 1n; + const signer = await ethers.getSigner(accounts[0].address); + const currentEpoch = await Chronos.getCurrentEpoch(); + const epochLength = await Chronos.epochLength(); + + // Test initial state + const initialCount = await RandomSamplingStorage.getEpochNodeValidProofsCount( + currentEpoch, + nodeId + ); + expect(initialCount).to.equal(0n, 'Should start with 0 proofs'); + + // Test incrementing in current epoch + await RandomSamplingStorage.connect(signer).incrementEpochNodeValidProofsCount( + currentEpoch, + nodeId + ); + const countAfterIncrement = await RandomSamplingStorage.getEpochNodeValidProofsCount( + currentEpoch, + nodeId + ); + expect(countAfterIncrement).to.equal(1n, 'Should increment to 1'); + + // Test multiple increments + await RandomSamplingStorage.connect(signer).incrementEpochNodeValidProofsCount( + currentEpoch, + nodeId + ); + const countAfterMultiple = await RandomSamplingStorage.getEpochNodeValidProofsCount( + currentEpoch, + nodeId + ); + expect(countAfterMultiple).to.equal(2n, 'Should increment to 2'); + + // Move to next epoch properly + await time.increase(Number(epochLength)); + const nextEpoch = await Chronos.getCurrentEpoch(); + expect(nextEpoch).to.equal(currentEpoch + 1n, 'Should be in next epoch'); + + // Test in next epoch + await RandomSamplingStorage.connect(signer).incrementEpochNodeValidProofsCount( + nextEpoch, + nodeId + ); + const nextEpochCount = await RandomSamplingStorage.getEpochNodeValidProofsCount( + nextEpoch, + nodeId + ); + expect(nextEpochCount).to.equal(1n, 'Should start at 1 in new epoch'); + expect(await RandomSamplingStorage.getEpochNodeValidProofsCount(currentEpoch, nodeId)) + .to.equal(2n, 'Previous epoch count should remain unchanged'); + }); + + it('Should add to node score and get node score', async () => { + const nodeIds = [1n, 2n, 3n]; + const signer = await ethers.getSigner(accounts[0].address); + const currentEpoch = await Chronos.getCurrentEpoch(); + const proofPeriodIndex = 1n; + + // Test initial state for all nodes + for (const nodeId of nodeIds) { + expect(await RandomSamplingStorage.getNodeEpochProofPeriodScore( + nodeId, + currentEpoch, + proofPeriodIndex + )).to.equal(0n, `Node ${nodeId} should start with 0 score`); + } + expect(await RandomSamplingStorage.allNodesEpochProofPeriodScore( + currentEpoch, + proofPeriodIndex + )).to.equal(0n, 'Global score should start at 0'); + + // Add scores to different nodes + const scores = [100n, 200n, 300n]; + let expectedGlobalScore = 0n; + + for (let i = 0; i < nodeIds.length; i++) { + const nodeId = nodeIds[i]; + const score = scores[i]; + expectedGlobalScore += score; + + // Add score to node + await RandomSamplingStorage.connect(signer).addToNodeScore( + currentEpoch, + proofPeriodIndex, + nodeId, + score + ); + + // Verify individual node score + const nodeScore = await RandomSamplingStorage.getNodeEpochProofPeriodScore( + nodeId, + currentEpoch, + proofPeriodIndex + ); + expect(nodeScore).to.equal(score, + `Node ${nodeId} should have score ${score}`); + + // Verify global score + const globalScore = await RandomSamplingStorage.allNodesEpochProofPeriodScore( + currentEpoch, + proofPeriodIndex + ); + expect(globalScore).to.equal(expectedGlobalScore, + `Global score should be ${expectedGlobalScore} after adding ${score} to node ${nodeId}`); + } + + // Test adding more score to existing node + const additionalScore = 50n; + await RandomSamplingStorage.connect(signer).addToNodeScore( + currentEpoch, + proofPeriodIndex, + nodeIds[0], + additionalScore + ); + + // Verify updated individual score + const updatedNodeScore = await RandomSamplingStorage.getNodeEpochProofPeriodScore( + nodeIds[0], + currentEpoch, + proofPeriodIndex + ); + expect(updatedNodeScore).to.equal(scores[0] + additionalScore, + 'Node score should be updated with additional score'); + + // Verify updated global score + const updatedGlobalScore = await RandomSamplingStorage.allNodesEpochProofPeriodScore( + currentEpoch, + proofPeriodIndex + ); + expect(updatedGlobalScore).to.equal(expectedGlobalScore + additionalScore, + 'Global score should be updated with additional score'); + }); + + it('Should accumulate delegator scores correctly', async () => { + const publishingNodeIdentityId = 1n; + const signer = await ethers.getSigner(accounts[0].address); + const currentEpoch = await Chronos.getCurrentEpoch(); + const delegatorKey = ethers.encodeBytes32String('delegator1'); + const score = 100n; + + // Test initial state + expect(await RandomSamplingStorage.getEpochNodeDelegatorScore( + currentEpoch, + publishingNodeIdentityId, + delegatorKey + )).to.equal(0n); + + // Add score and verify accumulation + await RandomSamplingStorage.connect(signer).addToEpochNodeDelegatorScore( + currentEpoch, + publishingNodeIdentityId, + delegatorKey, + score + ); + expect(await RandomSamplingStorage.getEpochNodeDelegatorScore( + currentEpoch, + publishingNodeIdentityId, + delegatorKey + )).to.equal(score); + + // Add more score and verify accumulation + await RandomSamplingStorage.connect(signer).addToEpochNodeDelegatorScore( + currentEpoch, + publishingNodeIdentityId, + delegatorKey, + score + ); + expect(await RandomSamplingStorage.getEpochNodeDelegatorScore( + currentEpoch, + publishingNodeIdentityId, + delegatorKey + )).to.equal(score * 2n); + }); + }); + + describe('Initialization', () => { + it('Should have correct name and version', async () => { + expect(await RandomSamplingStorage.name()).to.equal('RandomSamplingStorage'); + expect(await RandomSamplingStorage.version()).to.equal('1.0.0'); + }); + + it('Should set the initial parameters correctly', async function () { + const proofingPeriod = await RandomSamplingStorage.proofingPeriodDurations(0); + expect(proofingPeriod.durationInBlocks).to.equal(proofingPeriodDurationInBlocks); + const currentEpochTx = await Chronos.getCurrentEpoch(); + const currentEpoch = BigInt(currentEpochTx.toString()); + expect(proofingPeriod.effectiveEpoch).to.equal(currentEpoch); + }); + + it('Should set correct Chronos reference and epoch on initialize', async () => { + const currentEpoch = await Chronos.getCurrentEpoch(); + await RandomSamplingStorage.initialize(); + const proofingPeriod = await RandomSamplingStorage.proofingPeriodDurations(0); + expect(proofingPeriod.effectiveEpoch).to.equal(currentEpoch); + }); + + it('Should only apply latest epoch on multiple initialize calls', async () => { + const currentEpoch = await Chronos.getCurrentEpoch(); + + // First initialization + await RandomSamplingStorage.initialize(); + const firstProofingPeriod = await RandomSamplingStorage.proofingPeriodDurations(0); + expect(firstProofingPeriod.effectiveEpoch).to.equal(currentEpoch); + + // Move to next epoch + await time.increase(Number(await Chronos.epochLength())); + const nextEpoch = await Chronos.getCurrentEpoch(); + + // Add a new duration before second initialization + const newDuration = 1000; + await RandomSampling.setProofingPeriodDurationInBlocks(newDuration); + + // Second initialization + await RandomSamplingStorage.initialize(); + + // Verify durations are preserved + const firstDuration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(currentEpoch); + const secondDuration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(nextEpoch); + + expect(firstDuration).to.equal(firstProofingPeriod.durationInBlocks); + expect(secondDuration).to.be.equal(BigInt(newDuration)); + }); + + it('Should set correct initial values', async () => { + // Deploy a new instance to check initial values before initialization + const RandomSamplingStorageFactory = await hre.ethers.getContractFactory('RandomSamplingStorage'); + const newRandomSamplingStorage = await RandomSamplingStorageFactory.deploy( + Hub.target, + proofingPeriodDurationInBlocks + ); + + // Check initial proofing period duration + const initialDuration = await newRandomSamplingStorage.proofingPeriodDurations(0); + expect(initialDuration.durationInBlocks).to.equal(proofingPeriodDurationInBlocks); + expect(initialDuration.effectiveEpoch).to.equal(0); // Initially should be 0 + }); + + it('Should update effectiveEpoch to current epoch after initialize', async () => { + const currentEpoch = await Chronos.getCurrentEpoch(); + await RandomSamplingStorage.initialize(); + const initialDuration = await RandomSamplingStorage.proofingPeriodDurations(0); + expect(initialDuration.effectiveEpoch).to.equal(currentEpoch); + }); + + it('Should revert if proofingPeriodDurationInBlocks is 0', async () => { + const RandomSamplingStorageFactory = await hre.ethers.getContractFactory('RandomSamplingStorage'); + await expect( + RandomSamplingStorageFactory.deploy( + Hub.target, + 0 // proofingPeriodDurationInBlocks = 0 + ) + ).to.be.revertedWith('Proofing period duration in blocks must be greater than 0'); + }); + + it('Should set correct CHUNK_BYTE_SIZE constant', async () => { + expect(await RandomSamplingStorage.CHUNK_BYTE_SIZE()).to.equal(32); + }); + }); + + describe('Access Control', () => { + it('Should revert contact call if not called by Hub', async () => { + await expect(RandomSamplingStorage.connect(accounts[1]).initialize()) + .to.be.revertedWithCustomError(RandomSamplingStorage, 'UnauthorizedAccess') + .withArgs('Only Hub'); + }); + + it('Should revert contact call on onlyContract modifiers', async () => { + await expect( + RandomSamplingStorage.connect(accounts[1]).replacePendingProofingPeriodDuration(0, 0) + ) + .to.be.revertedWithCustomError(RandomSamplingStorage, 'UnauthorizedAccess') + .withArgs('Only Contracts in Hub'); + + await expect( + RandomSamplingStorage.connect(accounts[1]).addProofingPeriodDuration(0, 0) + ) + .to.be.revertedWithCustomError(RandomSamplingStorage, 'UnauthorizedAccess') + .withArgs('Only Contracts in Hub'); + + await expect( + RandomSamplingStorage.connect(accounts[1]).setNodeChallenge(0, MockChallenge) + ) + .to.be.revertedWithCustomError(RandomSamplingStorage, 'UnauthorizedAccess') + .withArgs('Only Contracts in Hub'); + + await expect( + RandomSamplingStorage.connect(accounts[1]).incrementEpochNodeValidProofsCount(0, 0) + ) + .to.be.revertedWithCustomError(RandomSamplingStorage, 'UnauthorizedAccess') + .withArgs('Only Contracts in Hub'); + + await expect( + RandomSamplingStorage.connect(accounts[1]).addToNodeScore(0, 0, 0, 0) + ) + .to.be.revertedWithCustomError(RandomSamplingStorage, 'UnauthorizedAccess') + .withArgs('Only Contracts in Hub'); + + await expect( + RandomSamplingStorage.connect(accounts[1]).addToEpochNodeDelegatorScore( + 0, + 0, + ethers.encodeBytes32String('0'), + 0 + ) + ) + .to.be.revertedWithCustomError(RandomSamplingStorage, 'UnauthorizedAccess') + .withArgs('Only Contracts in Hub'); + }); + + it('Should allow access when called by Hub', async () => { + const { RandomSamplingStorage, Hub } = await loadFixture(deployRandomSamplingFixture); + const hubSigner = await Hub.runner; + + // Test initialize + await expect(RandomSamplingStorage.connect(hubSigner).initialize()) + .to.not.be.reverted; + + // Test setNodeChallenge + await expect( + RandomSamplingStorage.connect(hubSigner).setNodeChallenge(0, MockChallenge) + ).to.not.be.reverted; + + // Test replacePendingProofingPeriodDuration + await expect( + RandomSamplingStorage.connect(hubSigner).replacePendingProofingPeriodDuration(0, 0) + ).to.not.be.reverted; + + // Test addProofingPeriodDuration + await expect( + RandomSamplingStorage.connect(hubSigner).addProofingPeriodDuration(0, 0) + ).to.not.be.reverted; + }); + }); + + describe('Proofing Period Management', () => { + it('Should return the correct proofing period status', async () => { + const { activeProofPeriodStartBlock } = await updateAndGetActiveProofPeriod(); + const duration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + + // Initial check + const status = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(status.activeProofPeriodStartBlock).to.be.a('bigint'); + expect(status.isValid).to.be.a('boolean'); + expect(status.isValid).to.be.true; + + // Test at middle of period + const middleBlock = activeProofPeriodStartBlock + (duration / 2n); + await mineBlocks(Number(middleBlock - BigInt(await hre.ethers.provider.getBlockNumber()))); + const middleStatus = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(middleStatus.isValid).to.be.true; + + // Test at end of period + const endBlock = activeProofPeriodStartBlock + duration - 1n; + await mineBlocks(Number(endBlock - BigInt(await hre.ethers.provider.getBlockNumber()))); + const endStatus = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(endStatus.isValid).to.be.true; + + // Test after period ends + await mineBlocks(1); + const afterStatus = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(afterStatus.isValid).to.be.false; + }); + + it('Should update start block correctly for different period scenarios', async () => { + // Test when no period has passed + const { activeProofPeriodStartBlock: initialBlock } = await updateAndGetActiveProofPeriod(); + const statusNoPeriod = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(statusNoPeriod.activeProofPeriodStartBlock).to.equal(initialBlock); + + // Test when 1 full period has passed + const duration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + await mineBlocks(Number(duration)); + const { activeProofPeriodStartBlock: onePeriodBlock } = await updateAndGetActiveProofPeriod(); + expect(onePeriodBlock).to.equal(initialBlock + duration); + + // Test when 2 full periods have passed + await mineBlocks(Number(duration)); + const { activeProofPeriodStartBlock: twoPeriodBlock } = await updateAndGetActiveProofPeriod(); + expect(twoPeriodBlock).to.equal(initialBlock + (duration * 2n)); + + // Test when n full periods have passed (using n=5 as example) + const n = 5; + for (let i = 0; i < n - 2; i++) { + await mineBlocks(Number(duration)); + } + const { activeProofPeriodStartBlock: nPeriodBlock } = await updateAndGetActiveProofPeriod(); + expect(nPeriodBlock).to.equal(initialBlock + (duration * BigInt(n))); + }); + + it('Should return correct historical proofing period start', async () => { + const { activeProofPeriodStartBlock } = await updateAndGetActiveProofPeriod(); + const duration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + + // Test invalid inputs + await expect( + RandomSamplingStorage.getHistoricalProofPeriodStartBlock(0, 1) + ).to.be.revertedWith('Proof period start block must be greater than 0'); + + await expect( + RandomSamplingStorage.getHistoricalProofPeriodStartBlock(100, 0) + ).to.be.revertedWith('Offset must be greater than 0'); + + await expect( + RandomSamplingStorage.getHistoricalProofPeriodStartBlock(activeProofPeriodStartBlock + 10n, 1) + ).to.be.revertedWith('Proof period start block is not valid'); + + await expect( + RandomSamplingStorage.getHistoricalProofPeriodStartBlock(activeProofPeriodStartBlock, 999) + ).to.be.revertedWithPanic(PANIC_ARITHMETIC_OVERFLOW); + + // Test valid historical blocks + await mineProofPeriodBlocks(activeProofPeriodStartBlock, RandomSamplingStorage); + const { activeProofPeriodStartBlock: newPeriodStartBlock } = await updateAndGetActiveProofPeriod(); + + // Test offset 1 + const onePeriodBack = await RandomSamplingStorage.getHistoricalProofPeriodStartBlock( + newPeriodStartBlock, + 1 + ); + expect(onePeriodBack).to.equal(newPeriodStartBlock - duration); + + // Test offset 2 + const twoPeriodsBack = await RandomSamplingStorage.getHistoricalProofPeriodStartBlock( + newPeriodStartBlock, + 2 + ); + expect(twoPeriodsBack).to.equal(newPeriodStartBlock - (duration * 2n)); + + // Test offset 3 + const threePeriodsBack = await RandomSamplingStorage.getHistoricalProofPeriodStartBlock( + newPeriodStartBlock, + 3 + ); + expect(threePeriodsBack).to.equal(newPeriodStartBlock - (duration * 3n)); + + // Test that returned block is aligned with period start + expect(threePeriodsBack % duration).to.equal(0n, 'Historical block should be aligned with period start'); + }); + + it('Should return correct active proof period', async () => { + const { activeProofPeriodStartBlock, isValid } = await updateAndGetActiveProofPeriod(); + expect(isValid).to.be.equal(true, 'Period should be valid'); + + // Mine blocks up to the last block of the current period + const currentBlock = await hre.ethers.provider.getBlockNumber(); + const blocksToMine = Number(activeProofPeriodStartBlock) + Number(proofingPeriodDurationInBlocks) - currentBlock - 1; + await mineBlocks(blocksToMine); + + let statusAfterUpdate = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(statusAfterUpdate.isValid).to.be.equal(true, 'Period should still be valid'); + + // Mine one more block to reach the end of the period + await mineBlocks(1); + statusAfterUpdate = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(statusAfterUpdate.isValid).to.be.equal(false, 'Period should not be valid'); + + // Update the period and mine blocks for the new period + await updateAndGetActiveProofPeriod(); + const newStatus = await RandomSamplingStorage.getActiveProofPeriodStatus(); + const blocksToMineNew = Number(newStatus.activeProofPeriodStartBlock) + Number(proofingPeriodDurationInBlocks) - (await hre.ethers.provider.getBlockNumber()) - 1; + await mineBlocks(blocksToMineNew); + + statusAfterUpdate = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(statusAfterUpdate.isValid).to.be.equal(true, 'New period should be valid'); + }); + + it('Should pick correct proofing period duration based on epoch', async () => { + const initialDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + const currentEpoch = await Chronos.getCurrentEpoch(); + const epochLength = await Chronos.epochLength(); + + // Test initial duration + expect(initialDuration).to.equal(BigInt(proofingPeriodDurationInBlocks)); + + // Test duration in middle of epoch + await time.increase(Number(epochLength) / 2); + const midEpochDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + expect(midEpochDuration).to.equal(initialDuration, 'Duration should not change mid-epoch'); + + // Set new duration for next epoch + const newDuration = 1000; + await RandomSampling.setProofingPeriodDurationInBlocks(newDuration); + + // Verify duration hasn't changed yet + const beforeEpochEndDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + expect(beforeEpochEndDuration).to.equal(initialDuration, 'Duration should not change before epoch end'); + + // Move to next epoch + await time.increase(Number(epochLength) + 1); + const nextEpochDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + expect(nextEpochDuration).to.equal(BigInt(newDuration), 'Duration should change in next epoch'); + + // Set another duration for future epoch + const futureDuration = 2000; + await RandomSampling.setProofingPeriodDurationInBlocks(futureDuration); + + // Verify current epoch still has previous duration + const currentEpochDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + expect(currentEpochDuration).to.equal(BigInt(newDuration), 'Current epoch should keep previous duration'); + + // Move to future epoch + await time.increase(Number(epochLength)); + const futureEpochDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + expect(futureEpochDuration).to.equal(BigInt(futureDuration), 'Future epoch should have new duration'); + }); + + it('Should return correct proofing period duration based on epoch history', async () => { + const baseDuration = 100; + const testEpochs = 5; // Increased number of epochs for better coverage + const currentEpoch = await Chronos.getCurrentEpoch(); + const epochLength = await Chronos.epochLength(); + + // Set up multiple durations with different effective epochs + const durations = []; + for (let i = 0; i < testEpochs; i++) { + const duration = baseDuration + (i * 100); // Larger increments for clearer testing + durations.push(duration); + await RandomSampling.setProofingPeriodDurationInBlocks(duration); + await time.increase(Number(epochLength)); + } + + const finalEpoch = await Chronos.getCurrentEpoch(); + expect(finalEpoch).to.equal(currentEpoch + BigInt(testEpochs)); + + // Test invalid epoch (before first duration) + await expect( + RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(currentEpoch - 1n) + ).to.be.revertedWith('No applicable duration found'); + + // Test each epoch's duration + for (let i = 0; i < testEpochs; i++) { + const targetEpoch = finalEpoch - BigInt(i); + const expectedDuration = durations[testEpochs - 1 - i]; + + const actual = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(targetEpoch); + expect(actual).to.equal(expectedDuration, + `Epoch ${targetEpoch} should have duration ${expectedDuration}`); + } + + // Test edge case - current epoch + const currentEpochDuration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(finalEpoch); + expect(currentEpochDuration).to.equal(durations[durations.length - 1], + 'Current epoch should have the latest duration'); + + // Test edge case - first epoch with duration + const firstEpochWithDuration = currentEpoch; + const firstEpochDuration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(firstEpochWithDuration); + expect(firstEpochDuration).to.equal(durations[0], + 'First epoch should have the first duration'); + }); + + it('Should return same block when no period has passed', async () => { + const { activeProofPeriodStartBlock: initialBlock } = await updateAndGetActiveProofPeriod(); + + // Mine blocks up to the last block of the current period + const currentBlock = await hre.ethers.provider.getBlockNumber(); + const blocksToMine = Number(initialBlock) + Number(proofingPeriodDurationInBlocks) - currentBlock - 2; + await mineBlocks(blocksToMine); + + const tx = await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + await tx.wait(); + const { activeProofPeriodStartBlock: newBlock } = await RandomSamplingStorage.getActiveProofPeriodStatus(); + + // Should return the same block since we haven't reached the end of the period + expect(newBlock).to.equal(initialBlock); + + // Mine one more block to reach the end of the period + await mineBlocks(1); + + const tx2 = await RandomSamplingStorage.updateAndGetActiveProofPeriodStartBlock(); + await tx2.wait(); + const { activeProofPeriodStartBlock: finalBlock } = await RandomSamplingStorage.getActiveProofPeriodStatus(); + + // Should update the block since we've reached the end of the period + expect(finalBlock).to.be.greaterThan(initialBlock); + }); + + it('Should return correct status for different block numbers', async () => { + const { activeProofPeriodStartBlock } = await updateAndGetActiveProofPeriod(); + const duration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + + // Test at start block + const statusAtStart = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(statusAtStart.isValid).to.be.true; + expect(statusAtStart.activeProofPeriodStartBlock).to.equal(activeProofPeriodStartBlock); + + // Test at middle block + const middleBlock = activeProofPeriodStartBlock + (duration / 2n); + await mineBlocks(Number(middleBlock - BigInt(await hre.ethers.provider.getBlockNumber()))); + const statusAtMiddle = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(statusAtMiddle.isValid).to.be.true; + + // Test at last valid block + const lastValidBlock = activeProofPeriodStartBlock + duration - 1n; + await mineBlocks(Number(lastValidBlock - BigInt(await hre.ethers.provider.getBlockNumber()))); + const statusAtLastValid = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(statusAtLastValid.isValid).to.be.true; + + // Test at first invalid block + await mineBlocks(1); + const statusAtInvalid = await RandomSamplingStorage.getActiveProofPeriodStatus(); + expect(statusAtInvalid.isValid).to.be.false; + }); + }); + + describe('Challenge Handling', () => { + it('Should set and get challenge correctly', async () => { + const publishingNodeIdentityId = 1n; + + const signer = await ethers.getSigner(accounts[0].address); + await RandomSamplingStorage.connect(signer).setNodeChallenge( + publishingNodeIdentityId, + MockChallenge + ); + + const challenge = await RandomSamplingStorage.getNodeChallenge(publishingNodeIdentityId); + + expect(challenge.knowledgeCollectionId).to.be.equal(MockChallenge.knowledgeCollectionId); + expect(challenge.chunkId).to.be.equal(MockChallenge.chunkId); + expect(challenge.epoch).to.be.equal(MockChallenge.epoch); + expect(challenge.proofingPeriodDurationInBlocks).to.be.equal( + MockChallenge.proofingPeriodDurationInBlocks + ); + expect(challenge.activeProofPeriodStartBlock).to.be.equal( + MockChallenge.activeProofPeriodStartBlock + ); + expect(challenge.proofingPeriodDurationInBlocks).to.be.equal( + MockChallenge.proofingPeriodDurationInBlocks + ); + expect(challenge.solved).to.be.equal(MockChallenge.solved); + }); + + it('Should handle multiple challenges and updates correctly', async () => { + const publishingNodeIdentityId = 1n; + + const signer = await ethers.getSigner(accounts[0].address); + + // Test initial state + const initialChallenge = await RandomSamplingStorage.getNodeChallenge(publishingNodeIdentityId); + expect(initialChallenge.solved).to.be.false; + expect(initialChallenge.knowledgeCollectionId).to.be.equal(0n); + + // Set first challenge + await RandomSamplingStorage.connect(signer).setNodeChallenge( + publishingNodeIdentityId, + MockChallenge + ); + + // Verify first challenge + const firstChallenge = await RandomSamplingStorage.getNodeChallenge(publishingNodeIdentityId); + expect(firstChallenge.knowledgeCollectionId).to.be.equal(MockChallenge.knowledgeCollectionId); + expect(firstChallenge.solved).to.be.equal(MockChallenge.solved); + + // Create and set second challenge + const secondChallenge = { + ...MockChallenge, + knowledgeCollectionId: BigInt(MockChallenge.knowledgeCollectionId) + 1n, + solved: true + }; + await RandomSamplingStorage.connect(signer).setNodeChallenge( + publishingNodeIdentityId, + secondChallenge + ); + + // Verify second challenge overwrote first + const finalChallenge = await RandomSamplingStorage.getNodeChallenge(publishingNodeIdentityId); + expect(finalChallenge.knowledgeCollectionId).to.be.equal(secondChallenge.knowledgeCollectionId); + expect(finalChallenge.solved).to.be.true; + expect(finalChallenge.chunkId).to.be.equal(secondChallenge.chunkId); + }); + }); + + describe('Proofing Period Duration Management', () => { + it('Should correctly track pending proofing period duration', async () => { + const currentEpoch = await Chronos.getCurrentEpoch(); + const hubSigner = await Hub.runner; + + // Initially should be false + expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.false; + + // Add a new duration + await RandomSamplingStorage.connect(hubSigner).addProofingPeriodDuration(1000, currentEpoch + 1n); + expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.true; + + // Replace pending duration + await RandomSamplingStorage.connect(hubSigner).replacePendingProofingPeriodDuration(2000, currentEpoch + 1n); + expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.true; + + // Move to next epoch + await time.increase(Number(await Chronos.epochLength())); + expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.false; + }); + + it('Should handle multiple proofing period durations correctly', async () => { + const currentEpoch = await Chronos.getCurrentEpoch(); + const hubSigner = await Hub.runner; + + // Add multiple durations + const durations = [1000, 2000, 3000]; + for (let i = 0; i < durations.length; i++) { + await RandomSamplingStorage.connect(hubSigner).addProofingPeriodDuration( + durations[i], + currentEpoch + BigInt(i + 1) + ); + expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.true; + } + + // Verify durations are set correctly + for (let i = 0; i < durations.length; i++) { + const epoch = currentEpoch + BigInt(i + 1); + const duration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(epoch); + expect(duration).to.equal(BigInt(durations[i])); + } + }); + + it('Should replace pending duration correctly', async () => { + const currentEpoch = await Chronos.getCurrentEpoch(); + const hubSigner = await Hub.runner; + + // Add initial duration + await RandomSamplingStorage.connect(hubSigner).addProofingPeriodDuration(1000, currentEpoch + 1n); + expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.true; + + // Replace with new duration + const newDuration = 2000; + await RandomSamplingStorage.connect(hubSigner).replacePendingProofingPeriodDuration( + newDuration, + currentEpoch + 1n + ); + + // Verify new duration is set + const duration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(currentEpoch + 1n); + expect(duration).to.equal(BigInt(newDuration)); + }); + }); + + describe('Delegator Rewards Management', () => { + it('Should track delegator rewards claimed status correctly', async () => { + const publishingNodeIdentityId = 1n; + const signer = await ethers.getSigner(accounts[0].address); + const currentEpoch = await Chronos.getCurrentEpoch(); + const delegatorKey = ethers.encodeBytes32String('delegator1'); + + // Initially should be false + expect(await RandomSamplingStorage.getEpochNodeDelegatorRewardsClaimed( + currentEpoch, + publishingNodeIdentityId, + delegatorKey + )).to.be.false; + + // Set as claimed + await RandomSamplingStorage.connect(signer).setEpochNodeDelegatorRewardsClaimed( + currentEpoch, + publishingNodeIdentityId, + delegatorKey, + true + ); + + // Verify claimed status + expect(await RandomSamplingStorage.getEpochNodeDelegatorRewardsClaimed( + currentEpoch, + publishingNodeIdentityId, + delegatorKey + )).to.be.true; + + // Set as not claimed + await RandomSamplingStorage.connect(signer).setEpochNodeDelegatorRewardsClaimed( + currentEpoch, + publishingNodeIdentityId, + delegatorKey, + false + ); + + // Verify not claimed status + expect(await RandomSamplingStorage.getEpochNodeDelegatorRewardsClaimed( + currentEpoch, + publishingNodeIdentityId, + delegatorKey + )).to.be.false; + }); + + it('Should handle multiple delegators rewards claimed status', async () => { + const publishingNodeIdentityId = 1n; + const signer = await ethers.getSigner(accounts[0].address); + const currentEpoch = await Chronos.getCurrentEpoch(); + const delegatorKeys = [ + ethers.encodeBytes32String('delegator1'), + ethers.encodeBytes32String('delegator2'), + ethers.encodeBytes32String('delegator3') + ]; + + // Set different statuses for different delegators + for (let i = 0; i < delegatorKeys.length; i++) { + const claimed = i % 2 === 0; // Alternate between true and false + await RandomSamplingStorage.connect(signer).setEpochNodeDelegatorRewardsClaimed( + currentEpoch, + publishingNodeIdentityId, + delegatorKeys[i], + claimed + ); + + // Verify status + expect(await RandomSamplingStorage.getEpochNodeDelegatorRewardsClaimed( + currentEpoch, + publishingNodeIdentityId, + delegatorKeys[i] + )).to.equal(claimed); + } + }); + + it('Should maintain separate claimed status for different epochs', async () => { + const publishingNodeIdentityId = 1n; + const signer = await ethers.getSigner(accounts[0].address); + const currentEpoch = await Chronos.getCurrentEpoch(); + const delegatorKey = ethers.encodeBytes32String('delegator1'); + + // Set claimed status for current epoch + await RandomSamplingStorage.connect(signer).setEpochNodeDelegatorRewardsClaimed( + currentEpoch, + publishingNodeIdentityId, + delegatorKey, + true + ); + + // Move to next epoch + await time.increase(Number(await Chronos.epochLength())); + const nextEpoch = await Chronos.getCurrentEpoch(); + + // Verify current epoch is still claimed + expect(await RandomSamplingStorage.getEpochNodeDelegatorRewardsClaimed( + currentEpoch, + publishingNodeIdentityId, + delegatorKey + )).to.be.true; + + // Verify next epoch is not claimed + expect(await RandomSamplingStorage.getEpochNodeDelegatorRewardsClaimed( + nextEpoch, + publishingNodeIdentityId, + delegatorKey + )).to.be.false; + }); + }); + + describe('Edge Cases', () => { + it('Should revert if no matching duration in blocks found', async () => { + // Get current epoch + const currentEpoch = await Chronos.getCurrentEpoch(); + + // Add a new duration that will be effective in the next epoch + const newDuration = 1000; + await RandomSampling.setProofingPeriodDurationInBlocks(newDuration); + + // Move to next epoch + await time.increase(Number(await Chronos.epochLength())); + + // Try to get duration for an epoch before the first duration was set + await expect( + RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(0n) + ).to.be.revertedWith('No applicable duration found'); + }); + + it('Should handle large number of proofing durations correctly', async () => { + const baseDuration = 100; + const numDurations = 50; // Large number of durations + const currentEpoch = await Chronos.getCurrentEpoch(); + + // Add multiple durations with different epochs + for (let i = 0; i < numDurations; i++) { + const duration = baseDuration + i; + await RandomSamplingStorage.connect(await ethers.getSigner(accounts[0].address)) + .addProofingPeriodDuration(duration, currentEpoch + BigInt(i)); + await time.increase(Number(await Chronos.epochLength())); + } + + // Verify each duration is accessible and correct + for (let i = 0; i < numDurations; i++) { + const targetEpoch = currentEpoch + BigInt(i); + const expectedDuration = baseDuration + i; + const actualDuration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(targetEpoch); + expect(actualDuration).to.equal(expectedDuration); + } + }); + + it('Should only apply latest epoch on multiple initialize calls', async () => { + const currentEpoch = await Chronos.getCurrentEpoch(); + + // First initialization + await RandomSamplingStorage.initialize(); + const firstProofingPeriod = await RandomSamplingStorage.proofingPeriodDurations(0); + expect(firstProofingPeriod.effectiveEpoch).to.equal(currentEpoch); + + // Move to next epoch + await time.increase(Number(await Chronos.epochLength())); + const nextEpoch = await Chronos.getCurrentEpoch(); + + // Add a new duration before second initialization + const newDuration = 1000; + await RandomSampling.setProofingPeriodDurationInBlocks(newDuration); + + // Second initialization + await RandomSamplingStorage.initialize(); + + // Verify durations are preserved + const firstDuration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(currentEpoch); + const secondDuration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(nextEpoch); + + expect(firstDuration).to.equal(firstProofingPeriod.durationInBlocks); + expect(secondDuration).to.be.equal(BigInt(newDuration)); + }); + }); +}); From 69bfe267294de083c0b838e727edf13991b3b422 Mon Sep 17 00:00:00 2001 From: FilipJoksimovic29 <153454929+FilipJoksimovic29@users.noreply.github.com> Date: Tue, 13 May 2025 10:15:20 +0200 Subject: [PATCH 091/106] integration test added to git actions --- .github/workflows/test.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 816f81f4..81c118c5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,9 +2,9 @@ name: Random Sampling Tests on: pull_request: - branches: [ main, feature/random-sampling-unit-tests ] + branches: [ main, feature/random-sampling-unit-tests, feature/random-sampling ] push: - branches: [ feature/random-sampling-unit-tests ] + branches: [ feature/random-sampling-unit-tests, feature/random-sampling ] workflow_dispatch: jobs: @@ -29,6 +29,8 @@ jobs: npx hardhat test test/unit/RandomSamplingStorage.test.ts echo "Running RandomSampling tests..." npx hardhat test test/unit/RandomSampling.test.ts + echo "Running RandomSamplingIntegration tests..." + npx hardhat test test/integration/RandomSampling.test.ts env: REPORT_GAS: true COVERAGE: true \ No newline at end of file From 843e93cb6cd3214228fb338ff02234a44f3861d5 Mon Sep 17 00:00:00 2001 From: FilipJoksimovic29 <153454929+FilipJoksimovic29@users.noreply.github.com> Date: Tue, 13 May 2025 11:55:49 +0200 Subject: [PATCH 092/106] added impersonation of hub instead of fake workaround --- test/unit/RandomSampling.test.ts | 50 +++-- test/unit/RandomSamplingStorage.test.ts | 264 +++++++++++++++++++----- 2 files changed, 246 insertions(+), 68 deletions(-) diff --git a/test/unit/RandomSampling.test.ts b/test/unit/RandomSampling.test.ts index fa11cc2b..f51bc739 100644 --- a/test/unit/RandomSampling.test.ts +++ b/test/unit/RandomSampling.test.ts @@ -33,7 +33,7 @@ describe('@unit RandomSampling', () => { const RandomSamplingFactory = await hre.ethers.getContractFactory('RandomSampling'); RandomSampling = await RandomSamplingFactory.deploy( - Hub.target, // use actual hub address + Hub.target, avgBlockTimeInSeconds, w1, w2 @@ -61,7 +61,7 @@ describe('@unit RandomSampling', () => { await expect( RandomSamplingFactory.deploy( Hub.target, - 0, // avgBlockTimeInSeconds = 0 + 0, w1, w2 ) @@ -69,7 +69,6 @@ describe('@unit RandomSampling', () => { }); it('Should set correct Hub reference', async () => { - // Check that Hub reference is set correctly const hubAddress = await RandomSampling.hub(); expect(hubAddress).to.equal(Hub.target); }); @@ -93,18 +92,31 @@ describe('@unit RandomSampling', () => { RandomSampling.setProofingPeriodDurationInBlocks(0) ).to.be.revertedWith('Duration in blocks must be greater than 0'); }); + + it('Should revert if called by non-contract', async () => { + await expect( + RandomSampling.connect(accounts[1]).setProofingPeriodDurationInBlocks(100) + ).to.be.revertedWithCustomError(RandomSampling, 'UnauthorizedAccess') + .withArgs('Only Contracts in Hub'); + }); }); describe('setW1() and W1 getter', () => { it('Should update W1 correctly and revert for non-owners', async () => { - // Test successful update by owner (accounts[0] is set as Hub owner in fixture) + // Test successful update by owner const newW1 = hre.ethers.parseUnits('2', 18); const oldW1 = await RandomSampling.w1(); - const tx = RandomSampling.setW1(newW1); - await expect(tx).to.emit(RandomSampling, 'W1Updated').withArgs(oldW1, newW1); + + const tx = await RandomSampling.setW1(newW1); + const receipt = await tx.wait(); + + await expect(tx) + .to.emit(RandomSampling, 'W1Updated') + .withArgs(oldW1, newW1); + expect(await RandomSampling.w1()).to.equal(newW1); - // Test revert for non-owner (accounts[1] is not the Hub owner) + // Test revert for non-owner await expect(RandomSampling.connect(accounts[1]).setW1(newW1)) .to.be.revertedWithCustomError(RandomSampling, 'UnauthorizedAccess') .withArgs('Only Hub Owner'); @@ -113,14 +125,20 @@ describe('@unit RandomSampling', () => { describe('setW2() and W2 getter', () => { it('Should update W2 correctly and revert for non-owners', async () => { - // Test successful update by owner (accounts[0] is set as Hub owner in fixture) + // Test successful update by owner const newW2 = hre.ethers.parseUnits('3', 18); const oldW2 = await RandomSampling.w2(); - const tx = RandomSampling.setW2(newW2); - await expect(tx).to.emit(RandomSampling, 'W2Updated').withArgs(oldW2, newW2); + + const tx = await RandomSampling.setW2(newW2); + const receipt = await tx.wait(); + + await expect(tx) + .to.emit(RandomSampling, 'W2Updated') + .withArgs(oldW2, newW2); + expect(await RandomSampling.w2()).to.equal(newW2); - // Test revert for non-owner (accounts[1] is not the Hub owner) + // Test revert for non-owner await expect(RandomSampling.connect(accounts[1]).setW2(newW2)) .to.be.revertedWithCustomError(RandomSampling, 'UnauthorizedAccess') .withArgs('Only Hub Owner'); @@ -129,14 +147,18 @@ describe('@unit RandomSampling', () => { describe('setAvgBlockTimeInSeconds()', () => { it('Should update avgBlockTimeInSeconds and revert for non-owners', async () => { - // Test successful update by owner (accounts[0] is set as Hub owner in fixture) + // Test successful update by owner const newAvg = 15; - await expect(RandomSampling.setAvgBlockTimeInSeconds(newAvg)) + const tx = await RandomSampling.setAvgBlockTimeInSeconds(newAvg); + const receipt = await tx.wait(); + + await expect(tx) .to.emit(RandomSampling, 'AvgBlockTimeUpdated') .withArgs(newAvg); + expect(await RandomSampling.avgBlockTimeInSeconds()).to.equal(newAvg); - // Test revert for non-owner (accounts[1] is not the Hub owner) + // Test revert for non-owner await expect(RandomSampling.connect(accounts[1]).setAvgBlockTimeInSeconds(newAvg)) .to.be.revertedWithCustomError(RandomSampling, 'UnauthorizedAccess') .withArgs('Only Hub Owner'); diff --git a/test/unit/RandomSamplingStorage.test.ts b/test/unit/RandomSamplingStorage.test.ts index 34f03346..1e4b9428 100644 --- a/test/unit/RandomSamplingStorage.test.ts +++ b/test/unit/RandomSamplingStorage.test.ts @@ -14,6 +14,8 @@ import { import { RandomSamplingLib } from '../../typechain/contracts/storage/RandomSamplingStorage'; import { mineBlocks, mineProofPeriodBlocks } from '../../test/helpers/blockchain-helpers'; +const HUNDRED_ETH = ethers.parseEther('100'); + // Helper functions for random sampling async function createMockChallenge( randomSamplingStorage: RandomSamplingStorage, @@ -45,6 +47,25 @@ type RandomStorageFixture = { const PANIC_ARITHMETIC_OVERFLOW = 0x11; +async function impersonateAndFund(contract: any) { + await hre.network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [await contract.getAddress()], + }); + + await hre.network.provider.send("hardhat_setBalance", [ + await contract.getAddress(), + `0x${HUNDRED_ETH.toString(16)}` + ]); +} + +async function stopImpersonate(contract: any) { + await hre.network.provider.request({ + method: 'hardhat_stopImpersonatingAccount', + params: [await contract.getAddress()], + }); +} + describe('@unit RandomSamplingStorage', function () { let Hub: Hub; let RandomSamplingStorage: RandomSamplingStorage; @@ -84,8 +105,6 @@ describe('@unit RandomSamplingStorage', function () { 'KnowledgeCollectionStorage', ); - await Hub.setContractAddress('HubOwner', accounts[0].address); - return { accounts, RandomSamplingStorage, Hub, Chronos }; } @@ -371,6 +390,14 @@ describe('@unit RandomSamplingStorage', function () { }); describe('Access Control', () => { + beforeEach(async () => { + // Check if RandomSampling is already registered + const currentRandomSampling = await Hub.getContractAddress('RandomSampling'); + if (currentRandomSampling !== await RandomSampling.getAddress()) { + await Hub.connect(accounts[0]).setContractAddress('RandomSampling', await RandomSampling.getAddress()); + } + }); + it('Should revert contact call if not called by Hub', async () => { await expect(RandomSamplingStorage.connect(accounts[1]).initialize()) .to.be.revertedWithCustomError(RandomSamplingStorage, 'UnauthorizedAccess') @@ -421,27 +448,70 @@ describe('@unit RandomSamplingStorage', function () { }); it('Should allow access when called by Hub', async () => { - const { RandomSamplingStorage, Hub } = await loadFixture(deployRandomSamplingFixture); - const hubSigner = await Hub.runner; - - // Test initialize - await expect(RandomSamplingStorage.connect(hubSigner).initialize()) - .to.not.be.reverted; + // Initialize with Hub + await impersonateAndFund(Hub); + const hubSigner = await ethers.getSigner(await Hub.getAddress()); + + await expect( + RandomSamplingStorage.connect(hubSigner).initialize() + ).to.not.be.reverted; + + await stopImpersonate(Hub); + + // Test contract-only functions with RandomSampling + await impersonateAndFund(RandomSampling); + const rsSigner = await ethers.getSigner(await RandomSampling.getAddress()); - // Test setNodeChallenge await expect( - RandomSamplingStorage.connect(hubSigner).setNodeChallenge(0, MockChallenge) + RandomSamplingStorage.connect(rsSigner).setNodeChallenge(0, MockChallenge) ).to.not.be.reverted; - // Test replacePendingProofingPeriodDuration await expect( - RandomSamplingStorage.connect(hubSigner).replacePendingProofingPeriodDuration(0, 0) + RandomSamplingStorage.connect(rsSigner).replacePendingProofingPeriodDuration(0, 0) ).to.not.be.reverted; - // Test addProofingPeriodDuration await expect( - RandomSamplingStorage.connect(hubSigner).addProofingPeriodDuration(0, 0) + RandomSamplingStorage.connect(rsSigner).addProofingPeriodDuration(0, 0) ).to.not.be.reverted; + + await stopImpersonate(RandomSampling); + }); + + it('Should allow access when called by registered contract', async () => { + // Test contract-only functions with RandomSampling + await impersonateAndFund(RandomSampling); + const rsSigner = await ethers.getSigner(await RandomSampling.getAddress()); + + await expect( + RandomSamplingStorage.connect(rsSigner).replacePendingProofingPeriodDuration(1000, 1) + ).to.not.be.reverted; + + await expect( + RandomSamplingStorage.connect(rsSigner).addProofingPeriodDuration(1000, 1) + ).to.not.be.reverted; + + await expect( + RandomSamplingStorage.connect(rsSigner).setNodeChallenge(1, MockChallenge) + ).to.not.be.reverted; + + await expect( + RandomSamplingStorage.connect(rsSigner).incrementEpochNodeValidProofsCount(1, 1) + ).to.not.be.reverted; + + await expect( + RandomSamplingStorage.connect(rsSigner).addToNodeScore(1, 1, 1, 1000) + ).to.not.be.reverted; + + await expect( + RandomSamplingStorage.connect(rsSigner).addToEpochNodeDelegatorScore( + 1, + 1, + ethers.encodeBytes32String('test'), + 1000 + ) + ).to.not.be.reverted; + + await stopImpersonate(RandomSampling); }); }); @@ -590,9 +660,28 @@ describe('@unit RandomSamplingStorage', function () { const midEpochDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); expect(midEpochDuration).to.equal(initialDuration, 'Duration should not change mid-epoch'); + // Impersonate RandomSampling + await hre.network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [await RandomSampling.getAddress()], + }); + const rsSigner = await ethers.getSigner(await RandomSampling.getAddress()); + + // Fund the RandomSampling contract + await hre.network.provider.send("hardhat_setBalance", [ + await RandomSampling.getAddress(), + "0x56BC75E2D63100000" // 100 ETH in hex + ]); + // Set new duration for next epoch const newDuration = 1000; - await RandomSampling.setProofingPeriodDurationInBlocks(newDuration); + await RandomSampling.connect(rsSigner).setProofingPeriodDurationInBlocks(newDuration); + + // Stop impersonating RandomSampling + await hre.network.provider.request({ + method: 'hardhat_stopImpersonatingAccount', + params: [await RandomSampling.getAddress()], + }); // Verify duration hasn't changed yet const beforeEpochEndDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); @@ -603,9 +692,28 @@ describe('@unit RandomSamplingStorage', function () { const nextEpochDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); expect(nextEpochDuration).to.equal(BigInt(newDuration), 'Duration should change in next epoch'); + // Impersonate RandomSampling again + await hre.network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [await RandomSampling.getAddress()], + }); + const rsSigner2 = await ethers.getSigner(await RandomSampling.getAddress()); + + // Fund the RandomSampling contract + await hre.network.provider.send("hardhat_setBalance", [ + await RandomSampling.getAddress(), + "0x56BC75E2D63100000" // 100 ETH in hex + ]); + // Set another duration for future epoch const futureDuration = 2000; - await RandomSampling.setProofingPeriodDurationInBlocks(futureDuration); + await RandomSampling.connect(rsSigner2).setProofingPeriodDurationInBlocks(futureDuration); + + // Stop impersonating RandomSampling + await hre.network.provider.request({ + method: 'hardhat_stopImpersonatingAccount', + params: [await RandomSampling.getAddress()], + }); // Verify current epoch still has previous duration const currentEpochDuration = await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); @@ -619,16 +727,37 @@ describe('@unit RandomSamplingStorage', function () { it('Should return correct proofing period duration based on epoch history', async () => { const baseDuration = 100; - const testEpochs = 5; // Increased number of epochs for better coverage + const testEpochs = 5; const currentEpoch = await Chronos.getCurrentEpoch(); const epochLength = await Chronos.epochLength(); // Set up multiple durations with different effective epochs const durations = []; for (let i = 0; i < testEpochs; i++) { - const duration = baseDuration + (i * 100); // Larger increments for clearer testing + const duration = baseDuration + (i * 100); durations.push(duration); - await RandomSampling.setProofingPeriodDurationInBlocks(duration); + + // Impersonate RandomSampling + await hre.network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [await RandomSampling.getAddress()], + }); + const rsSigner = await ethers.getSigner(await RandomSampling.getAddress()); + + // Fund the RandomSampling contract + await hre.network.provider.send("hardhat_setBalance", [ + await RandomSampling.getAddress(), + "0x56BC75E2D63100000" // 100 ETH in hex + ]); + + await RandomSampling.connect(rsSigner).setProofingPeriodDurationInBlocks(duration); + + // Stop impersonating RandomSampling + await hre.network.provider.request({ + method: 'hardhat_stopImpersonatingAccount', + params: [await RandomSampling.getAddress()], + }); + await time.increase(Number(epochLength)); } @@ -786,19 +915,37 @@ describe('@unit RandomSamplingStorage', function () { describe('Proofing Period Duration Management', () => { it('Should correctly track pending proofing period duration', async () => { const currentEpoch = await Chronos.getCurrentEpoch(); - const hubSigner = await Hub.runner; // Initially should be false expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.false; + // Impersonate RandomSampling + await hre.network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [await RandomSampling.getAddress()], + }); + const rsSigner = await ethers.getSigner(await RandomSampling.getAddress()); + + // Fund the RandomSampling contract + await hre.network.provider.send("hardhat_setBalance", [ + await RandomSampling.getAddress(), + "0x56BC75E2D63100000" // 100 ETH in hex + ]); + // Add a new duration - await RandomSamplingStorage.connect(hubSigner).addProofingPeriodDuration(1000, currentEpoch + 1n); + await RandomSamplingStorage.connect(rsSigner).addProofingPeriodDuration(1000, currentEpoch + 1n); expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.true; // Replace pending duration - await RandomSamplingStorage.connect(hubSigner).replacePendingProofingPeriodDuration(2000, currentEpoch + 1n); + await RandomSamplingStorage.connect(rsSigner).replacePendingProofingPeriodDuration(2000, currentEpoch + 1n); expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.true; + // Stop impersonating RandomSampling + await hre.network.provider.request({ + method: 'hardhat_stopImpersonatingAccount', + params: [await RandomSampling.getAddress()], + }); + // Move to next epoch await time.increase(Number(await Chronos.epochLength())); expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.false; @@ -806,18 +953,36 @@ describe('@unit RandomSamplingStorage', function () { it('Should handle multiple proofing period durations correctly', async () => { const currentEpoch = await Chronos.getCurrentEpoch(); - const hubSigner = await Hub.runner; + + // Impersonate RandomSampling + await hre.network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [await RandomSampling.getAddress()], + }); + const rsSigner = await ethers.getSigner(await RandomSampling.getAddress()); + + // Fund the RandomSampling contract + await hre.network.provider.send("hardhat_setBalance", [ + await RandomSampling.getAddress(), + "0x56BC75E2D63100000" // 100 ETH in hex + ]); // Add multiple durations const durations = [1000, 2000, 3000]; for (let i = 0; i < durations.length; i++) { - await RandomSamplingStorage.connect(hubSigner).addProofingPeriodDuration( + await RandomSamplingStorage.connect(rsSigner).addProofingPeriodDuration( durations[i], currentEpoch + BigInt(i + 1) ); expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.true; } + // Stop impersonating RandomSampling + await hre.network.provider.request({ + method: 'hardhat_stopImpersonatingAccount', + params: [await RandomSampling.getAddress()], + }); + // Verify durations are set correctly for (let i = 0; i < durations.length; i++) { const epoch = currentEpoch + BigInt(i + 1); @@ -828,19 +993,37 @@ describe('@unit RandomSamplingStorage', function () { it('Should replace pending duration correctly', async () => { const currentEpoch = await Chronos.getCurrentEpoch(); - const hubSigner = await Hub.runner; + + // Impersonate RandomSampling + await hre.network.provider.request({ + method: 'hardhat_impersonateAccount', + params: [await RandomSampling.getAddress()], + }); + const rsSigner = await ethers.getSigner(await RandomSampling.getAddress()); + + // Fund the RandomSampling contract + await hre.network.provider.send("hardhat_setBalance", [ + await RandomSampling.getAddress(), + "0x56BC75E2D63100000" // 100 ETH in hex + ]); // Add initial duration - await RandomSamplingStorage.connect(hubSigner).addProofingPeriodDuration(1000, currentEpoch + 1n); + await RandomSamplingStorage.connect(rsSigner).addProofingPeriodDuration(1000, currentEpoch + 1n); expect(await RandomSamplingStorage.isPendingProofingPeriodDuration()).to.be.true; // Replace with new duration const newDuration = 2000; - await RandomSamplingStorage.connect(hubSigner).replacePendingProofingPeriodDuration( + await RandomSamplingStorage.connect(rsSigner).replacePendingProofingPeriodDuration( newDuration, currentEpoch + 1n ); + // Stop impersonating RandomSampling + await hre.network.provider.request({ + method: 'hardhat_stopImpersonatingAccount', + params: [await RandomSampling.getAddress()], + }); + // Verify new duration is set const duration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(currentEpoch + 1n); expect(duration).to.equal(BigInt(newDuration)); @@ -994,32 +1177,5 @@ describe('@unit RandomSamplingStorage', function () { expect(actualDuration).to.equal(expectedDuration); } }); - - it('Should only apply latest epoch on multiple initialize calls', async () => { - const currentEpoch = await Chronos.getCurrentEpoch(); - - // First initialization - await RandomSamplingStorage.initialize(); - const firstProofingPeriod = await RandomSamplingStorage.proofingPeriodDurations(0); - expect(firstProofingPeriod.effectiveEpoch).to.equal(currentEpoch); - - // Move to next epoch - await time.increase(Number(await Chronos.epochLength())); - const nextEpoch = await Chronos.getCurrentEpoch(); - - // Add a new duration before second initialization - const newDuration = 1000; - await RandomSampling.setProofingPeriodDurationInBlocks(newDuration); - - // Second initialization - await RandomSamplingStorage.initialize(); - - // Verify durations are preserved - const firstDuration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(currentEpoch); - const secondDuration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(nextEpoch); - - expect(firstDuration).to.equal(firstProofingPeriod.durationInBlocks); - expect(secondDuration).to.be.equal(BigInt(newDuration)); - }); }); }); From 0081c6c779f87b0d350b713373c32d7a18336895 Mon Sep 17 00:00:00 2001 From: FilipJoksimovic29 <153454929+FilipJoksimovic29@users.noreply.github.com> Date: Mon, 19 May 2025 16:17:51 +0200 Subject: [PATCH 093/106] Update test.yml --- .github/workflows/test.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 81c118c5..2b25033a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2,9 +2,11 @@ name: Random Sampling Tests on: pull_request: - branches: [ main, feature/random-sampling-unit-tests, feature/random-sampling ] + branches: + - '*' push: - branches: [ feature/random-sampling-unit-tests, feature/random-sampling ] + branches: + - '*' workflow_dispatch: jobs: @@ -33,4 +35,4 @@ jobs: npx hardhat test test/integration/RandomSampling.test.ts env: REPORT_GAS: true - COVERAGE: true \ No newline at end of file + COVERAGE: true From a2058f17552c15ec56a8e0a7947c69cd6ee7b64e Mon Sep 17 00:00:00 2001 From: FilipJoksimovic29 <153454929+FilipJoksimovic29@users.noreply.github.com> Date: Mon, 19 May 2025 16:19:00 +0200 Subject: [PATCH 094/106] Rename test.yml to random-sampling-test-actions.yml --- .github/workflows/{test.yml => random-sampling-test-actions.yml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{test.yml => random-sampling-test-actions.yml} (100%) diff --git a/.github/workflows/test.yml b/.github/workflows/random-sampling-test-actions.yml similarity index 100% rename from .github/workflows/test.yml rename to .github/workflows/random-sampling-test-actions.yml From abb735aba9d2d8340388894afabac9c028cfb734 Mon Sep 17 00:00:00 2001 From: FilipJoksimovic29 <153454929+FilipJoksimovic29@users.noreply.github.com> Date: Wed, 21 May 2025 10:01:12 +0200 Subject: [PATCH 095/106] Added events emit checks Added events emit checks for: ProofingPeriodDurationAdded PendingProofingPeriodDurationReplaced --- test/unit/RandomSamplingStorage.test.ts | 58 +++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/test/unit/RandomSamplingStorage.test.ts b/test/unit/RandomSamplingStorage.test.ts index 1e4b9428..d08142b6 100644 --- a/test/unit/RandomSamplingStorage.test.ts +++ b/test/unit/RandomSamplingStorage.test.ts @@ -2,6 +2,7 @@ import { SignerWithAddress } from '@nomicfoundation/hardhat-ethers/signers'; import { loadFixture, time } from '@nomicfoundation/hardhat-network-helpers'; import { expect } from 'chai'; import hre, { ethers } from 'hardhat'; +import { EventLog } from 'ethers'; import parameters from '../../deployments/parameters.json'; import { @@ -1028,6 +1029,63 @@ describe('@unit RandomSamplingStorage', function () { const duration = await RandomSamplingStorage.getEpochProofingPeriodDurationInBlocks(currentEpoch + 1n); expect(duration).to.equal(BigInt(newDuration)); }); + + it('Should emit ProofingPeriodDurationAdded event with correct parameters', async () => { + const newDuration = 1000; + const effectiveEpoch = await Chronos.getCurrentEpoch() + 1n; + + // Impersonate RandomSampling + await impersonateAndFund(RandomSampling); + const rsSigner = await ethers.getSigner(await RandomSampling.getAddress()); + + // Add new proofing period duration and capture the event + const tx = await RandomSamplingStorage.connect(rsSigner).addProofingPeriodDuration(newDuration, effectiveEpoch); + const receipt = await tx.wait(); + + // Find the ProofingPeriodDurationAdded event + const event = receipt?.logs.find( + log => (log as EventLog).fragment?.name === 'ProofingPeriodDurationAdded' + ) as EventLog; + + // Verify event parameters + expect(event).to.not.be.undefined; + expect(event?.args).to.not.be.undefined; + expect(event?.args[0]).to.equal(newDuration); + expect(event?.args[1]).to.equal(effectiveEpoch); + + await stopImpersonate(RandomSampling); + }); + + it('Should emit PendingProofingPeriodDurationReplaced event with correct parameters', async () => { + const oldDuration = 1000; + const newDuration = 2000; + const effectiveEpoch = await Chronos.getCurrentEpoch() + 1n; + + // Impersonate RandomSampling + await impersonateAndFund(RandomSampling); + const rsSigner = await ethers.getSigner(await RandomSampling.getAddress()); + + // First add a duration + await RandomSamplingStorage.connect(rsSigner).addProofingPeriodDuration(oldDuration, effectiveEpoch); + + // Then replace it and capture the event + const tx = await RandomSamplingStorage.connect(rsSigner).replacePendingProofingPeriodDuration(newDuration, effectiveEpoch); + const receipt = await tx.wait(); + + // Find the PendingProofingPeriodDurationReplaced event + const event = receipt?.logs.find( + log => (log as EventLog).fragment?.name === 'PendingProofingPeriodDurationReplaced' + ) as EventLog; + + // Verify event parameters + expect(event).to.not.be.undefined; + expect(event?.args).to.not.be.undefined; + expect(event?.args[0]).to.equal(oldDuration); + expect(event?.args[1]).to.equal(newDuration); + expect(event?.args[2]).to.equal(effectiveEpoch); + + await stopImpersonate(RandomSampling); + }); }); describe('Delegator Rewards Management', () => { From a0ea7c826c58b0b21f456c9b64a60787c6cea77d Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 22 May 2025 10:24:45 +0200 Subject: [PATCH 096/106] Make getDelegatorEpochRewardsAmount public --- abi/RandomSampling.json | 5 +++ contracts/RandomSampling.sol | 58 ++++++++++++------------- test/integration/RandomSampling.test.ts | 18 ++++++-- 3 files changed, 47 insertions(+), 34 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index e7a1ce21..ad873777 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -334,6 +334,11 @@ "internalType": "uint256", "name": "epoch", "type": "uint256" + }, + { + "internalType": "address", + "name": "delegator", + "type": "address" } ], "name": "getDelegatorEpochRewardsAmount", diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index dab2f722..ab060d98 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -192,8 +192,32 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { } } - function getDelegatorEpochRewardsAmount(uint72 identityId, uint256 epoch) external view returns (uint256) { - return _getDelegatorEpochRewardsAmount(identityId, epoch, msg.sender); + function getDelegatorEpochRewardsAmount( + uint72 identityId, + uint256 epoch, + address delegator + ) public view returns (uint256) { + uint256 epochNodeValidProofsCount = randomSamplingStorage.getEpochNodeValidProofsCount(epoch, identityId); + + uint256 proofingPeriodDurationInBlocks = randomSamplingStorage.getEpochProofingPeriodDurationInBlocks(epoch); + + uint256 maxNodeProofsInEpoch = chronos.epochLength() / (proofingPeriodDurationInBlocks * avgBlockTimeInSeconds); + + uint256 allExpectedEpochProofsCount = shardingTableStorage.nodesCount() * maxNodeProofsInEpoch; + require(allExpectedEpochProofsCount > 0, "All expected epoch proofs count must be greater than 0"); + + bytes32 delegatorKey = keccak256(abi.encodePacked(delegator)); + uint256 epochNodeDelegatorScore = randomSamplingStorage.getEpochNodeDelegatorScore( + epoch, + identityId, + delegatorKey + ); + uint256 totalEpochTracFees = epochStorage.getEpochPool(1, epoch); + + uint256 reward = ((totalEpochTracFees / 2) * + (w1 * (epochNodeValidProofsCount / allExpectedEpochProofsCount) + w2 * epochNodeDelegatorScore)) / + SCALING_FACTOR ** 2; + return reward; } function claimRewards(uint72 identityId, uint256 epoch) external { @@ -217,7 +241,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { require(!rewardsClaimed, "Rewards already claimed"); // get rewards amount - uint256 rewardAmount = _getDelegatorEpochRewardsAmount(identityId, epoch, msg.sender); + uint256 rewardAmount = getDelegatorEpochRewardsAmount(identityId, epoch, msg.sender); require(rewardAmount > 0, "No rewards to claim"); require(rewardAmount <= type(uint96).max, "Reward amount exceeds uint96"); @@ -393,32 +417,4 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { } } } - - function _getDelegatorEpochRewardsAmount( - uint72 identityId, - uint256 epoch, - address delegator - ) internal view returns (uint256) { - uint256 epochNodeValidProofsCount = randomSamplingStorage.getEpochNodeValidProofsCount(epoch, identityId); - - uint256 proofingPeriodDurationInBlocks = randomSamplingStorage.getEpochProofingPeriodDurationInBlocks(epoch); - - uint256 maxNodeProofsInEpoch = chronos.epochLength() / (proofingPeriodDurationInBlocks * avgBlockTimeInSeconds); - - uint256 allExpectedEpochProofsCount = shardingTableStorage.nodesCount() * maxNodeProofsInEpoch; - require(allExpectedEpochProofsCount > 0, "All expected epoch proofs count must be greater than 0"); - - bytes32 delegatorKey = keccak256(abi.encodePacked(delegator)); - uint256 epochNodeDelegatorScore = randomSamplingStorage.getEpochNodeDelegatorScore( - epoch, - identityId, - delegatorKey - ); - uint256 totalEpochTracFees = epochStorage.getEpochPool(1, epoch); - - uint256 reward = ((totalEpochTracFees / 2) * - (w1 * (epochNodeValidProofsCount / allExpectedEpochProofsCount) + w2 * epochNodeDelegatorScore)) / - SCALING_FACTOR ** 2; - return reward; - } } diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index 298189d3..2cd5322d 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -1936,7 +1936,11 @@ describe('@integration RandomSampling', () => { // Arrange const expectedReward = await RandomSampling.connect( delegatorAccount, - ).getDelegatorEpochRewardsAmount(publishingNodeIdentityId, epochToClaim); + ).getDelegatorEpochRewardsAmount( + publishingNodeIdentityId, + epochToClaim, + delegatorAccount.address, + ); expect(expectedReward).to.be.greaterThan( 0n, 'Expected reward should be positive', @@ -2085,7 +2089,11 @@ describe('@integration RandomSampling', () => { // Arrange: Claim rewards once successfully first const expectedReward = await RandomSampling.connect( delegatorAccount, - ).getDelegatorEpochRewardsAmount(publishingNodeIdentityId, epochToClaim); + ).getDelegatorEpochRewardsAmount( + publishingNodeIdentityId, + epochToClaim, + delegatorAccount.address, + ); expect(expectedReward).to.be.greaterThan(0n); await RandomSampling.connect(delegatorAccount).claimRewards( publishingNodeIdentityId, @@ -2190,7 +2198,11 @@ describe('@integration RandomSampling', () => { // Check expected reward is zero const expectedReward = await RandomSampling.connect( delegatorAccount, - ).getDelegatorEpochRewardsAmount(publishingNodeIdentityId, epochToClaim); + ).getDelegatorEpochRewardsAmount( + publishingNodeIdentityId, + epochToClaim, + delegatorAccount.address, + ); expect(expectedReward).to.equal(0n); // Act & Assert From ab3d18e8a1c8f434675fb15baa68cb3b5071e00d Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 22 May 2025 10:34:32 +0200 Subject: [PATCH 097/106] make calculateNodeScore public --- abi/RandomSampling.json | 19 +++++++++++++++++++ contracts/RandomSampling.sol | 4 ++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/abi/RandomSampling.json b/abi/RandomSampling.json index ad873777..1d1264fb 100644 --- a/abi/RandomSampling.json +++ b/abi/RandomSampling.json @@ -259,6 +259,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + } + ], + "name": "calculateNodeScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "chronos", diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index ab060d98..cc98e97f 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -180,7 +180,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { randomSamplingStorage.incrementEpochNodeValidProofsCount(epoch, identityId); // Calculate node score at this proof period and store it - uint256 score = _calculateNodeScore(identityId); + uint256 score = calculateNodeScore(identityId); randomSamplingStorage.addToNodeScore(epoch, activeProofPeriodStartBlock, identityId, score); // Calculate delegators' scores for the previous proof period and store them @@ -343,7 +343,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { ); } - function _calculateNodeScore(uint72 identityId) private view returns (uint256) { + function calculateNodeScore(uint72 identityId) public view returns (uint256) { // 1. Node stake factor calculation // Formula: nodeStakeFactor = 2 * (nodeStake / 2,000,000)^2 uint96 maximumStake = parametersStorage.maximumStake(); From 01b72351e11a9b45bc82e5a9bea8fe3e9a08610e Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 22 May 2025 11:01:15 +0200 Subject: [PATCH 098/106] Add more metrics to RandomSamplingStorage --- abi/RandomSamplingStorage.json | 258 +++++++++++++++++++- contracts/RandomSampling.sol | 5 +- contracts/storage/RandomSamplingStorage.sol | 51 +++- 3 files changed, 311 insertions(+), 3 deletions(-) diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json index 8c6c2f6b..dd24b6dc 100644 --- a/abi/RandomSamplingStorage.json +++ b/abi/RandomSamplingStorage.json @@ -31,6 +31,155 @@ "name": "ZeroAddressHub", "type": "error" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "proofPeriodStartBlock", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scoreAdded", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalScore", + "type": "uint256" + } + ], + "name": "AllNodesEpochProofPeriodScoreAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scoreAdded", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalScore", + "type": "uint256" + } + ], + "name": "AllNodesEpochScoreAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "delegatorKey", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scoreAdded", + "type": "uint256" + } + ], + "name": "EpochNodeDelegatorScoreAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "proofPeriodStartBlock", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scoreAdded", + "type": "uint256" + } + ], + "name": "NodeEpochProofPeriodScoreAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "scoreAdded", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalScore", + "type": "uint256" + } + ], + "name": "NodeEpochScoreAdded", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -106,6 +255,47 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "proofPeriodStartBlock", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "score", + "type": "uint256" + } + ], + "name": "addToAllNodesEpochProofPeriodScore", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "score", + "type": "uint256" + } + ], + "name": "addToAllNodesEpochScore", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -157,7 +347,30 @@ "type": "uint256" } ], - "name": "addToNodeScore", + "name": "addToNodeEpochProofPeriodScore", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + }, + { + "internalType": "uint256", + "name": "score", + "type": "uint256" + } + ], + "name": "addToNodeEpochScore", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -186,6 +399,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allNodesEpochScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "chronos", @@ -646,6 +878,30 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint72", + "name": "", + "type": "uint72" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "nodeEpochScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index cc98e97f..a8830031 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -181,7 +181,10 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { // Calculate node score at this proof period and store it uint256 score = calculateNodeScore(identityId); - randomSamplingStorage.addToNodeScore(epoch, activeProofPeriodStartBlock, identityId, score); + randomSamplingStorage.addToNodeEpochProofPeriodScore(epoch, activeProofPeriodStartBlock, identityId, score); + randomSamplingStorage.addToAllNodesEpochProofPeriodScore(epoch, activeProofPeriodStartBlock, score); + randomSamplingStorage.addToNodeEpochScore(epoch, identityId, score); + randomSamplingStorage.addToAllNodesEpochScore(epoch, score); // Calculate delegators' scores for the previous proof period and store them _calculateAndStoreDelegatorScores(identityId, epoch, activeProofPeriodStartBlock); diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index a66a20a3..cf27188e 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -26,6 +26,10 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, ContractSt mapping(uint72 => mapping(uint256 => mapping(uint256 => uint256))) public nodeEpochProofPeriodScore; // epoch => proofPeriodStartBlock => score mapping(uint256 => mapping(uint256 => uint256)) public allNodesEpochProofPeriodScore; + // identityId => epoch => score + mapping(uint72 => mapping(uint256 => uint256)) public nodeEpochScore; + // epoch => score + mapping(uint256 => uint256) public allNodesEpochScore; // epoch => identityId => delegatorKey => score mapping(uint256 => mapping(uint72 => mapping(bytes32 => uint256))) public epochNodeDelegatorScore; // epoch => identityId => delegatorKey => rewards claimed status @@ -37,6 +41,26 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, ContractSt uint16 newDurationInBlocks, uint256 indexed effectiveEpoch ); + event NodeEpochScoreAdded(uint256 indexed epoch, uint72 indexed identityId, uint256 scoreAdded, uint256 totalScore); + event AllNodesEpochScoreAdded(uint256 indexed epoch, uint256 scoreAdded, uint256 totalScore); + event NodeEpochProofPeriodScoreAdded( + uint256 indexed epoch, + uint256 indexed proofPeriodStartBlock, + uint72 indexed identityId, + uint256 scoreAdded + ); + event AllNodesEpochProofPeriodScoreAdded( + uint256 indexed epoch, + uint256 indexed proofPeriodStartBlock, + uint256 scoreAdded, + uint256 totalScore + ); + event EpochNodeDelegatorScoreAdded( + uint256 indexed epoch, + uint72 indexed identityId, + bytes32 indexed delegatorKey, + uint256 scoreAdded + ); constructor(address hubAddress, uint16 _proofingPeriodDurationInBlocks) ContractStatus(hubAddress) { require(_proofingPeriodDurationInBlocks > 0, "Proofing period duration in blocks must be greater than 0"); @@ -196,14 +220,38 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, ContractSt return epochNodeValidProofsCount[epoch][identityId]; } - function addToNodeScore( + function addToNodeEpochScore(uint256 epoch, uint72 identityId, uint256 score) external onlyContracts { + nodeEpochScore[identityId][epoch] += score; + emit NodeEpochScoreAdded(epoch, identityId, score, nodeEpochScore[identityId][epoch]); + } + + function addToAllNodesEpochScore(uint256 epoch, uint256 score) external onlyContracts { + allNodesEpochScore[epoch] += score; + emit AllNodesEpochScoreAdded(epoch, score, allNodesEpochScore[epoch]); + } + + function addToNodeEpochProofPeriodScore( uint256 epoch, uint256 proofPeriodStartBlock, uint72 identityId, uint256 score ) external onlyContracts { nodeEpochProofPeriodScore[identityId][epoch][proofPeriodStartBlock] += score; + emit NodeEpochProofPeriodScoreAdded(epoch, proofPeriodStartBlock, identityId, score); + } + + function addToAllNodesEpochProofPeriodScore( + uint256 epoch, + uint256 proofPeriodStartBlock, + uint256 score + ) external onlyContracts { allNodesEpochProofPeriodScore[epoch][proofPeriodStartBlock] += score; + emit AllNodesEpochProofPeriodScoreAdded( + epoch, + proofPeriodStartBlock, + score, + allNodesEpochProofPeriodScore[epoch][proofPeriodStartBlock] + ); } function getEpochNodeDelegatorScore( @@ -221,6 +269,7 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, ContractSt uint256 score ) external onlyContracts { epochNodeDelegatorScore[epoch][identityId][delegatorKey] += score; + emit EpochNodeDelegatorScoreAdded(epoch, identityId, delegatorKey, score); } // --- Rewards Claimed Status --- From 3567dd536a9a4757c2e6751d320eb0fbbb255fc4 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 22 May 2025 11:10:05 +0200 Subject: [PATCH 099/106] new deployments --- deployments/base_sepolia_test_contracts.json | 18 +++++++-------- deployments/gnosis_chiado_test_contracts.json | 18 +++++++-------- deployments/neuroweb_testnet_contracts.json | 22 +++++++++---------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/deployments/base_sepolia_test_contracts.json b/deployments/base_sepolia_test_contracts.json index 15706348..7ea43cb4 100644 --- a/deployments/base_sepolia_test_contracts.json +++ b/deployments/base_sepolia_test_contracts.json @@ -272,21 +272,21 @@ "deployed": true }, "RandomSamplingStorage": { - "evmAddress": "0x56a20e30420E84dD247e2F3Bc0dF35BBEf611cA2", + "evmAddress": "0x0D584FcDb002eE49BECF7FBaBA2231D60f59e91c", "version": "1.0.0", - "gitBranch": "release/v8.0.12-testnet", - "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", - "deploymentBlock": 25118992, - "deploymentTimestamp": 1746006275989, + "gitBranch": "feature/random-sampling", + "gitCommitHash": "01b72351e11a9b45bc82e5a9bea8fe3e9a08610e", + "deploymentBlock": 26068339, + "deploymentTimestamp": 1747904971025, "deployed": true }, "RandomSampling": { - "evmAddress": "0xE0630dbAB710A03BCb35a58c1A5AD76B846beA0B", + "evmAddress": "0x12646a90358Cc55d1Eec825a7abEfF59cF2EF6eC", "version": "1.0.0", "gitBranch": "feature/random-sampling", - "gitCommitHash": "27d0c760b3ff597709d3f60865b83c9c2292d247", - "deploymentBlock": 25464358, - "deploymentTimestamp": 1746697007978, + "gitCommitHash": "01b72351e11a9b45bc82e5a9bea8fe3e9a08610e", + "deploymentBlock": 26068342, + "deploymentTimestamp": 1747904977148, "deployed": true } } diff --git a/deployments/gnosis_chiado_test_contracts.json b/deployments/gnosis_chiado_test_contracts.json index 6a5bde4a..14913e77 100644 --- a/deployments/gnosis_chiado_test_contracts.json +++ b/deployments/gnosis_chiado_test_contracts.json @@ -272,21 +272,21 @@ "deployed": true }, "RandomSamplingStorage": { - "evmAddress": "0x0aDa7817F6f99E3110bc0bFb2944A0f5e91FF359", + "evmAddress": "0x617F50b951f9CD0bD5C40D4666b47FD70E4142Fc", "version": "1.0.0", - "gitBranch": "release/v8.0.12-testnet", - "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", - "deploymentBlock": 15529899, - "deploymentTimestamp": 1746006388957, + "gitBranch": "feature/random-sampling", + "gitCommitHash": "01b72351e11a9b45bc82e5a9bea8fe3e9a08610e", + "deploymentBlock": 15883810, + "deploymentTimestamp": 1747904828069, "deployed": true }, "RandomSampling": { - "evmAddress": "0xE0630dbAB710A03BCb35a58c1A5AD76B846beA0B", + "evmAddress": "0x40A822a830Fc3a63C8F042A10F5346C46C05BC7d", "version": "1.0.0", "gitBranch": "feature/random-sampling", - "gitCommitHash": "27d0c760b3ff597709d3f60865b83c9c2292d247", - "deploymentBlock": 15658602, - "deploymentTimestamp": 1746697129077, + "gitCommitHash": "01b72351e11a9b45bc82e5a9bea8fe3e9a08610e", + "deploymentBlock": 15883812, + "deploymentTimestamp": 1747904836838, "deployed": true } } diff --git a/deployments/neuroweb_testnet_contracts.json b/deployments/neuroweb_testnet_contracts.json index 6a9c3904..12857d09 100644 --- a/deployments/neuroweb_testnet_contracts.json +++ b/deployments/neuroweb_testnet_contracts.json @@ -302,23 +302,23 @@ "deployed": true }, "RandomSamplingStorage": { - "evmAddress": "0x12646a90358Cc55d1Eec825a7abEfF59cF2EF6eC", - "substrateAddress": "5EMjsczPrssjMnmPEtKEZ3z8NEUqE5phC64vmvJyGX9VCQAC", + "evmAddress": "0xA6493CCD71b507313CA1f6Db6c5871a7D6a47939", + "substrateAddress": "5EMjsczuVeRxMXn747JZC8DQfExE9BNEUbm4hwqcW5RXqszh", "version": "1.0.0", - "gitBranch": "release/v8.0.12-testnet", - "gitCommitHash": "cc6a4f6784f7d47f54357b0d639de86af694bdf7", - "deploymentBlock": 7346685, - "deploymentTimestamp": 1746006490032, + "gitBranch": "feature/random-sampling", + "gitCommitHash": "01b72351e11a9b45bc82e5a9bea8fe3e9a08610e", + "deploymentBlock": 7623612, + "deploymentTimestamp": 1747904902586, "deployed": true }, "RandomSampling": { - "evmAddress": "0xb7a36895808d90E4A8B9a4996C5cC76c9e129DA3", - "substrateAddress": "5EMjsczxyJnZBr2koPcG45U6udBCdBxJa5f8ovmv9Ua9jC1q", + "evmAddress": "0x2229f9872eE1906FCFD59c5998F6ac12a03011Ae", + "substrateAddress": "5EMjsczT2AshaEJs92ZkmsoqeoLhrwC2zVq1A4PMCL7g1czn", "version": "1.0.0", "gitBranch": "feature/random-sampling", - "gitCommitHash": "27d0c760b3ff597709d3f60865b83c9c2292d247", - "deploymentBlock": 7448501, - "deploymentTimestamp": 1746697150169, + "gitCommitHash": "01b72351e11a9b45bc82e5a9bea8fe3e9a08610e", + "deploymentBlock": 7623613, + "deploymentTimestamp": 1747904907729, "deployed": true } } From bbdcffb934200c56febea774a7033392e3091f99 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 22 May 2025 13:28:31 +0200 Subject: [PATCH 100/106] Adapt scoring logic --- contracts/RandomSampling.sol | 56 ++++++++------------- contracts/storage/RandomSamplingStorage.sol | 19 ++++++- 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index a8830031..60d8fc74 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -187,7 +187,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { randomSamplingStorage.addToAllNodesEpochScore(epoch, score); // Calculate delegators' scores for the previous proof period and store them - _calculateAndStoreDelegatorScores(identityId, epoch, activeProofPeriodStartBlock); + _calculateAndStoreDelegatorScores(identityId, epoch, score); emit ValidProofSubmitted(identityId, epoch, score); } else { @@ -200,26 +200,30 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { uint256 epoch, address delegator ) public view returns (uint256) { - uint256 epochNodeValidProofsCount = randomSamplingStorage.getEpochNodeValidProofsCount(epoch, identityId); - - uint256 proofingPeriodDurationInBlocks = randomSamplingStorage.getEpochProofingPeriodDurationInBlocks(epoch); - - uint256 maxNodeProofsInEpoch = chronos.epochLength() / (proofingPeriodDurationInBlocks * avgBlockTimeInSeconds); - - uint256 allExpectedEpochProofsCount = shardingTableStorage.nodesCount() * maxNodeProofsInEpoch; - require(allExpectedEpochProofsCount > 0, "All expected epoch proofs count must be greater than 0"); - + // // First part of the formula - W1 * (node valid proofs count / all expected epoch proofs count) + // uint256 epochNodeValidProofsCount = randomSamplingStorage.getEpochNodeValidProofsCount(epoch, identityId); + // uint256 proofingPeriodDurationInBlocks = randomSamplingStorage.getEpochProofingPeriodDurationInBlocks(epoch); + // uint256 maxNodeProofsInEpoch = chronos.epochLength() / (proofingPeriodDurationInBlocks * avgBlockTimeInSeconds); + // uint256 allExpectedEpochProofsCount = shardingTableStorage.nodesCount() * maxNodeProofsInEpoch; + // require(allExpectedEpochProofsCount > 0, "All expected epoch proofs count must be greater than 0"); + // proofsRatio = (epochNodeValidProofsCount * SCALING_FACTOR) / allExpectedEpochProofsCount; + uint256 proofsRatio = 0; + + // Second part of the formula - W2 * (delegator score / all nodes scores) bytes32 delegatorKey = keccak256(abi.encodePacked(delegator)); uint256 epochNodeDelegatorScore = randomSamplingStorage.getEpochNodeDelegatorScore( epoch, identityId, delegatorKey ); + uint256 allNodesEpochScore = randomSamplingStorage.getAllNodesEpochScore(epoch); + uint256 scoreRatio = (epochNodeDelegatorScore * SCALING_FACTOR) / allNodesEpochScore; + + // Reward calculation uint256 totalEpochTracFees = epochStorage.getEpochPool(1, epoch); + // SCALING_FACTOR ** 2 because we multiplied by SCALING_FACTOR once in the delegator score calculation and once in scoreRatio + uint256 reward = ((totalEpochTracFees / 2) * (w1 * proofsRatio + w2 * scoreRatio)) / SCALING_FACTOR ** 2; - uint256 reward = ((totalEpochTracFees / 2) * - (w1 * (epochNodeValidProofsCount / allExpectedEpochProofsCount) + w2 * epochNodeDelegatorScore)) / - SCALING_FACTOR ** 2; return reward; } @@ -382,36 +386,16 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { return nodeStakeFactor + nodePublishingFactor + nodeAskFactor; } - function _calculateAndStoreDelegatorScores( - uint72 identityId, - uint256 epoch, - uint256 activeProofPeriodStartBlock - ) private { - uint256 lastProofPeriodStartBlock = randomSamplingStorage.getHistoricalProofPeriodStartBlock( - activeProofPeriodStartBlock, - 1 - ); - uint256 nodeScore = randomSamplingStorage.getNodeEpochProofPeriodScore( - identityId, - epoch, - lastProofPeriodStartBlock - ); + function _calculateAndStoreDelegatorScores(uint72 identityId, uint256 epoch, uint256 nodeScore) private { uint256 nodeStake = stakingStorage.getNodeStake(identityId); - if (nodeScore > 0 && nodeStake > 0) { - uint256 allNodesScore = randomSamplingStorage.getEpochAllNodesProofPeriodScore( - epoch, - lastProofPeriodStartBlock - ); - uint256 lastProofPeriodScoreRatio = (nodeScore * SCALING_FACTOR) / allNodesScore; - // update all delegators' scores address[] memory delegatorsAddresses = delegatorsInfo.getDelegators(identityId); for (uint8 i = 0; i < delegatorsAddresses.length; ) { bytes32 delegatorKey = keccak256(abi.encodePacked(delegatorsAddresses[i])); uint256 delegatorStake = stakingStorage.getDelegatorTotalStake(identityId, delegatorKey); - // Need to divide by SCALING_FACTOR^2 to get the correct score - uint256 delegatorScore = (lastProofPeriodScoreRatio * delegatorStake * SCALING_FACTOR) / nodeStake; + // Need to divide by SCALING_FACTOR to get the correct score + uint256 delegatorScore = nodeScore * ((delegatorStake * SCALING_FACTOR) / nodeStake); randomSamplingStorage.addToEpochNodeDelegatorScore(epoch, identityId, delegatorKey, delegatorScore); unchecked { diff --git a/contracts/storage/RandomSamplingStorage.sol b/contracts/storage/RandomSamplingStorage.sol index cf27188e..de9d466a 100644 --- a/contracts/storage/RandomSamplingStorage.sol +++ b/contracts/storage/RandomSamplingStorage.sol @@ -59,7 +59,8 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, ContractSt uint256 indexed epoch, uint72 indexed identityId, bytes32 indexed delegatorKey, - uint256 scoreAdded + uint256 scoreAdded, + uint256 totalScore ); constructor(address hubAddress, uint16 _proofingPeriodDurationInBlocks) ContractStatus(hubAddress) { @@ -225,11 +226,19 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, ContractSt emit NodeEpochScoreAdded(epoch, identityId, score, nodeEpochScore[identityId][epoch]); } + function getNodeEpochScore(uint256 epoch, uint72 identityId) external view returns (uint256) { + return nodeEpochScore[identityId][epoch]; + } + function addToAllNodesEpochScore(uint256 epoch, uint256 score) external onlyContracts { allNodesEpochScore[epoch] += score; emit AllNodesEpochScoreAdded(epoch, score, allNodesEpochScore[epoch]); } + function getAllNodesEpochScore(uint256 epoch) external view returns (uint256) { + return allNodesEpochScore[epoch]; + } + function addToNodeEpochProofPeriodScore( uint256 epoch, uint256 proofPeriodStartBlock, @@ -269,7 +278,13 @@ contract RandomSamplingStorage is INamed, IVersioned, IInitializable, ContractSt uint256 score ) external onlyContracts { epochNodeDelegatorScore[epoch][identityId][delegatorKey] += score; - emit EpochNodeDelegatorScoreAdded(epoch, identityId, delegatorKey, score); + emit EpochNodeDelegatorScoreAdded( + epoch, + identityId, + delegatorKey, + score, + epochNodeDelegatorScore[epoch][identityId][delegatorKey] + ); } // --- Rewards Claimed Status --- From 29b91ce9f24b877bc7c1e810449dadb5f09473a3 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Thu, 22 May 2025 15:41:19 +0200 Subject: [PATCH 101/106] Add allNodesEpochScore > 0 require to getDelegatorEpochRewardsAmount --- abi/RandomSamplingStorage.json | 49 +++++++++++++++++++++++++ contracts/RandomSampling.sol | 4 ++ test/integration/RandomSampling.test.ts | 18 +++++++++ 3 files changed, 71 insertions(+) diff --git a/abi/RandomSamplingStorage.json b/abi/RandomSamplingStorage.json index dd24b6dc..e3cfec76 100644 --- a/abi/RandomSamplingStorage.json +++ b/abi/RandomSamplingStorage.json @@ -113,6 +113,12 @@ "internalType": "uint256", "name": "scoreAdded", "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "totalScore", + "type": "uint256" } ], "name": "EpochNodeDelegatorScoreAdded", @@ -551,6 +557,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + } + ], + "name": "getAllNodesEpochScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -785,6 +810,30 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "epoch", + "type": "uint256" + }, + { + "internalType": "uint72", + "name": "identityId", + "type": "uint72" + } + ], + "name": "getNodeEpochScore", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "hub", diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 60d8fc74..ccb300a6 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -217,6 +217,10 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { delegatorKey ); uint256 allNodesEpochScore = randomSamplingStorage.getAllNodesEpochScore(epoch); + require( + allNodesEpochScore > 0, + "None of the nodes have any score for the given epoch. Cannot calculate rewards." + ); uint256 scoreRatio = (epochNodeDelegatorScore * SCALING_FACTOR) / allNodesEpochScore; // Reward calculation diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index 2cd5322d..c9a7169d 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -2214,4 +2214,22 @@ describe('@integration RandomSampling', () => { ).to.be.revertedWith('Delegator has no score for the given epoch'); }); }); + + describe('Delegator rewards', () => { + it('Should revert if allNodesEpochScore is 0 for the given epoch', async () => { + const testIdentityId = 1; + const testEpoch = 1; + const testDelegator = accounts[1].address; + + await expect( + RandomSampling.getDelegatorEpochRewardsAmount( + testIdentityId, + testEpoch, + testDelegator, + ), + ).to.be.revertedWith( + 'None of the nodes have any score for the given epoch. Cannot calculate rewards.', + ); + }); + }); }); From 5f8e536c4072c0b09b1c41bba0c4d6e25dffcfca Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 3 Jun 2025 12:21:17 +0200 Subject: [PATCH 102/106] Improved active KC search algorithm --- contracts/RandomSampling.sol | 84 ++++- test/integration/RandomSampling.test.ts | 446 ++++++++++++++++++++++++ 2 files changed, 513 insertions(+), 17 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index ccb300a6..fa305fa7 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -308,24 +308,20 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { if (knowledgeCollectionsCount == 0) { revert("No knowledge collections exist"); } - uint256 knowledgeCollectionId = 0; - uint256 currentEpoch = chronos.getCurrentEpoch(); - for (uint8 i = 0; i < 50; ) { - knowledgeCollectionId = (uint256(pseudoRandomVariable) % knowledgeCollectionsCount) + 1; - - if (currentEpoch <= knowledgeCollectionStorage.getEndEpoch(knowledgeCollectionId)) { - break; - } - if (i == 49) { - revert("Failed to find a knowledge collection that is active in the current epoch"); - } + uint256 currentEpoch = chronos.getCurrentEpoch(); - pseudoRandomVariable = keccak256(abi.encodePacked(pseudoRandomVariable)); + // Optimized binary search approach for finding active knowledge collection + uint256 knowledgeCollectionId = _findActiveKnowledgeCollection( + pseudoRandomVariable, + 1, + knowledgeCollectionsCount, + currentEpoch, + 0 + ); - unchecked { - i++; - } + if (knowledgeCollectionId == 0) { + revert("Failed to find a knowledge collection that is active in the current epoch"); } uint88 chunksCount = knowledgeCollectionStorage.getKnowledgeCollection(knowledgeCollectionId).byteSize / @@ -335,7 +331,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { emit ChallengeCreated( identityId, - chronos.getCurrentEpoch(), + currentEpoch, knowledgeCollectionId, chunkId, activeProofPeriodStartBlock, @@ -347,13 +343,67 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { knowledgeCollectionId, chunkId, address(knowledgeCollectionStorage), - chronos.getCurrentEpoch(), + currentEpoch, activeProofPeriodStartBlock, randomSamplingStorage.getActiveProofingPeriodDurationInBlocks(), false ); } + /** + * @dev Recursive binary search to find an active knowledge collection + * Randomly chooses a collection from current range, then splits if needed + * @param randomSeed Random seed for picking a collection from current range + * @param start Start of the range (inclusive) + * @param end End of the range (inclusive) + * @param currentEpoch Current epoch to check collection activity against + * @param depth Current recursion depth to prevent infinite loops + * @return knowledgeCollectionId ID of an active knowledge collection, or 0 if none found + */ + function _findActiveKnowledgeCollection( + bytes32 randomSeed, + uint256 start, + uint256 end, + uint256 currentEpoch, + uint8 depth + ) internal view returns (uint256) { + if (depth >= 50) { + return 0; // No active collection found + } + + // Pick a random knowledge collection from current range + uint256 randomKcId = start + (uint256(randomSeed) % (end - start + 1)); + + // Check if this random collection is active + if (currentEpoch <= knowledgeCollectionStorage.getEndEpoch(randomKcId)) { + return randomKcId; + } + + // If single element and not active, return 0 + if (start == end) { + return 0; + } + + // Split range in half and search both halves + uint256 mid = start + (end - start) / 2; + bytes32 newRandomSeed = keccak256(abi.encodePacked(randomSeed)); + + // Randomly decide which half to search first + bool searchLeftFirst = uint256(newRandomSeed) % 2 == 0; + + if (searchLeftFirst) { + // Try left half first, then right half if left returns 0 + uint256 result = _findActiveKnowledgeCollection(newRandomSeed, start, mid, currentEpoch, depth + 1); + if (result != 0) return result; + return _findActiveKnowledgeCollection(newRandomSeed, mid + 1, end, currentEpoch, depth + 1); + } else { + // Try right half first, then left half if right returns 0 + uint256 result = _findActiveKnowledgeCollection(newRandomSeed, mid + 1, end, currentEpoch, depth + 1); + if (result != 0) return result; + return _findActiveKnowledgeCollection(newRandomSeed, start, mid, currentEpoch, depth + 1); + } + } + function calculateNodeScore(uint72 identityId) public view returns (uint256) { // 1. Node stake factor calculation // Formula: nodeStakeFactor = 2 * (nodeStake / 2,000,000)^2 diff --git a/test/integration/RandomSampling.test.ts b/test/integration/RandomSampling.test.ts index c9a7169d..a59a6533 100644 --- a/test/integration/RandomSampling.test.ts +++ b/test/integration/RandomSampling.test.ts @@ -2232,4 +2232,450 @@ describe('@integration RandomSampling', () => { ); }); }); + + describe('Optimized Knowledge Collection Search', () => { + let publishingNode: { + operational: SignerWithAddress; + admin: SignerWithAddress; + }; + let publishingNodeIdentityId: number; + let receivingNodes: { + operational: SignerWithAddress; + admin: SignerWithAddress; + }[]; + let receivingNodesIdentityIds: number[]; + let kcCreator: SignerWithAddress; + let deps: { + accounts: SignerWithAddress[]; + Profile: Profile; + Token: Token; + Staking: Staking; + Ask: Ask; + KnowledgeCollection: KnowledgeCollection; + }; + + beforeEach(async () => { + // Setup nodes + kcCreator = getDefaultKCCreator(accounts); + const minStake = await ParametersStorage.minimumStake(); + const nodeAsk = 200000000000000000n; // 0.2 ETH + + deps = { + accounts, + Profile, + Token, + Staking, + Ask, + KnowledgeCollection, + }; + + ({ node: publishingNode, identityId: publishingNodeIdentityId } = + await setupNodeWithStakeAndAsk(1, minStake, nodeAsk, deps)); + + receivingNodes = []; + receivingNodesIdentityIds = []; + for (let i = 0; i < 5; i++) { + const { node, identityId } = await setupNodeWithStakeAndAsk( + i + 10, + minStake, + nodeAsk, + deps, + ); + receivingNodes.push(node); + receivingNodesIdentityIds.push(identityId); + } + }); + + it('Should find active knowledge collections when mix of active and expired collections exist', async () => { + const initialEpoch = await Chronos.getCurrentEpoch(); + + // Create 20 knowledge collections with different expiration epochs + const collections = []; + + // Create 15 collections that expire in epoch 1 (will be expired) + for (let i = 0; i < 15; i++) { + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + `expired-operation-${i}`, + 10, + 1000, + 1, // epochsDuration = 1, so expires after current epoch + duration + 1 + ); + collections.push({ id: i + 1, active: false }); + } + + // Create 5 collections that expire in epoch 10 (will be active) + for (let i = 15; i < 20; i++) { + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + `active-operation-${i}`, + 10, + 1000, + 10, // epochsDuration = 10, so expires after current epoch + duration + 1 + ); + collections.push({ id: i + 1, active: true }); + } + + // Advance to epoch 5 (so first 15 collections are expired, last 5 are active) + const avgBlockTime = await RandomSampling.avgBlockTimeInSeconds(); + for (let epoch = Number(initialEpoch); epoch < 5; epoch++) { + const timeUntilNextEpoch = await Chronos.timeUntilNextEpoch(); + const blocksToMine = + Number(timeUntilNextEpoch / BigInt(avgBlockTime)) + 2; + for (let i = 0; i < blocksToMine; i++) { + await hre.network.provider.send('evm_mine'); + } + } + + const currentEpoch = await Chronos.getCurrentEpoch(); + expect(currentEpoch).to.be.gte(5n, 'Should be in epoch 5 or later'); + + // Verify which collections are active/expired + for (const collection of collections) { + const endEpoch = await KnowledgeCollectionStorage.getEndEpoch( + collection.id, + ); + const isActive = currentEpoch <= endEpoch; + if (collection.active) { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(isActive).to.be.true; + } else { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(isActive).to.be.false; + } + } + + // Create challenge multiple times to verify it finds active collections + const foundCollections = new Set(); + const maxAttempts = 20; // Try multiple times to test randomness and consistency + + for (let attempt = 0; attempt < maxAttempts; attempt++) { + // Move to next proof period to allow new challenge + const duration = + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + for (let i = 0; i < Number(duration); i++) { + await hre.network.provider.send('evm_mine'); + } + + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // Verify the found collection is one of the active ones + expect([16, 17, 18, 19, 20]).to.include( + Number(challenge.knowledgeCollectionId), + ); + foundCollections.add(Number(challenge.knowledgeCollectionId)); + + // Mark challenge as solved to allow next challenge + const solvedChallenge = { + knowledgeCollectionId: challenge.knowledgeCollectionId, + chunkId: challenge.chunkId, + knowledgeCollectionStorageContract: + challenge.knowledgeCollectionStorageContract, + epoch: challenge.epoch, + activeProofPeriodStartBlock: challenge.activeProofPeriodStartBlock, + proofingPeriodDurationInBlocks: + challenge.proofingPeriodDurationInBlocks, + solved: true, + }; + await RandomSamplingStorage.setNodeChallenge( + publishingNodeIdentityId, + solvedChallenge, + ); + } + + // Verify that the algorithm found at least 2 different active collections (shows it's working properly) + expect(foundCollections.size).to.be.gte( + 2, + 'Should find multiple different active collections', + ); + }); + + it('Should revert when all knowledge collections are expired', async () => { + // Create 3 knowledge collections that expire in epoch 1 + for (let i = 0; i < 3; i++) { + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + `expired-operation-${i}`, + 10, + 1000, + 1, // epochsDuration = 1, expires after epoch 1 + ); + } + + // Advance to epoch 5 (all collections expired) + const avgBlockTime = await RandomSampling.avgBlockTimeInSeconds(); + for (let epoch = 1; epoch < 5; epoch++) { + const timeUntilNextEpoch = await Chronos.timeUntilNextEpoch(); + const blocksToMine = + Number(timeUntilNextEpoch / BigInt(avgBlockTime)) + 2; + for (let i = 0; i < blocksToMine; i++) { + await hre.network.provider.send('evm_mine'); + } + } + + // Verify all collections are expired + const currentEpoch = await Chronos.getCurrentEpoch(); + for (let kcId = 1; kcId <= 3; kcId++) { + const endEpoch = await KnowledgeCollectionStorage.getEndEpoch(kcId); + expect(currentEpoch).to.be.gt(endEpoch, `KC ${kcId} should be expired`); + } + + // Attempt to create challenge should revert + await expect( + RandomSampling.connect(publishingNode.operational).createChallenge(), + ).to.be.revertedWith( + 'Failed to find a knowledge collection that is active in the current epoch', + ); + }); + + it('Should work efficiently with single active collection among many expired ones', async () => { + // Create 9 expired collections + for (let i = 0; i < 9; i++) { + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + `expired-operation-${i}`, + 10, + 1000, + 1, // epochsDuration = 1, expires after epoch 1 + ); + } + + // Create 1 active collection (will be KC #10) + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + 'active-operation', + 10, + 1000, + 10, // epochsDuration = 10, active for longer + ); + + // Advance to epoch 4 (first 9 expired, last 1 active) + const avgBlockTime = await RandomSampling.avgBlockTimeInSeconds(); + for (let epoch = 1; epoch < 4; epoch++) { + const timeUntilNextEpoch = await Chronos.timeUntilNextEpoch(); + const blocksToMine = + Number(timeUntilNextEpoch / BigInt(avgBlockTime)) + 2; + for (let i = 0; i < blocksToMine; i++) { + await hre.network.provider.send('evm_mine'); + } + } + + // Verify only the last collection is active + const currentEpoch = await Chronos.getCurrentEpoch(); + for (let kcId = 1; kcId <= 9; kcId++) { + const endEpoch = await KnowledgeCollectionStorage.getEndEpoch(kcId); + expect(currentEpoch).to.be.gt(endEpoch, `KC ${kcId} should be expired`); + } + + const activeKcEndEpoch = await KnowledgeCollectionStorage.getEndEpoch(10); + expect(currentEpoch).to.be.lte( + activeKcEndEpoch, + 'KC 10 should be active', + ); + + // Create challenge should find the active collection + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + expect(challenge.knowledgeCollectionId).to.equal( + 10n, + 'Should find the only active collection', + ); + }); + + it('Should demonstrate randomness by finding different collections over multiple attempts', async () => { + // Create 5 active knowledge collections + for (let i = 0; i < 5; i++) { + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + `active-operation-${i}`, + 10, + 1000, + 10, // All active for 10 epochs + ); + } + + const foundCollections = new Set(); + const maxAttempts = 15; + + for (let attempt = 0; attempt < maxAttempts; attempt++) { + // Move to next proof period + const duration = + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + for (let i = 0; i < Number(duration); i++) { + await hre.network.provider.send('evm_mine'); + } + + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + // All collections should be active + expect(challenge.knowledgeCollectionId).to.be.gte(1n); + expect(challenge.knowledgeCollectionId).to.be.lte(5n); + foundCollections.add(Number(challenge.knowledgeCollectionId)); + + // Mark as solved for next iteration + const solvedChallenge = { + knowledgeCollectionId: challenge.knowledgeCollectionId, + chunkId: challenge.chunkId, + knowledgeCollectionStorageContract: + challenge.knowledgeCollectionStorageContract, + epoch: challenge.epoch, + activeProofPeriodStartBlock: challenge.activeProofPeriodStartBlock, + proofingPeriodDurationInBlocks: + challenge.proofingPeriodDurationInBlocks, + solved: true, + }; + await RandomSamplingStorage.setNodeChallenge( + publishingNodeIdentityId, + solvedChallenge, + ); + } + + // Should find at least 3 different collections (demonstrates randomness) + expect(foundCollections.size).to.be.gte( + 3, + `Should find multiple collections for randomness. Found: ${Array.from(foundCollections)}`, + ); + }); + + it('Should handle edge case with collections at different positions in the range', async () => { + // Create specific pattern: active-expired-active-expired-active + const patterns = [ + { active: true, duration: 10 }, // KC 1: active + { active: false, duration: 1 }, // KC 2: expired + { active: true, duration: 10 }, // KC 3: active + { active: false, duration: 1 }, // KC 4: expired + { active: true, duration: 10 }, // KC 5: active + ]; + + for (let i = 0; i < patterns.length; i++) { + await createKnowledgeCollection( + kcCreator, + publishingNode, + publishingNodeIdentityId, + receivingNodes, + receivingNodesIdentityIds, + deps, + merkleRoot, + `pattern-operation-${i}`, + 10, + 1000, + patterns[i].duration, + ); + } + + // Advance to epoch 4 (expired ones are expired, active ones are active) + const avgBlockTime = await RandomSampling.avgBlockTimeInSeconds(); + for (let epoch = 1; epoch < 4; epoch++) { + const timeUntilNextEpoch = await Chronos.timeUntilNextEpoch(); + const blocksToMine = + Number(timeUntilNextEpoch / BigInt(avgBlockTime)) + 2; + for (let i = 0; i < blocksToMine; i++) { + await hre.network.provider.send('evm_mine'); + } + } + + // Test multiple challenges to ensure it finds active collections (1, 3, 5) + const foundCollections = new Set(); + + for (let attempt = 0; attempt < 10; attempt++) { + const duration = + await RandomSamplingStorage.getActiveProofingPeriodDurationInBlocks(); + for (let i = 0; i < Number(duration); i++) { + await hre.network.provider.send('evm_mine'); + } + + await RandomSampling.connect( + publishingNode.operational, + ).createChallenge(); + const challenge = await RandomSamplingStorage.getNodeChallenge( + publishingNodeIdentityId, + ); + + foundCollections.add(Number(challenge.knowledgeCollectionId)); + + // Should only find active collections (1, 3, 5) + expect([1, 3, 5]).to.include(Number(challenge.knowledgeCollectionId)); + + // Mark as solved for next iteration + const solvedChallenge = { + knowledgeCollectionId: challenge.knowledgeCollectionId, + chunkId: challenge.chunkId, + knowledgeCollectionStorageContract: + challenge.knowledgeCollectionStorageContract, + epoch: challenge.epoch, + activeProofPeriodStartBlock: challenge.activeProofPeriodStartBlock, + proofingPeriodDurationInBlocks: + challenge.proofingPeriodDurationInBlocks, + solved: true, + }; + await RandomSamplingStorage.setNodeChallenge( + publishingNodeIdentityId, + solvedChallenge, + ); + } + + // Should find multiple active collections from the pattern + expect(foundCollections.size).to.be.gte( + 2, + 'Should find multiple active collections from the alternating pattern', + ); + + // Verify it never found expired collections (2, 4) + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(foundCollections.has(2)).to.be.false; + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + expect(foundCollections.has(4)).to.be.false; + }); + }); }); From e6ad2f49c1d1a631bf87038496c75782071b847e Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Tue, 3 Jun 2025 14:50:59 +0200 Subject: [PATCH 103/106] update deployments --- deployments/base_sepolia_test_contracts.json | 8 ++++---- deployments/gnosis_chiado_test_contracts.json | 8 ++++---- deployments/neuroweb_testnet_contracts.json | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/deployments/base_sepolia_test_contracts.json b/deployments/base_sepolia_test_contracts.json index 7ea43cb4..41228509 100644 --- a/deployments/base_sepolia_test_contracts.json +++ b/deployments/base_sepolia_test_contracts.json @@ -281,12 +281,12 @@ "deployed": true }, "RandomSampling": { - "evmAddress": "0x12646a90358Cc55d1Eec825a7abEfF59cF2EF6eC", + "evmAddress": "0xa61AEA9F1fF55E5C3aAC628922630173f03EF309", "version": "1.0.0", "gitBranch": "feature/random-sampling", - "gitCommitHash": "01b72351e11a9b45bc82e5a9bea8fe3e9a08610e", - "deploymentBlock": 26068342, - "deploymentTimestamp": 1747904977148, + "gitCommitHash": "e4498ccec17e099d2570e2bd5c616ba9ab517b13", + "deploymentBlock": 26592526, + "deploymentTimestamp": 1748953343730, "deployed": true } } diff --git a/deployments/gnosis_chiado_test_contracts.json b/deployments/gnosis_chiado_test_contracts.json index 14913e77..398c4078 100644 --- a/deployments/gnosis_chiado_test_contracts.json +++ b/deployments/gnosis_chiado_test_contracts.json @@ -281,12 +281,12 @@ "deployed": true }, "RandomSampling": { - "evmAddress": "0x40A822a830Fc3a63C8F042A10F5346C46C05BC7d", + "evmAddress": "0x12646a90358Cc55d1Eec825a7abEfF59cF2EF6eC", "version": "1.0.0", "gitBranch": "feature/random-sampling", - "gitCommitHash": "01b72351e11a9b45bc82e5a9bea8fe3e9a08610e", - "deploymentBlock": 15883812, - "deploymentTimestamp": 1747904836838, + "gitCommitHash": "e4498ccec17e099d2570e2bd5c616ba9ab517b13", + "deploymentBlock": 16079152, + "deploymentTimestamp": 1748952882202, "deployed": true } } diff --git a/deployments/neuroweb_testnet_contracts.json b/deployments/neuroweb_testnet_contracts.json index 12857d09..eefdb486 100644 --- a/deployments/neuroweb_testnet_contracts.json +++ b/deployments/neuroweb_testnet_contracts.json @@ -312,13 +312,13 @@ "deployed": true }, "RandomSampling": { - "evmAddress": "0x2229f9872eE1906FCFD59c5998F6ac12a03011Ae", - "substrateAddress": "5EMjsczT2AshaEJs92ZkmsoqeoLhrwC2zVq1A4PMCL7g1czn", + "evmAddress": "0xeBc4766278a8fAfAa930e309BC7523a0e71aC138", + "substrateAddress": "5EMjsd19R8fqFoL68QBbHmzYWooUkFePatpYdxDWZPkDdkU1", "version": "1.0.0", "gitBranch": "feature/random-sampling", - "gitCommitHash": "01b72351e11a9b45bc82e5a9bea8fe3e9a08610e", - "deploymentBlock": 7623613, - "deploymentTimestamp": 1747904907729, + "gitCommitHash": "e4498ccec17e099d2570e2bd5c616ba9ab517b13", + "deploymentBlock": 7779782, + "deploymentTimestamp": 1748953261450, "deployed": true } } From d77e4a55a181b09d3c219b70528887a608b50fe8 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 4 Jun 2025 12:23:21 +0200 Subject: [PATCH 104/106] change recursion for iterative bfs --- contracts/RandomSampling.sol | 89 ++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 35 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index fa305fa7..8eca5642 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -316,8 +316,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { pseudoRandomVariable, 1, knowledgeCollectionsCount, - currentEpoch, - 0 + currentEpoch ); if (knowledgeCollectionId == 0) { @@ -351,57 +350,77 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { } /** - * @dev Recursive binary search to find an active knowledge collection - * Randomly chooses a collection from current range, then splits if needed + * @dev Iterative binary search to find an active knowledge collection + * Uses queue-like BFS approach to systematically search ranges while maintaining randomness * @param randomSeed Random seed for picking a collection from current range * @param start Start of the range (inclusive) * @param end End of the range (inclusive) * @param currentEpoch Current epoch to check collection activity against - * @param depth Current recursion depth to prevent infinite loops * @return knowledgeCollectionId ID of an active knowledge collection, or 0 if none found */ function _findActiveKnowledgeCollection( bytes32 randomSeed, uint256 start, uint256 end, - uint256 currentEpoch, - uint8 depth + uint256 currentEpoch ) internal view returns (uint256) { - if (depth >= 50) { - return 0; // No active collection found - } + // Queue using fixed array - [start1, end1, start2, end2, ...] + uint256[100] memory queue; // Can hold 50 ranges max + uint8 queueStart = 0; // Front of queue + uint8 queueEnd = 0; // Back of queue - // Pick a random knowledge collection from current range - uint256 randomKcId = start + (uint256(randomSeed) % (end - start + 1)); + // Push initial range + queue[queueEnd++] = start; + queue[queueEnd++] = end; - // Check if this random collection is active - if (currentEpoch <= knowledgeCollectionStorage.getEndEpoch(randomKcId)) { - return randomKcId; - } + bytes32 currentRandom = randomSeed; + uint8 iterations = 0; - // If single element and not active, return 0 - if (start == end) { - return 0; - } + while (queueStart < queueEnd && iterations < 50) { + // Pop range from front of queue (BFS behavior) + uint256 currentStart = queue[queueStart++]; + uint256 currentEnd = queue[queueStart++]; - // Split range in half and search both halves - uint256 mid = start + (end - start) / 2; - bytes32 newRandomSeed = keccak256(abi.encodePacked(randomSeed)); + // Pick random collection from current range + uint256 randomKcId = currentStart + (uint256(currentRandom) % (currentEnd - currentStart + 1)); - // Randomly decide which half to search first - bool searchLeftFirst = uint256(newRandomSeed) % 2 == 0; + // Check if this collection is active + if (currentEpoch <= knowledgeCollectionStorage.getEndEpoch(randomKcId)) { + return randomKcId; + } - if (searchLeftFirst) { - // Try left half first, then right half if left returns 0 - uint256 result = _findActiveKnowledgeCollection(newRandomSeed, start, mid, currentEpoch, depth + 1); - if (result != 0) return result; - return _findActiveKnowledgeCollection(newRandomSeed, mid + 1, end, currentEpoch, depth + 1); - } else { - // Try right half first, then left half if right returns 0 - uint256 result = _findActiveKnowledgeCollection(newRandomSeed, mid + 1, end, currentEpoch, depth + 1); - if (result != 0) return result; - return _findActiveKnowledgeCollection(newRandomSeed, start, mid, currentEpoch, depth + 1); + // If single element and not active, continue to next range + if (currentStart == currentEnd) { + currentRandom = keccak256(abi.encodePacked(currentRandom)); + unchecked { + iterations++; + } + continue; + } + + // Split range and push both halves to back of queue (BFS order) + uint256 mid = currentStart + (currentEnd - currentStart) / 2; + + if (queueEnd < 96) { + // Leave room for both ranges + // Always push left half first, then right half (consistent BFS) + if (currentStart <= mid) { + queue[queueEnd++] = currentStart; + queue[queueEnd++] = mid; + } + if (mid + 1 <= currentEnd) { + queue[queueEnd++] = mid + 1; + queue[queueEnd++] = currentEnd; + } + } + + currentRandom = keccak256(abi.encodePacked(currentRandom)); + unchecked { + iterations++; + } } + + return 0; // No active collection found } function calculateNodeScore(uint72 identityId) public view returns (uint256) { From e1cc9252055244043e782c50d7f6634d2d644a6c Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 4 Jun 2025 13:56:01 +0200 Subject: [PATCH 105/106] update comments --- contracts/RandomSampling.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/RandomSampling.sol b/contracts/RandomSampling.sol index 8eca5642..e9faa303 100644 --- a/contracts/RandomSampling.sol +++ b/contracts/RandomSampling.sol @@ -350,8 +350,7 @@ contract RandomSampling is INamed, IVersioned, ContractStatus, IInitializable { } /** - * @dev Iterative binary search to find an active knowledge collection - * Uses queue-like BFS approach to systematically search ranges while maintaining randomness + * @dev BFS approach to finding an active knowledge collection * @param randomSeed Random seed for picking a collection from current range * @param start Start of the range (inclusive) * @param end End of the range (inclusive) From 23bb36c0713d06edb2a6064f88dc77d599514b26 Mon Sep 17 00:00:00 2001 From: Zvonimir Date: Wed, 4 Jun 2025 14:08:10 +0200 Subject: [PATCH 106/106] new deployments --- deployments/base_sepolia_test_contracts.json | 8 ++++---- deployments/gnosis_chiado_test_contracts.json | 8 ++++---- deployments/neuroweb_testnet_contracts.json | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/deployments/base_sepolia_test_contracts.json b/deployments/base_sepolia_test_contracts.json index 41228509..a60ea43f 100644 --- a/deployments/base_sepolia_test_contracts.json +++ b/deployments/base_sepolia_test_contracts.json @@ -281,12 +281,12 @@ "deployed": true }, "RandomSampling": { - "evmAddress": "0xa61AEA9F1fF55E5C3aAC628922630173f03EF309", + "evmAddress": "0x500E2d8d57Bf3DaAEC7deAa6E4355A8Dc21d79b0", "version": "1.0.0", "gitBranch": "feature/random-sampling", - "gitCommitHash": "e4498ccec17e099d2570e2bd5c616ba9ab517b13", - "deploymentBlock": 26592526, - "deploymentTimestamp": 1748953343730, + "gitCommitHash": "18c4b1845b5a0a0db1a1f288e49b89dbbb6317cc", + "deploymentBlock": 26635231, + "deploymentTimestamp": 1749038754720, "deployed": true } } diff --git a/deployments/gnosis_chiado_test_contracts.json b/deployments/gnosis_chiado_test_contracts.json index 398c4078..7cb249c4 100644 --- a/deployments/gnosis_chiado_test_contracts.json +++ b/deployments/gnosis_chiado_test_contracts.json @@ -281,12 +281,12 @@ "deployed": true }, "RandomSampling": { - "evmAddress": "0x12646a90358Cc55d1Eec825a7abEfF59cF2EF6eC", + "evmAddress": "0xa61AEA9F1fF55E5C3aAC628922630173f03EF309", "version": "1.0.0", "gitBranch": "feature/random-sampling", - "gitCommitHash": "e4498ccec17e099d2570e2bd5c616ba9ab517b13", - "deploymentBlock": 16079152, - "deploymentTimestamp": 1748952882202, + "gitCommitHash": "18c4b1845b5a0a0db1a1f288e49b89dbbb6317cc", + "deploymentBlock": 16095153, + "deploymentTimestamp": 1749038800888, "deployed": true } } diff --git a/deployments/neuroweb_testnet_contracts.json b/deployments/neuroweb_testnet_contracts.json index eefdb486..dd8108e5 100644 --- a/deployments/neuroweb_testnet_contracts.json +++ b/deployments/neuroweb_testnet_contracts.json @@ -312,13 +312,13 @@ "deployed": true }, "RandomSampling": { - "evmAddress": "0xeBc4766278a8fAfAa930e309BC7523a0e71aC138", - "substrateAddress": "5EMjsd19R8fqFoL68QBbHmzYWooUkFePatpYdxDWZPkDdkU1", + "evmAddress": "0xEd5035e928e123700baf7698C8FE3e78Dbd5E8eA", + "substrateAddress": "5EMjsd19j6gjHen86EgGwDrx8ff9NqmDzhLJiSX8Fv1MLrn3", "version": "1.0.0", "gitBranch": "feature/random-sampling", - "gitCommitHash": "e4498ccec17e099d2570e2bd5c616ba9ab517b13", - "deploymentBlock": 7779782, - "deploymentTimestamp": 1748953261450, + "gitCommitHash": "18c4b1845b5a0a0db1a1f288e49b89dbbb6317cc", + "deploymentBlock": 7793042, + "deploymentTimestamp": 1749038833389, "deployed": true } }